Akihiro Sagawa : oleaut32/tests: Add more test cases that proxy stub interface is on one side.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Jul 15 15:52:44 CDT 2014
Module: wine
Branch: master
Commit: 8b0b6f90afb98be8345b654e187256307add794d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8b0b6f90afb98be8345b654e187256307add794d
Author: Akihiro Sagawa <sagawa.aki at gmail.com>
Date: Tue Jul 15 19:34:44 2014 +0900
oleaut32/tests: Add more test cases that proxy stub interface is on one side.
---
dlls/oleaut32/tests/typelib.c | 114 ++++++++++++++++++++++++++++++------------
1 file changed, 83 insertions(+), 31 deletions(-)
diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c
index 492975d..eb0c6e6 100644
--- a/dlls/oleaut32/tests/typelib.c
+++ b/dlls/oleaut32/tests/typelib.c
@@ -5337,10 +5337,9 @@ IUnknown uk = {&vt};
static void test_stub(void)
{
+ BOOL is_wow64 = FALSE;
+ DWORD *sam_list;
HRESULT hr;
- CLSID clsid;
- IPSFactoryBuffer *factory;
- IRpcStubBuffer *base_stub;
ITypeLib *stdole;
ICreateTypeLib2 *ctl;
ICreateTypeInfo *cti;
@@ -5349,14 +5348,22 @@ static void test_stub(void)
HREFTYPE href;
char filenameA[MAX_PATH];
WCHAR filenameW[MAX_PATH];
- HKEY hkey;
- LONG lr;
+ int i;
static const GUID libguid = {0x3b9ff02e,0x9675,0x4861,{0xb7,0x81,0xce,0xae,0xa4,0x78,0x2a,0xcc}};
static const GUID interfaceguid = {0x3b9ff02f,0x9675,0x4861,{0xb7,0x81,0xce,0xae,0xa4,0x78,0x2a,0xcc}};
static const GUID coclassguid = {0x3b9ff030,0x9675,0x4861,{0xb7,0x81,0xce,0xae,0xa4,0x78,0x2a,0xcc}};
static OLECHAR interfaceW[] = {'i','n','t','e','r','f','a','c','e',0};
static OLECHAR classW[] = {'c','l','a','s','s',0};
+ static DWORD sam_list32[] = { 0, ~0 };
+ static DWORD sam_list64[] = { 0, KEY_WOW64_32KEY, KEY_WOW64_64KEY, ~0 };
+
+ if (pIsWow64Process)
+ pIsWow64Process(GetCurrentProcess(), &is_wow64);
+ if (is_wow64 || is_win64)
+ sam_list = sam_list64;
+ else
+ sam_list = sam_list32;
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
@@ -5421,41 +5428,86 @@ static void test_stub(void)
hr = ICreateTypeLib2_QueryInterface(ctl, &IID_ITypeLib, (void**)&tl);
ok(hr == S_OK, "got %08x\n", hr);
- hr = RegisterTypeLib(tl, filenameW, NULL);
- if (hr == TYPE_E_REGISTRYACCESS)
+ for (i = 0; sam_list[i] != ~0; i++)
{
- win_skip("Insufficient privileges to register typelib in the registry\n");
- ITypeLib_Release(tl);
- DeleteFileW(filenameW);
- CoUninitialize();
- return;
- }
- ok(hr == S_OK, "got %08x\n", hr);
+ IPSFactoryBuffer *factory;
+ IRpcStubBuffer *base_stub;
+ REGSAM side = sam_list[i];
+ CLSID clsid;
+ HKEY hkey;
+ LONG lr;
+
+ hr = RegisterTypeLib(tl, filenameW, NULL);
+ if (hr == TYPE_E_REGISTRYACCESS)
+ {
+ win_skip("Insufficient privileges to register typelib in the registry\n");
+ break;
+ }
+ ok(hr == S_OK, "got %08x, side: %04x\n", hr, side);
- ITypeLib_Release(tl);
- ok(0 == ICreateTypeLib2_Release(ctl), "Typelib still has references\n");
+ /* SYS_WIN32 typelibs should be registered only as 32-bit */
+ lr = RegOpenKeyExA(HKEY_CLASSES_ROOT, "TypeLib\\{3b9ff02e-9675-4861-b781-ceaea4782acc}\\0.0\\0\\win64", 0, KEY_READ | side, &hkey);
+ ok(lr == ERROR_FILE_NOT_FOUND, "got wrong return code: %u, side: %04x\n", lr, side);
- /* SYS_WIN32 typelibs should be registered only as 32-bit */
- lr = RegOpenKeyExA(HKEY_CLASSES_ROOT, "TypeLib\\{3b9ff02e-9675-4861-b781-ceaea4782acc}\\0.0\\0\\win64", 0, KEY_READ, &hkey);
- ok(lr == ERROR_FILE_NOT_FOUND, "got wrong return code: %u\n", lr);
+ lr = RegOpenKeyExA(HKEY_CLASSES_ROOT, "TypeLib\\{3b9ff02e-9675-4861-b781-ceaea4782acc}\\0.0\\0\\win32", 0, KEY_READ | side, &hkey);
+ ok(lr == ERROR_SUCCESS, "got wrong return code: %u, side: %04x\n", lr, side);
+ RegCloseKey(hkey);
- lr = RegOpenKeyExA(HKEY_CLASSES_ROOT, "TypeLib\\{3b9ff02e-9675-4861-b781-ceaea4782acc}\\0.0\\0\\win32", 0, KEY_READ, &hkey);
- ok(lr == ERROR_SUCCESS, "got wrong return code: %u\n", lr);
- RegCloseKey(hkey);
+ /* Simulate pre-win7 installers that create interface key on one side */
+ if (side != 0)
+ {
+ WCHAR guidW[40];
+ REGSAM opposite = side ^ (KEY_WOW64_64KEY | KEY_WOW64_32KEY);
+
+ StringFromGUID2(&interfaceguid, guidW, sizeof(guidW)/sizeof(guidW[0]));
+
+ /* Delete the opposite interface key */
+ lr = RegOpenKeyExA(HKEY_CLASSES_ROOT, "Interface", 0, KEY_READ | opposite, &hkey);
+ ok(lr == ERROR_SUCCESS, "got wrong return code: %u, side: %04x\n", lr, side);
+ lr = myRegDeleteTreeW(hkey, guidW, opposite);
+ ok(lr == ERROR_SUCCESS, "got wrong return code: %u, side: %04x\n", lr, side);
+ RegCloseKey(hkey);
+
+ /* Is our side interface key affected by above operation? */
+ lr = RegOpenKeyExA(HKEY_CLASSES_ROOT, "Interface\\{3b9ff02f-9675-4861-b781-ceaea4782acc}", 0, KEY_READ | side, &hkey);
+ ok(lr == ERROR_SUCCESS || broken(lr == ERROR_FILE_NOT_FOUND), "got wrong return code: %u, side: %04x\n", lr, side);
+ if (lr == ERROR_FILE_NOT_FOUND)
+ {
+ /* win2k3, vista, 2008 */
+ win_skip("Registry reflection is enabled on this platform.\n");
+ goto next;
+ }
+ RegCloseKey(hkey);
- hr = CoGetPSClsid(&interfaceguid, &clsid);
- ok(hr == S_OK, "got: %x\n", hr);
+ /* Opposite side typelib key still exists */
+ lr = RegOpenKeyExA(HKEY_CLASSES_ROOT, "TypeLib\\{3b9ff02e-9675-4861-b781-ceaea4782acc}\\0.0\\0\\win32", 0, KEY_READ | opposite, &hkey);
+ ok(lr == ERROR_SUCCESS, "got wrong return code: %u, side: %04x\n", lr, side);
+ RegCloseKey(hkey);
+ }
- hr = CoGetClassObject(&clsid, CLSCTX_INPROC_SERVER, NULL,
- &IID_IPSFactoryBuffer, (void **)&factory);
- ok(hr == S_OK, "got: %x\n", hr);
+ hr = CoGetPSClsid(&interfaceguid, &clsid);
+ ok(hr == S_OK, "got: %x, side: %04x\n", hr, side);
- hr = IPSFactoryBuffer_CreateStub(factory, &interfaceguid, &uk, &base_stub);
- ok(hr == S_OK, "got: %x\n", hr);
+ hr = CoGetClassObject(&clsid, CLSCTX_INPROC_SERVER, NULL,
+ &IID_IPSFactoryBuffer, (void **)&factory);
+ ok(hr == S_OK, "got: %x, side: %04x\n", hr, side);
- IPSFactoryBuffer_Release(factory);
+ hr = IPSFactoryBuffer_CreateStub(factory, &interfaceguid, &uk, &base_stub);
+ if ((is_win64 && side == KEY_WOW64_32KEY)
+ || (is_wow64 && side == KEY_WOW64_64KEY))
+ todo_wine ok(hr == S_OK, "got: %x, side: %04x\n", hr, side);
+ else
+ ok(hr == S_OK, "got: %x, side: %04x\n", hr, side);
+
+ IPSFactoryBuffer_Release(factory);
+ next:
+ hr = UnRegisterTypeLib(&libguid, 0, 0, 0, SYS_WIN32);
+ ok(hr == S_OK, "got: %x, side: %04x\n", hr, side);
+ }
+
+ ITypeLib_Release(tl);
+ ok(0 == ICreateTypeLib2_Release(ctl), "Typelib still has references\n");
- UnRegisterTypeLib(&libguid, 0, 0, 0, SYS_WIN32);
DeleteFileW(filenameW);
CoUninitialize();
More information about the wine-cvs
mailing list