static HRESULT (WINAPI * pCoGetObjectContext)(REFIID riid, LPVOID *ppv);
static HRESULT (WINAPI * pCoSwitchCallContext)(IUnknown *pObject, IUnknown **ppOldObject);
static HRESULT (WINAPI * pCoGetTreatAsClass)(REFCLSID clsidOld, LPCLSID pClsidNew);
+static HRESULT (WINAPI * pCoTreatAsClass)(REFCLSID clsidOld, REFCLSID pClsidNew);
static HRESULT (WINAPI * pCoGetContextToken)(ULONG_PTR *token);
+static LONG (WINAPI * pRegDeleteKeyExA)(HKEY, LPCSTR, REGSAM, DWORD);
static LONG (WINAPI * pRegOverridePredefKey)(HKEY key, HKEY override);
static BOOL (WINAPI *pActivateActCtx)(HANDLE,ULONG_PTR*);
static HANDLE (WINAPI *pCreateActCtxW)(PCACTCTXW);
static BOOL (WINAPI *pDeactivateActCtx)(DWORD,ULONG_PTR);
+static BOOL (WINAPI *pIsWow64Process)(HANDLE, LPBOOL);
static void (WINAPI *pReleaseActCtx)(HANDLE);
#define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08x\n", hr)
CLSID clsid;
HKEY hkey;
LONG res;
+ const BOOL is_win64 = (sizeof(void*) != sizeof(int));
+ BOOL is_wow64 = FALSE;
hr = CoGetPSClsid(&IID_IClassFactory, &clsid);
ok(hr == CO_E_NOTINITIALIZED,
pReleaseActCtx(handle);
}
+ if (pRegDeleteKeyExA &&
+ (is_win64 ||
+ (pIsWow64Process && pIsWow64Process(GetCurrentProcess(), &is_wow64) && is_wow64)))
+ {
+ static GUID IID_DeadBeef = {0xdeadbeef,0xdead,0xbeef,{0xde,0xad,0xbe,0xef,0xde,0xad,0xbe,0xef}};
+ static const char clsidDeadBeef[] = "{deadbeef-dead-beef-dead-beefdeadbeef}";
+ static const char clsidA[] = "{66666666-8888-7777-6666-555555555555}";
+ HKEY hkey_iface, hkey_psclsid;
+ REGSAM opposite = is_win64 ? KEY_WOW64_32KEY : KEY_WOW64_64KEY;
+
+ hr = CoGetPSClsid(&IID_DeadBeef, &clsid);
+ ok(hr == REGDB_E_IIDNOTREG, "got 0x%08x\n", hr);
+
+ res = RegCreateKeyExA(HKEY_CLASSES_ROOT, "Interface",
+ 0, NULL, 0, KEY_ALL_ACCESS | opposite, NULL, &hkey_iface, NULL);
+ ok(!res, "RegCreateKeyEx returned %d\n", res);
+ res = RegCreateKeyExA(hkey_iface, clsidDeadBeef,
+ 0, NULL, 0, KEY_ALL_ACCESS | opposite, NULL, &hkey, NULL);
+ ok(!res, "RegCreateKeyEx returned %d\n", res);
+ res = RegCreateKeyExA(hkey, "ProxyStubClsid32",
+ 0, NULL, 0, KEY_ALL_ACCESS | opposite, NULL, &hkey_psclsid, NULL);
+ res = RegSetValueExA(hkey_psclsid, NULL, 0, REG_SZ, (const BYTE *)clsidA, strlen(clsidA)+1);
+ ok(!res, "RegSetValueEx returned %d\n", res);
+ RegCloseKey(hkey_psclsid);
+
+ hr = CoGetPSClsid(&IID_DeadBeef, &clsid);
+ ok_ole_success(hr, "CoGetPSClsid");
+ ok(IsEqualGUID(&clsid, &IID_TestPS), "got clsid %s\n", wine_dbgstr_guid(&clsid));
+
+ res = pRegDeleteKeyExA(hkey, "ProxyStubClsid32", opposite, 0);
+ ok(!res, "RegDeleteKeyEx returned %d\n", res);
+ RegCloseKey(hkey);
+ res = pRegDeleteKeyExA(hkey_iface, clsidDeadBeef, opposite, 0);
+ ok(!res, "RegDeleteKeyEx returned %d\n", res);
+ RegCloseKey(hkey_iface);
+ }
+
CoUninitialize();
}
CoUninitialize();
}
-static void test_CoGetTreatAsClass(void)
+static void test_TreatAsClass(void)
{
HRESULT hr;
CLSID out;
static GUID deadbeef = {0xdeadbeef,0xdead,0xbeef,{0xde,0xad,0xbe,0xef,0xde,0xad,0xbe,0xef}};
+ static const char deadbeefA[] = "{DEADBEEF-DEAD-BEEF-DEAD-BEEFDEADBEEF}";
+ IInternetProtocol *pIP = NULL;
+ HKEY clsidkey, deadbeefkey;
+ LONG lr;
if (!pCoGetTreatAsClass)
{
hr = pCoGetTreatAsClass(&deadbeef,&out);
ok (hr == S_FALSE, "expected S_FALSE got %x\n",hr);
ok (IsEqualGUID(&out,&deadbeef), "expected to get same clsid back\n");
+
+ lr = RegOpenKeyExA(HKEY_CLASSES_ROOT, "CLSID", 0, KEY_READ, &clsidkey);
+ ok(lr == ERROR_SUCCESS, "Couldn't open CLSID key\n");
+
+ lr = RegCreateKeyExA(clsidkey, deadbeefA, 0, NULL, 0, KEY_WRITE, NULL, &deadbeefkey, NULL);
+ ok(lr == ERROR_SUCCESS, "Couldn't create class key\n");
+
+ hr = pCoTreatAsClass(&deadbeef, &deadbeef);
+ ok(hr == REGDB_E_WRITEREGDB, "CoTreatAsClass gave wrong error: %08x\n", hr);
+
+ hr = pCoTreatAsClass(&deadbeef, &CLSID_FileProtocol);
+ if(hr == REGDB_E_WRITEREGDB){
+ win_skip("Insufficient privileges to use CoTreatAsClass\n");
+ goto exit;
+ }
+ ok(hr == S_OK, "CoTreatAsClass failed: %08x\n", hr);
+
+ hr = pCoGetTreatAsClass(&deadbeef, &out);
+ ok(hr == S_OK, "CoGetTreatAsClass failed: %08x\n",hr);
+ ok(IsEqualGUID(&out, &CLSID_FileProtocol), "expected to get substituted clsid\n");
+
+ OleInitialize(NULL);
+
+ hr = CoCreateInstance(&deadbeef, NULL, CLSCTX_INPROC_SERVER, &IID_IInternetProtocol, (void **)&pIP);
+ if(hr == REGDB_E_CLASSNOTREG)
+ {
+ win_skip("IE not installed so can't test CoCreateInstance\n");
+ goto exit;
+ }
+
+ ok(hr == S_OK, "CoCreateInstance failed: %08x\n", hr);
+ if(pIP){
+ IInternetProtocol_Release(pIP);
+ pIP = NULL;
+ }
+
+ hr = pCoTreatAsClass(&deadbeef, &CLSID_NULL);
+ ok(hr == S_OK, "CoTreatAsClass failed: %08x\n", hr);
+
+ hr = pCoGetTreatAsClass(&deadbeef, &out);
+ ok(hr == S_FALSE, "expected S_FALSE got %08x\n", hr);
+ ok(IsEqualGUID(&out, &deadbeef), "expected to get same clsid back\n");
+
+ /* bizarrely, native's CoTreatAsClass takes some time to take effect in CoCreateInstance */
+ Sleep(200);
+
+ hr = CoCreateInstance(&deadbeef, NULL, CLSCTX_INPROC_SERVER, &IID_IInternetProtocol, (void **)&pIP);
+ ok(hr == REGDB_E_CLASSNOTREG, "CoCreateInstance gave wrong error: %08x\n", hr);
+
+ if(pIP)
+ IInternetProtocol_Release(pIP);
+
+exit:
+ OleUninitialize();
+ RegCloseKey(deadbeefkey);
+ RegDeleteKeyA(clsidkey, deadbeefA);
+ RegCloseKey(clsidkey);
}
static void test_CoInitializeEx(void)
}
}
+static void test_CoCreateGuid(void)
+{
+ HRESULT hr;
+
+ hr = CoCreateGuid(NULL);
+ ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
+}
+
static void init_funcs(void)
{
HMODULE hOle32 = GetModuleHandleA("ole32");
pCoGetObjectContext = (void*)GetProcAddress(hOle32, "CoGetObjectContext");
pCoSwitchCallContext = (void*)GetProcAddress(hOle32, "CoSwitchCallContext");
pCoGetTreatAsClass = (void*)GetProcAddress(hOle32,"CoGetTreatAsClass");
+ pCoTreatAsClass = (void*)GetProcAddress(hOle32,"CoTreatAsClass");
pCoGetContextToken = (void*)GetProcAddress(hOle32, "CoGetContextToken");
+ pRegDeleteKeyExA = (void*)GetProcAddress(hAdvapi32, "RegDeleteKeyExA");
pRegOverridePredefKey = (void*)GetProcAddress(hAdvapi32, "RegOverridePredefKey");
pCoInitializeEx = (void*)GetProcAddress(hOle32, "CoInitializeEx");
pActivateActCtx = (void*)GetProcAddress(hkernel32, "ActivateActCtx");
pCreateActCtxW = (void*)GetProcAddress(hkernel32, "CreateActCtxW");
pDeactivateActCtx = (void*)GetProcAddress(hkernel32, "DeactivateActCtx");
+ pIsWow64Process = (void*)GetProcAddress(hkernel32, "IsWow64Process");
pReleaseActCtx = (void*)GetProcAddress(hkernel32, "ReleaseActCtx");
}
test_CoGetObjectContext();
test_CoGetCallContext();
test_CoGetContextToken();
- test_CoGetTreatAsClass();
+ test_TreatAsClass();
test_CoInitializeEx();
test_OleRegGetMiscStatus();
+ test_CoCreateGuid();
}