https://git.reactos.org/?p=reactos.git;a=commitdiff;h=66f35ef8c98e032a309568...
commit 66f35ef8c98e032a30956814f5278446e6a8d4ee Author: Amine Khaldi amine.khaldi@reactos.org AuthorDate: Tue Mar 20 12:38:58 2018 +0100 Commit: Amine Khaldi amine.khaldi@reactos.org CommitDate: Tue Mar 20 12:38:58 2018 +0100
[OLE32_WINETEST] Sync with Wine Staging 3.3. CORE-14434 --- modules/rostests/winetests/ole32/clipboard.c | 14 +- modules/rostests/winetests/ole32/compobj.c | 232 +++++++++++++++++++- modules/rostests/winetests/ole32/defaulthandler.c | 12 +- modules/rostests/winetests/ole32/dragdrop.c | 14 +- modules/rostests/winetests/ole32/errorinfo.c | 11 +- modules/rostests/winetests/ole32/hglobalstream.c | 252 +++++++++++++++++++++- modules/rostests/winetests/ole32/marshal.c | 19 +- modules/rostests/winetests/ole32/moniker.c | 20 +- modules/rostests/winetests/ole32/ole2.c | 77 ++++++- modules/rostests/winetests/ole32/ole_server.c | 10 +- modules/rostests/winetests/ole32/precomp.h | 1 + modules/rostests/winetests/ole32/propvariant.c | 6 +- modules/rostests/winetests/ole32/stg_prop.c | 7 +- modules/rostests/winetests/ole32/storage32.c | 15 +- modules/rostests/winetests/ole32/usrmarshal.c | 11 +- 15 files changed, 652 insertions(+), 49 deletions(-)
diff --git a/modules/rostests/winetests/ole32/clipboard.c b/modules/rostests/winetests/ole32/clipboard.c index 64fafaf1f2..002312d448 100644 --- a/modules/rostests/winetests/ole32/clipboard.c +++ b/modules/rostests/winetests/ole32/clipboard.c @@ -18,8 +18,20 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
+#define COBJMACROS +#define CONST_VTABLE +#ifndef __REACTOS__ +#define NONAMELESSUNION +#endif
-#include "precomp.h" +#include <stdarg.h> +#include <stdio.h> + +#include "windef.h" +#include "winbase.h" +#include "objbase.h" + +#include "wine/test.h"
#define InitFormatEtc(fe, cf, med) \ {\ diff --git a/modules/rostests/winetests/ole32/compobj.c b/modules/rostests/winetests/ole32/compobj.c index eeb4686f15..06d1914240 100644 --- a/modules/rostests/winetests/ole32/compobj.c +++ b/modules/rostests/winetests/ole32/compobj.c @@ -18,13 +18,31 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" +#define COBJMACROS +#define CONST_VTABLE
-#include <dde.h> -#include <ctxtcall.h> -#include <initguid.h> +#include <stdarg.h> +#include <stdio.h> + +#include "windef.h" +#include "winbase.h" +#define USE_COM_CONTEXT_DEF +#ifndef __REACTOS__ +#include "initguid.h" +#endif +#include "objbase.h" +#include "shlguid.h" +#include "urlmon.h" /* for CLSID_FileProtocol */ +#include "dde.h" +#include "cguid.h"
-extern const IID GUID_NULL; +#include "ctxtcall.h" + +#include "wine/test.h" + +#ifdef __REACTOS__ +#include <initguid.h> +#endif
#define DEFINE_EXPECT(func) \ static BOOL expect_ ## func = FALSE, called_ ## func = FALSE @@ -926,6 +944,7 @@ static DWORD WINAPI MessageFilter_MessagePending( DWORD dwPendingType) { trace("MessagePending\n"); + todo_wine ok(0, "unexpected call\n"); return PENDINGMSG_WAITNOPROCESS; }
@@ -2620,6 +2639,15 @@ static DWORD CALLBACK send_message_thread(LPVOID arg) return 0; }
+static DWORD CALLBACK send_and_post_user_message_thread(void *arg) +{ + HWND hwnd = arg; + Sleep(30); + SendMessageA(hwnd, WM_USER, 0, 0); + PostMessageA(hwnd, WM_USER, 0, 0); + return 0; +} + static DWORD CALLBACK post_message_thread(LPVOID arg) { HWND hWnd = arg; @@ -2629,14 +2657,103 @@ static DWORD CALLBACK post_message_thread(LPVOID arg) }
static const char cls_name[] = "cowait_test_class"; + +static UINT cowait_msgs[100], cowait_msgs_first, cowait_msgs_last; + +static void cowait_msgs_reset(void) +{ + cowait_msgs_first = cowait_msgs_last = 0; +} + +#define cowait_msgs_expect_empty() _cowait_msgs_expect_empty(__LINE__) +static void _cowait_msgs_expect_empty(unsigned line) +{ + while(cowait_msgs_first < cowait_msgs_last) { + ok_(__FILE__,line)(0, "unexpected message %u\n", cowait_msgs[cowait_msgs_first]); + cowait_msgs_first++; + } + cowait_msgs_reset(); +} + +#define cowait_msgs_expect_notified(a) _cowait_msgs_expect_notified(__LINE__,a) +static void _cowait_msgs_expect_notified(unsigned line, UINT expected_msg) +{ + if(cowait_msgs_first == cowait_msgs_last) { + ok_(__FILE__,line)(0, "expected message %u, received none\n", expected_msg); + }else { + ok_(__FILE__,line)(cowait_msgs[cowait_msgs_first] == expected_msg, + "expected message %u, received %u \n", + expected_msg, cowait_msgs[cowait_msgs_first]); + cowait_msgs_first++; + } +} + +#define cowait_msgs_expect_queued(a,b) _cowait_msgs_expect_queued(__LINE__,a,b) +static void _cowait_msgs_expect_queued(unsigned line, HWND hwnd, UINT expected_msg) +{ + MSG msg; + BOOL success; + + success = PeekMessageA(&msg, hwnd, expected_msg, expected_msg, PM_REMOVE); + ok_(__FILE__,line)(success, "PeekMessageA failed: %u\n", GetLastError()); + if(success) + ok_(__FILE__,line)(msg.message == expected_msg, "unexpected message %u, expected %u\n", + msg.message, expected_msg); +} + +static void flush_messages(void) +{ + MSG msg; + while (PeekMessageA( &msg, 0, 0, 0, PM_REMOVE )); +} + +static LRESULT CALLBACK cowait_window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) +{ + if(cowait_msgs_last < sizeof(cowait_msgs)/sizeof(*cowait_msgs)) + cowait_msgs[cowait_msgs_last++] = msg; + if(msg == WM_DDE_FIRST) + return 6; + return DefWindowProcA(hwnd, msg, wparam, lparam); +} + +static DWORD CALLBACK cowait_unmarshal_thread(void *arg) +{ + IStream *stream = arg; + IEnumOLEVERB *enum_verb; + LARGE_INTEGER zero; + IUnknown *unk; + HRESULT hr; + + CoInitialize(NULL); + + zero.QuadPart = 0; + hr = IStream_Seek(stream, zero, STREAM_SEEK_SET, NULL); + ok(hr == S_OK, "Seek failed: %08x\n", hr); + + hr = CoUnmarshalInterface(stream, &IID_IUnknown, (void**)&unk); + ok(hr == S_OK, "CoUnmarshalInterface failed: %08x\n", hr); + + hr = IUnknown_QueryInterface(unk, &IID_IEnumOLEVERB, (void**)&enum_verb); + ok(hr == S_OK, "QueryInterface failed: %08x\n", hr); + + IEnumOLEVERB_Release(enum_verb); + IUnknown_Release(unk); + + CoUninitialize(); + return 0; +} + static DWORD CALLBACK test_CoWaitForMultipleHandles_thread(LPVOID arg) { - HANDLE *handles = arg; + HANDLE *handles = arg, event, thread; + IStream *stream; BOOL success; - DWORD index; + DWORD index, tid; HRESULT hr; HWND hWnd; + UINT uMSG = 0xc065; MSG msg; + int ret;
hr = pCoInitializeEx(NULL, COINIT_APARTMENTTHREADED); ok(hr == S_OK, "CoInitializeEx failed with error 0x%08x\n", hr); @@ -2660,8 +2777,58 @@ static DWORD CALLBACK test_CoWaitForMultipleHandles_thread(LPVOID arg) success = PeekMessageA(&msg, hWnd, WM_USER, WM_USER, PM_REMOVE); ok(success, "CoWaitForMultipleHandles unexpectedly pumped messages\n");
+ /* Even if CoWaitForMultipleHandles does not pump a message it peeks + * at ALL of them */ + index = 0xdeadbeef; + PostMessageA(NULL, uMSG, 0, 0); + + hr = CoWaitForMultipleHandles(COWAIT_ALERTABLE, 50, 2, handles, &index); + ok(hr == RPC_S_CALLPENDING, "expected RPC_S_CALLPENDING, got 0x%08x\n", hr); + ok(index == 0 || broken(index == 0xdeadbeef) /* Win 8 */, "expected index 0, got %u\n", index); + + /* Make sure message was peeked at */ + ret = MsgWaitForMultipleObjectsEx(0, NULL, 2, QS_ALLPOSTMESSAGE, MWMO_ALERTABLE); + ok(ret == WAIT_TIMEOUT, "MsgWaitForMultipleObjects returned %x\n", ret); + + /* But not pumped */ + success = PeekMessageA(&msg, NULL, uMSG, uMSG, PM_REMOVE); + ok(success, "CoWaitForMultipleHandles unexpectedly pumped messages\n"); + DestroyWindow(hWnd); CoUninitialize(); + + hr = pCoInitializeEx(NULL, COINIT_APARTMENTTHREADED); + ok(hr == S_OK, "CoInitializeEx failed with error 0x%08x\n", hr); + + hr = CreateStreamOnHGlobal(NULL, TRUE, &stream); + ok(hr == S_OK, "CreateStreamOnHGlobal failed: %08x\n", hr); + + hr = CoMarshalInterface(stream, &IID_IUnknown, &Test_Unknown, MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL); + ok(hr == S_OK, "CoMarshalInterface should have returned S_OK instead of 0x%08x\n", hr); + + event = CreateEventW(NULL, TRUE, FALSE, NULL); + + PostQuitMessage(66); + PostThreadMessageW(GetCurrentThreadId(), WM_QUIT, 0, 0); + + hr = CoRegisterMessageFilter(&MessageFilter, NULL); + ok(hr == S_OK, "CoRegisterMessageFilter failed: %08x\n", hr); + + thread = CreateThread(NULL, 0, cowait_unmarshal_thread, stream, 0, &tid); + ok(thread != NULL, "CreateThread failed, error %u\n", GetLastError()); + hr = CoWaitForMultipleHandles(0, 50, 1, &event, &index); + ok(hr == RPC_S_CALLPENDING, "expected RPC_S_CALLPENDING, got 0x%08x\n", hr); + index = WaitForSingleObject(thread, 200); + ok(index == WAIT_OBJECT_0, "WaitForSingleObject failed\n"); + CloseHandle(thread); + + hr = CoRegisterMessageFilter(NULL, NULL); + ok(hr == S_OK, "CoRegisterMessageFilter failed: %08x\n", hr); + + IStream_Release(stream); + + CloseHandle(event); + CoUninitialize(); return 0; }
@@ -2685,7 +2852,7 @@ static void test_CoWaitForMultipleHandles(void) wc.hCursor = LoadCursorA(NULL, (LPCSTR)IDC_ARROW); wc.hbrBackground = NULL; wc.lpszClassName = cls_name; - wc.lpfnWndProc = DefWindowProcA; + wc.lpfnWndProc = cowait_window_proc; success = RegisterClassExA(&wc) != 0; ok(success, "RegisterClassExA failed %u\n", GetLastError());
@@ -2860,6 +3027,29 @@ static void test_CoWaitForMultipleHandles(void) ok(index == WAIT_OBJECT_0, "WaitForSingleObject failed\n"); CloseHandle(thread);
+ cowait_msgs_reset(); + PostMessageA(hWnd, 0, 0, 0); + PostMessageA(hWnd, WM_DDE_FIRST, 0, 0); + PostMessageA(hWnd, WM_USER+1, 0, 0); + PostMessageA(hWnd, WM_DDE_FIRST+1, 0, 0); + thread = CreateThread(NULL, 0, send_and_post_user_message_thread, hWnd, 0, &tid); + ok(thread != NULL, "CreateThread failed, error %u\n", GetLastError()); + + hr = CoWaitForMultipleHandles(0, 100, 2, handles, &index); + ok(hr == RPC_S_CALLPENDING, "expected RPC_S_CALLPENDING, got 0x%08x\n", hr); + + cowait_msgs_expect_notified(WM_DDE_FIRST); + cowait_msgs_expect_notified(WM_DDE_FIRST+1); + cowait_msgs_expect_notified(WM_USER); + cowait_msgs_expect_empty(); + cowait_msgs_expect_queued(hWnd, WM_USER); + cowait_msgs_expect_queued(hWnd, WM_USER+1); + flush_messages(); + + index = WaitForSingleObject(thread, 200); + ok(index == WAIT_OBJECT_0, "WaitForSingleObject failed\n"); + CloseHandle(thread); + /* test behaviour of WM_QUIT (semaphores are still locked) */
PostMessageA(hWnd, WM_QUIT, 40, 0); @@ -2871,6 +3061,29 @@ static void test_CoWaitForMultipleHandles(void) success = PeekMessageA(&msg, hWnd, WM_QUIT, WM_QUIT, PM_REMOVE); ok(!success, "PeekMessageA succeeded\n");
+ cowait_msgs_reset(); + PostMessageA(hWnd, WM_QUIT, 40, 0); + PostMessageA(hWnd, 0, 0, 0); + PostMessageA(hWnd, WM_DDE_FIRST, 0, 0); + PostMessageA(hWnd, WM_USER+1, 0, 0); + PostMessageA(hWnd, WM_DDE_FIRST+1, 0, 0); + thread = CreateThread(NULL, 0, send_and_post_user_message_thread, hWnd, 0, &tid); + ok(thread != NULL, "CreateThread failed, error %u\n", GetLastError()); + + hr = CoWaitForMultipleHandles(0, 100, 2, handles, &index); + ok(hr == RPC_S_CALLPENDING, "expected RPC_S_CALLPENDING, got 0x%08x\n", hr); + + cowait_msgs_expect_notified(WM_DDE_FIRST); + cowait_msgs_expect_notified(WM_DDE_FIRST+1); + cowait_msgs_expect_notified(WM_USER); + cowait_msgs_expect_empty(); + cowait_msgs_expect_queued(hWnd, WM_USER); + flush_messages(); + + index = WaitForSingleObject(thread, 200); + ok(index == WAIT_OBJECT_0, "WaitForSingleObject failed\n"); + CloseHandle(thread); + index = 0xdeadbeef; PostMessageA(hWnd, WM_DDE_FIRST, 0, 0); PostMessageA(hWnd, WM_QUIT, 41, 0); @@ -2940,10 +3153,8 @@ static void test_CoWaitForMultipleHandles(void) success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); ok(success, "PeekMessageA failed, error %u\n", GetLastError()); success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); - todo_wine ok(!success, "PeekMessageA succeeded\n"); success = PeekMessageA(&msg, hWnd, WM_QUIT, WM_QUIT, PM_REMOVE); - todo_wine ok(!success, "CoWaitForMultipleHandles didn't remove WM_QUIT messages\n"); index = WaitForSingleObject(thread, 200); ok(index == WAIT_OBJECT_0, "WaitForSingleObject failed\n"); @@ -2960,7 +3171,6 @@ static void test_CoWaitForMultipleHandles(void) success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); ok(success, "PeekMessageA failed, error %u\n", GetLastError()); success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); - todo_wine ok(!success, "PeekMessageA succeeded\n"); success = PeekMessageA(&msg, hWnd, WM_QUIT, WM_QUIT, PM_REMOVE); ok(!success, "CoWaitForMultipleHandles didn't remove WM_QUIT messages\n"); diff --git a/modules/rostests/winetests/ole32/defaulthandler.c b/modules/rostests/winetests/ole32/defaulthandler.c index c9e6af98b9..60bc29c08d 100644 --- a/modules/rostests/winetests/ole32/defaulthandler.c +++ b/modules/rostests/winetests/ole32/defaulthandler.c @@ -18,7 +18,17 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" +#define COBJMACROS +#define CONST_VTABLE + +#include <stdarg.h> +#include <stdio.h> + +#include "windef.h" +#include "winbase.h" +#include "objbase.h" + +#include "wine/test.h"
#define DEFINE_EXPECT(func) \ static BOOL expect_ ## func = FALSE, called_ ## func = FALSE diff --git a/modules/rostests/winetests/ole32/dragdrop.c b/modules/rostests/winetests/ole32/dragdrop.c index e14e757287..6abe4a9779 100644 --- a/modules/rostests/winetests/ole32/dragdrop.c +++ b/modules/rostests/winetests/ole32/dragdrop.c @@ -18,7 +18,19 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" +#define _WIN32_DCOM +#define COBJMACROS +#define CONST_VTABLE + +#include <stdarg.h> +#include <stdio.h> + +#include "windef.h" +#include "winbase.h" +#include "objbase.h" + +#include "wine/test.h" +
#define METHOD_LIST \ METHOD(DO_EnumFormatEtc), \ diff --git a/modules/rostests/winetests/ole32/errorinfo.c b/modules/rostests/winetests/ole32/errorinfo.c index c3e99a7a7b..bb350aea73 100644 --- a/modules/rostests/winetests/ole32/errorinfo.c +++ b/modules/rostests/winetests/ole32/errorinfo.c @@ -18,7 +18,16 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" +#define COBJMACROS +#define CONST_VTABLE + +#include <stdarg.h> + +#include "windef.h" +#include "winbase.h" +#include "objbase.h" + +#include "wine/test.h"
#define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08x\n", hr)
diff --git a/modules/rostests/winetests/ole32/hglobalstream.c b/modules/rostests/winetests/ole32/hglobalstream.c index 9974cd3200..15bf7c29a5 100644 --- a/modules/rostests/winetests/ole32/hglobalstream.c +++ b/modules/rostests/winetests/ole32/hglobalstream.c @@ -2,6 +2,7 @@ * Stream on HGLOBAL Tests * * Copyright 2006 Robert Shearman (for CodeWeavers) + * Copyright 2016 Dmitry Timoshkov * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,7 +19,15 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" +#define COBJMACROS + +#include <stdarg.h> + +#include "windef.h" +#include "winbase.h" +#include "objbase.h" + +#include "wine/test.h"
#define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08x\n", hr)
@@ -35,16 +44,20 @@ do { \ } \ } while(0)
-static void test_streamonhglobal(IStream *pStream) +static void test_streamonhglobal(void) { const char data[] = "Test String"; ULARGE_INTEGER ull; + IStream *pStream; LARGE_INTEGER ll; char buffer[128]; ULONG read; STATSTG statstg; HRESULT hr;
+ hr = CreateStreamOnHGlobal(NULL, TRUE, &pStream); + ok(hr == S_OK, "Failed to create a stream, hr %#x.\n", hr); + ull.QuadPart = sizeof(data); hr = IStream_SetSize(pStream, ull); ok_ole_success(hr, "IStream_SetSize"); @@ -285,6 +298,8 @@ static void test_streamonhglobal(IStream *pStream) hr = IStream_SetSize(pStream, ull); ok(hr == E_OUTOFMEMORY || broken(hr == S_OK), /* win9x */ "IStream_SetSize with large size should have returned E_OUTOFMEMORY instead of 0x%08x\n", hr); + + IStream_Release(pStream); }
static HRESULT WINAPI TestStream_QueryInterface(IStream *iface, REFIID riid, void **ppv) @@ -500,16 +515,237 @@ static void test_freed_hglobal(void) IStream_Release(pStream); }
-START_TEST(hglobalstream) +static void stream_info(IStream *stream, HGLOBAL *hmem, int *size, int *pos) { HRESULT hr; - IStream *pStream; + STATSTG stat; + LARGE_INTEGER offset; + ULARGE_INTEGER newpos; + + *hmem = 0; + *size = *pos = -1; + + hr = GetHGlobalFromStream(stream, hmem); + ok(hr == S_OK, "unexpected %#x\n", hr); + + memset(&stat, 0x55, sizeof(stat)); + hr = IStream_Stat(stream, &stat, STATFLAG_DEFAULT); + ok(hr == S_OK, "unexpected %#x\n", hr); + ok(stat.type == STGTY_STREAM, "unexpected %#x\n", stat.type); + ok(!stat.pwcsName, "unexpected %p\n", stat.pwcsName); + ok(IsEqualIID(&stat.clsid, &GUID_NULL), "unexpected %s\n", wine_dbgstr_guid(&stat.clsid)); + ok(!stat.cbSize.HighPart, "unexpected %#x\n", stat.cbSize.HighPart); + *size = stat.cbSize.LowPart; + + offset.QuadPart = 0; + hr = IStream_Seek(stream, offset, STREAM_SEEK_CUR, &newpos); + ok(hr == S_OK, "unexpected %#x\n", hr); + ok(!newpos.HighPart, "unexpected %#x\n", newpos.HighPart); + *pos = newpos.LowPart; +}
- hr = CreateStreamOnHGlobal(NULL, TRUE, &pStream); - ok_ole_success(hr, "CreateStreamOnHGlobal"); +static void test_IStream_Clone(void) +{ + static const char hello[] = "Hello World!"; + char buf[32]; + HRESULT hr; + IStream *stream, *clone; + HGLOBAL orig_hmem, hmem, hmem_clone; + ULARGE_INTEGER newsize; + LARGE_INTEGER offset; + int size, pos, ret; + + /* test simple case for Clone */ + orig_hmem = GlobalAlloc(GMEM_MOVEABLE, 0); + ok(orig_hmem != 0, "unexpected %p\n", orig_hmem); + hr = CreateStreamOnHGlobal(orig_hmem, TRUE, &stream); + ok(hr == S_OK, "unexpected %#x\n", hr); + + hr = GetHGlobalFromStream(stream, NULL); + ok(hr == E_INVALIDARG, "unexpected %#x\n", hr); + + hr = GetHGlobalFromStream(NULL, &hmem); + ok(hr == E_INVALIDARG, "unexpected %#x\n", hr); + + stream_info(stream, &hmem, &size, &pos); + ok(hmem == orig_hmem, "handles should match\n"); + ok(size == 0, "unexpected %d\n", size); + ok(pos == 0, "unexpected %d\n", pos); + + hr = IStream_Clone(stream, &clone); + ok(hr == S_OK, "unexpected %#x\n", hr); + + hr = IStream_Write(stream, hello, sizeof(hello), NULL); + ok(hr == S_OK, "unexpected %#x\n", hr); + + stream_info(stream, &hmem, &size, &pos); + ok(hmem != 0, "unexpected %p\n", hmem); + ok(size == 13, "unexpected %d\n", size); + ok(pos == 13, "unexpected %d\n", pos); + + stream_info(clone, &hmem_clone, &size, &pos); + ok(hmem_clone == hmem, "handles should match\n"); + ok(size == 13, "unexpected %d\n", size); + ok(pos == 0, "unexpected %d\n", pos); + + buf[0] = 0; + hr = IStream_Read(clone, buf, sizeof(buf), NULL); + ok(hr == S_OK, "unexpected %#x\n", hr); + ok(!strcmp(buf, hello), "wrong stream contents\n"); + + newsize.QuadPart = 0x8000; + hr = IStream_SetSize(stream, newsize); + ok(hr == S_OK, "unexpected %#x\n", hr); + + stream_info(stream, &hmem, &size, &pos); + ok(hmem != 0, "unexpected %p\n", hmem); + ok(hmem == orig_hmem, "unexpected %p\n", hmem); + ok(size == 0x8000, "unexpected %#x\n", size); + ok(pos == 13, "unexpected %d\n", pos); + + stream_info(clone, &hmem_clone, &size, &pos); + ok(hmem_clone == hmem, "handles should match\n"); + ok(size == 0x8000, "unexpected %#x\n", size); + ok(pos == 13, "unexpected %d\n", pos); + + IStream_Release(clone); + IStream_Release(stream); + + /* exploit GMEM_FIXED forced move for the same base streams */ + orig_hmem = GlobalAlloc(GMEM_FIXED, 1); + ok(orig_hmem != 0, "unexpected %p\n", orig_hmem); + hr = CreateStreamOnHGlobal(orig_hmem, TRUE, &stream); + ok(hr == S_OK, "unexpected %#x\n", hr); + + hr = IStream_Clone(stream, &clone); + ok(hr == S_OK, "unexpected %#x\n", hr); + + stream_info(stream, &hmem, &size, &pos); + ok(hmem != 0, "unexpected %p\n", hmem); + ok(size == 1, "unexpected %d\n", size); + ok(pos == 0, "unexpected %d\n", pos); + + stream_info(clone, &hmem_clone, &size, &pos); + ok(hmem_clone == hmem, "handles should match\n"); + ok(size == 1, "unexpected %d\n", size); + ok(pos == 0, "unexpected %d\n", pos); + + newsize.QuadPart = 0x8000; + hr = IStream_SetSize(stream, newsize); + ok(hr == S_OK, "unexpected %#x\n", hr); + + stream_info(stream, &hmem, &size, &pos); + ok(hmem != 0, "unexpected %p\n", hmem); + ok(hmem != orig_hmem, "unexpected %p\n", hmem); + ok(size == 0x8000, "unexpected %#x\n", size); + ok(pos == 0, "unexpected %d\n", pos); + + stream_info(clone, &hmem_clone, &size, &pos); + ok(hmem_clone == hmem, "handles should match\n"); + ok(size == 0x8000, "unexpected %#x\n", size); + ok(pos == 0, "unexpected %d\n", pos); + + IStream_Release(stream); + IStream_Release(clone); + + /* exploit GMEM_FIXED forced move for different base streams */ + orig_hmem = GlobalAlloc(GMEM_FIXED, 1); + ok(orig_hmem != 0, "unexpected %p\n", orig_hmem); + hr = CreateStreamOnHGlobal(orig_hmem, TRUE, &stream); + ok(hr == S_OK, "unexpected %#x\n", hr); + + hr = CreateStreamOnHGlobal(orig_hmem, TRUE, &clone); + ok(hr == S_OK, "unexpected %#x\n", hr); + + stream_info(stream, &hmem, &size, &pos); + ok(hmem != 0, "unexpected %p\n", hmem); + ok(size == 1, "unexpected %d\n", size); + ok(pos == 0, "unexpected %d\n", pos); + + stream_info(clone, &hmem_clone, &size, &pos); + ok(hmem_clone == hmem, "handles should match\n"); + ok(size == 1, "unexpected %d\n", size); + ok(pos == 0, "unexpected %d\n", pos); + + newsize.QuadPart = 0x8000; + hr = IStream_SetSize(stream, newsize); + ok(hr == S_OK, "unexpected %#x\n", hr); + + stream_info(stream, &hmem, &size, &pos); + ok(hmem != 0, "unexpected %p\n", hmem); + ok(hmem != orig_hmem, "unexpected %p\n", hmem); + ok(size == 0x8000, "unexpected %#x\n", size); + ok(pos == 0, "unexpected %d\n", pos); + + stream_info(clone, &hmem_clone, &size, &pos); + ok(hmem_clone != hmem, "handles should not match\n"); + ok(size == 1, "unexpected %#x\n", size); + ok(pos == 0, "unexpected %d\n", pos); + + IStream_Release(stream); + /* releasing clone leads to test termination under windows + IStream_Release(clone); + */ + + /* test Release for a being cloned stream */ + hr = CreateStreamOnHGlobal(0, TRUE, &stream); + ok(hr == S_OK, "unexpected %#x\n", hr); + + hr = IStream_Clone(stream, &clone); + ok(hr == S_OK, "unexpected %#x\n", hr); + + stream_info(stream, &hmem, &size, &pos); + ok(hmem != 0, "unexpected %p\n", hmem); + ok(size == 0, "unexpected %d\n", size); + ok(pos == 0, "unexpected %d\n", pos); + + stream_info(clone, &hmem_clone, &size, &pos); + ok(hmem_clone == hmem, "handles should match\n"); + ok(size == 0, "unexpected %#x\n", size); + ok(pos == 0, "unexpected %d\n", pos); + + ret = IStream_Release(stream); + ok(ret == 0, "unexpected %d\n", ret); + + newsize.QuadPart = 0x8000; + hr = IStream_SetSize(clone, newsize); + ok(hr == S_OK, "unexpected %#x\n", hr); + + stream_info(clone, &hmem_clone, &size, &pos); + ok(hmem_clone == hmem, "handles should match\n"); + ok(size == 0x8000, "unexpected %#x\n", size); + ok(pos == 0, "unexpected %d\n", pos); + + hr = IStream_Write(clone, hello, sizeof(hello), NULL); + ok(hr == S_OK, "unexpected %#x\n", hr); + + stream_info(clone, &hmem_clone, &size, &pos); + ok(hmem_clone == hmem, "handles should match\n"); + ok(size == 0x8000, "unexpected %#x\n", size); + ok(pos == 13, "unexpected %d\n", pos); + + offset.QuadPart = 0; + hr = IStream_Seek(clone, offset, STREAM_SEEK_SET, NULL); + ok(hr == S_OK, "unexpected %#x\n", hr); + + buf[0] = 0; + hr = IStream_Read(clone, buf, sizeof(buf), NULL); + ok(hr == S_OK, "unexpected %#x\n", hr); + ok(!strcmp(buf, hello), "wrong stream contents\n"); + + stream_info(clone, &hmem_clone, &size, &pos); + ok(hmem_clone == hmem, "handles should match\n"); + ok(size == 0x8000, "unexpected %#x\n", size); + ok(pos == 32, "unexpected %d\n", pos); + + ret = IStream_Release(clone); + ok(ret == 0, "unexpected %d\n", ret); +}
- test_streamonhglobal(pStream); - IStream_Release(pStream); +START_TEST(hglobalstream) +{ + test_streamonhglobal(); test_copyto(); test_freed_hglobal(); + test_IStream_Clone(); } diff --git a/modules/rostests/winetests/ole32/marshal.c b/modules/rostests/winetests/ole32/marshal.c index 2a29e66efe..12c46e92df 100644 --- a/modules/rostests/winetests/ole32/marshal.c +++ b/modules/rostests/winetests/ole32/marshal.c @@ -18,9 +18,22 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" - -#include <shlguid.h> +#define _WIN32_DCOM +#define COBJMACROS +#define CONST_VTABLE + +#include <stdarg.h> +#include <stdio.h> + +#include "windef.h" +#include "winbase.h" +#include "objbase.h" +#include "olectl.h" +#include "shlguid.h" +#include "shobjidl.h" +#include "initguid.h" + +#include "wine/test.h"
DEFINE_GUID(CLSID_StdGlobalInterfaceTable,0x00000323,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46); DEFINE_GUID(CLSID_ManualResetEvent, 0x0000032c,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46); diff --git a/modules/rostests/winetests/ole32/moniker.c b/modules/rostests/winetests/ole32/moniker.c index ca94904696..7b67dfdb95 100644 --- a/modules/rostests/winetests/ole32/moniker.c +++ b/modules/rostests/winetests/ole32/moniker.c @@ -18,10 +18,22 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" - -#include <comcat.h> -#include <olectl.h> +#define _WIN32_DCOM +#define COBJMACROS +#define CONST_VTABLE + +#include <stdarg.h> +#include <stdio.h> + +#include "windef.h" +#include "winbase.h" +#include "objbase.h" +#include "ocidl.h" +#include "initguid.h" +#include "comcat.h" +#include "olectl.h" + +#include "wine/test.h"
#define ok_more_than_one_lock() ok(cLocks > 0, "Number of locks should be > 0, but actually is %d\n", cLocks) #define ok_no_locks() ok(cLocks == 0, "Number of locks should be 0, but actually is %d\n", cLocks) diff --git a/modules/rostests/winetests/ole32/ole2.c b/modules/rostests/winetests/ole32/ole2.c index d6dafc0f63..231f9d2531 100644 --- a/modules/rostests/winetests/ole32/ole2.c +++ b/modules/rostests/winetests/ole32/ole2.c @@ -19,15 +19,25 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" +#define COBJMACROS +#define CONST_VTABLE +#define WIN32_LEAN_AND_MEAN + +#include <stdarg.h> + +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "objbase.h" +#include "shlguid.h" + +#include "wine/test.h"
-#ifndef __REACTOS__ #include "initguid.h"
DEFINE_GUID(CLSID_Picture_Metafile,0x315,0,0,0xc0,0,0,0,0,0,0,0x46); DEFINE_GUID(CLSID_Picture_Dib,0x316,0,0,0xc0,0,0,0,0,0,0,0x46); DEFINE_GUID(CLSID_Picture_EnhMetafile,0x319,0,0,0xc0,0,0,0,0,0,0,0x46); -#endif
#define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08x\n", hr)
@@ -144,7 +154,11 @@ typedef struct PresentationDataHeader DWORD dwSize; } PresentationDataHeader;
+#ifdef __REACTOS__ static inline void check_expected_method_fmt(const char *method_name, const FORMATETC *fmt) +#else +static void inline check_expected_method_fmt(const char *method_name, const FORMATETC *fmt) +#endif { trace("%s\n", method_name); ok(expected_method_list->method != NULL, "Extra method %s called\n", method_name); @@ -2416,6 +2430,40 @@ static void test_data_cache_cache(void)
IDataObject_Release( data ); IOleCache2_Release( cache ); + + /* tests for a static class cache */ + hr = CreateDataCache( NULL, &CLSID_Picture_Dib, &IID_IOleCache2, (void **)&cache ); + + fmt.cfFormat = CF_DIB; + fmt.dwAspect = DVASPECT_CONTENT; + fmt.tymed = TYMED_HGLOBAL; + hr = IOleCache2_Cache( cache, &fmt, 0, &conn ); + ok( hr == CACHE_S_SAMECACHE, "got %08x\n", hr ); + + /* aspect other than DVASPECT_CONTENT should fail */ + fmt.dwAspect = DVASPECT_THUMBNAIL; + hr = IOleCache2_Cache( cache, &fmt, 0, &conn ); + ok( FAILED(hr), "got %08x\n", hr ); + + fmt.dwAspect = DVASPECT_DOCPRINT; + hr = IOleCache2_Cache( cache, &fmt, 0, &conn ); + ok( FAILED(hr), "got %08x\n", hr ); + + /* try caching another clip format */ + fmt.cfFormat = CF_METAFILEPICT; + fmt.dwAspect = DVASPECT_CONTENT; + fmt.tymed = TYMED_MFPICT; + hr = IOleCache2_Cache( cache, &fmt, 0, &conn ); + ok( FAILED(hr), "got %08x\n", hr ); + + /* As an exception, it's possible to add an icon aspect */ + fmt.cfFormat = CF_METAFILEPICT; + fmt.dwAspect = DVASPECT_ICON; + fmt.tymed = TYMED_MFPICT; + hr = IOleCache2_Cache( cache, &fmt, 0, &conn ); + ok( hr == S_OK, "got %08x\n", hr ); + + IOleCache2_Release( cache ); }
/* The CLSID_Picture_ classes automatically create appropriate cache entries */ @@ -3976,13 +4024,18 @@ static void check_storage_contents(IStorage *stg, const struct storage_def *stg_ hr = IStorage_OpenStream(stg, stat.pwcsName, NULL, STGM_READ | STGM_SHARE_EXCLUSIVE, 0, &stream); ok(hr == S_OK, "unexpected %#x\n", hr);
- if (!memcmp(name, "\2OlePres", 7)) + if (!memcmp(name, "\2OlePres", 8)) { + ULONG header_size = sizeof(header); + clipformat = read_clipformat(stream);
- hr = IStream_Read(stream, &header, sizeof(header), &bytes); + if (clipformat == 0) /* view cache */ + header_size = FIELD_OFFSET(PresentationDataHeader, unknown7); + + hr = IStream_Read(stream, &header, header_size, &bytes); ok(hr == S_OK, "unexpected %#x\n", hr); - ok(bytes >= 24, "read %u bytes\n", bytes); + ok(bytes == header_size, "read %u bytes, expected %u\n", bytes, header_size);
if (winetest_debug > 1) trace("header: tdSize %#x, dvAspect %#x, lindex %#x, advf %#x, unknown7 %#x, dwObjectExtentX %#x, dwObjectExtentY %#x, dwSize %#x\n", @@ -4218,12 +4271,14 @@ static void test_data_cache_save_data(void) { CF_DIB, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }, { CF_METAFILEPICT, 0, DVASPECT_CONTENT, -1, TYMED_MFPICT }, { CF_ENHMETAFILE, 0, DVASPECT_CONTENT, -1, TYMED_ENHMF }, + { 0, 0, DVASPECT_DOCPRINT, -1, TYMED_HGLOBAL }, }, - 3, 3, &CLSID_WineTest, + 4, 3, &CLSID_WineTest, { - &CLSID_WineTestOld, 3, { { "\2OlePres000", CF_DIB, DVASPECT_CONTENT, 0, NULL, 0 }, + &CLSID_WineTestOld, 4, { { "\2OlePres000", CF_DIB, DVASPECT_CONTENT, 0, NULL, 0 }, { "\2OlePres001", CF_METAFILEPICT, DVASPECT_CONTENT, 0, NULL, 0 }, - { "\2OlePres002", CF_ENHMETAFILE, DVASPECT_CONTENT, 0, NULL, 0 } } + { "\2OlePres002", CF_ENHMETAFILE, DVASPECT_CONTENT, 0, NULL, 0 }, + { "\2OlePres003", 0, DVASPECT_DOCPRINT, 0, NULL, 0 } } } }, /* without setting data */ @@ -4410,7 +4465,6 @@ static void test_data_cache_contents(void) ok(hr == S_OK, "unexpected %#x\n", hr);
hr = IPersistStorage_IsDirty(stg); -todo_wine_if(test_data[i].in == &stg_def_4 || test_data[i].in == &stg_def_8 || test_data[i].in == &stg_def_9) ok(hr == S_FALSE, "%d: unexpected %#x\n", i, hr);
hr = IPersistStorage_Save(stg, doc2, FALSE); @@ -4423,7 +4477,8 @@ todo_wine_if(test_data[i].in == &stg_def_4 || test_data[i].in == &stg_def_8 || t todo_wine_if(!(test_data[i].in == &stg_def_0 || test_data[i].in == &stg_def_1 || test_data[i].in == &stg_def_2)) ok(enumerated_streams == matched_streams, "%d out: enumerated %d != matched %d\n", i, enumerated_streams, matched_streams); -todo_wine_if(!(test_data[i].in == &stg_def_0 || test_data[i].in == &stg_def_5)) +todo_wine_if(!(test_data[i].in == &stg_def_0 || test_data[i].in == &stg_def_4 || test_data[i].in == &stg_def_5 + || test_data[i].in == &stg_def_6)) ok(enumerated_streams == test_data[i].out->stream_count, "%d: saved streams %d != def streams %d\n", i, enumerated_streams, test_data[i].out->stream_count);
diff --git a/modules/rostests/winetests/ole32/ole_server.c b/modules/rostests/winetests/ole32/ole_server.c index 9ca8bdf122..77abda47aa 100644 --- a/modules/rostests/winetests/ole32/ole_server.c +++ b/modules/rostests/winetests/ole32/ole_server.c @@ -18,7 +18,15 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" +#define COBJMACROS +#define CONST_VTABLE + +#include <windows.h> +#include <exdisp.h> +#include <tlhelp32.h> +#include <stdio.h> +#include <assert.h> +#include "wine/test.h"
#include <initguid.h> DEFINE_GUID(CLSID_WineTestObject, 0xdeadbeef,0xdead,0xbeef,0xde,0xad,0xbe,0xef,0xde,0xad,0xbe,0xef); diff --git a/modules/rostests/winetests/ole32/precomp.h b/modules/rostests/winetests/ole32/precomp.h index 24b5295b71..86f04814f3 100644 --- a/modules/rostests/winetests/ole32/precomp.h +++ b/modules/rostests/winetests/ole32/precomp.h @@ -1,3 +1,4 @@ + #ifndef _OLE32_WINETEST_PRECOMP_H_ #define _OLE32_WINETEST_PRECOMP_H_
diff --git a/modules/rostests/winetests/ole32/propvariant.c b/modules/rostests/winetests/ole32/propvariant.c index 8c3256621e..ade45fbd42 100644 --- a/modules/rostests/winetests/ole32/propvariant.c +++ b/modules/rostests/winetests/ole32/propvariant.c @@ -18,9 +18,11 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" +#include "windows.h" +#include "wtypes.h" +#include "ddeml.h"
-#include <ddeml.h> +#include "wine/test.h"
/* invalid in all versions */ #define PROP_INV 0x7f diff --git a/modules/rostests/winetests/ole32/stg_prop.c b/modules/rostests/winetests/ole32/stg_prop.c index 9b189c64c9..c6d7d3efe9 100644 --- a/modules/rostests/winetests/ole32/stg_prop.c +++ b/modules/rostests/winetests/ole32/stg_prop.c @@ -15,8 +15,11 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ - -#include "precomp.h" +#include <stdio.h> +#define COBJMACROS +#include "objbase.h" +#include "wine/test.h" +#include "initguid.h"
DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); DEFINE_GUID(FMTID_SummaryInformation,0xF29F85E0,0x4FF9,0x1068,0xAB,0x91,0x08,0x00,0x2B,0x27,0xB3,0xD9); diff --git a/modules/rostests/winetests/ole32/storage32.c b/modules/rostests/winetests/ole32/storage32.c index 756b7691df..89ffc954f2 100644 --- a/modules/rostests/winetests/ole32/storage32.c +++ b/modules/rostests/winetests/ole32/storage32.c @@ -18,9 +18,20 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" +#include <stdio.h>
-#include <initguid.h> +#define COBJMACROS +#ifndef __REACTOS__ +#define NONAMELESSUNION +#define NONAMELESSSTRUCT +#endif + +#include <windows.h> +#include "wine/test.h" + +#include "ole2.h" +#include "objidl.h" +#include "initguid.h"
DEFINE_GUID( test_stg_cls, 0x88888888, 0x0425, 0x0000, 0,0,0,0,0,0,0,0);
diff --git a/modules/rostests/winetests/ole32/usrmarshal.c b/modules/rostests/winetests/ole32/usrmarshal.c index 8576ed78f2..3919395800 100644 --- a/modules/rostests/winetests/ole32/usrmarshal.c +++ b/modules/rostests/winetests/ole32/usrmarshal.c @@ -18,7 +18,16 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" +#define COBJMACROS +#define CONST_VTABLE +#include <stdarg.h> + +#include "windef.h" +#include "winbase.h" +#include "objbase.h" +#include "objidl.h" + +#include "wine/test.h"
ULONG __RPC_USER HMETAFILE_UserSize(ULONG *, ULONG, HMETAFILE *); unsigned char * __RPC_USER HMETAFILE_UserMarshal(ULONG *, unsigned char *, HMETAFILE *);