Akihiro Sagawa : ole32: Search 32-bit registry in 64-bit CoGetPSClsid and vice versa.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Jul 15 15:52:44 CDT 2014
Module: wine
Branch: master
Commit: efdaa4a17a4a2582123e83da80a03f401e8146e4
URL: http://source.winehq.org/git/wine.git/?a=commit;h=efdaa4a17a4a2582123e83da80a03f401e8146e4
Author: Akihiro Sagawa <sagawa.aki at gmail.com>
Date: Tue Jul 15 19:34:41 2014 +0900
ole32: Search 32-bit registry in 64-bit CoGetPSClsid and vice versa.
---
dlls/ole32/compobj.c | 60 ++++++++++++++++++++++++++--------------------
dlls/ole32/tests/compobj.c | 4 ++--
2 files changed, 36 insertions(+), 28 deletions(-)
diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c
index acfb630..1fab04f 100644
--- a/dlls/ole32/compobj.c
+++ b/dlls/ole32/compobj.c
@@ -2491,6 +2491,28 @@ HRESULT WINAPI CLSIDFromProgIDEx(LPCOLESTR progid, LPCLSID clsid)
return CLSIDFromProgID(progid, clsid);
}
+static HRESULT get_ps_clsid_from_registry(const WCHAR* path, REGSAM access, CLSID *pclsid)
+{
+ HKEY hkey;
+ WCHAR value[CHARS_IN_GUID];
+ DWORD len;
+
+ access |= KEY_READ;
+
+ if (open_classes_key(HKEY_CLASSES_ROOT, path, access, &hkey))
+ return REGDB_E_IIDNOTREG;
+
+ len = sizeof(value);
+ if (ERROR_SUCCESS != RegQueryValueExW(hkey, NULL, NULL, NULL, (BYTE *)value, &len))
+ return REGDB_E_IIDNOTREG;
+ RegCloseKey(hkey);
+
+ if (CLSIDFromString(value, pclsid) != NOERROR)
+ return REGDB_E_IIDNOTREG;
+
+ return S_OK;
+}
+
/*****************************************************************************
* CoGetPSClsid [OLE32.@]
*
@@ -2532,12 +2554,12 @@ HRESULT WINAPI CoGetPSClsid(REFIID riid, CLSID *pclsid)
static const WCHAR wszInterface[] = {'I','n','t','e','r','f','a','c','e','\\',0};
static const WCHAR wszPSC[] = {'\\','P','r','o','x','y','S','t','u','b','C','l','s','i','d','3','2',0};
WCHAR path[ARRAYSIZE(wszInterface) - 1 + CHARS_IN_GUID - 1 + ARRAYSIZE(wszPSC)];
- WCHAR value[CHARS_IN_GUID];
- LONG len;
- HKEY hkey;
APARTMENT *apt = COM_CurrentApt();
struct registered_psclsid *registered_psclsid;
ACTCTX_SECTION_KEYED_DATA data;
+ HRESULT hr;
+ REGSAM opposite = (sizeof(void*) > sizeof(int)) ? KEY_WOW64_32KEY : KEY_WOW64_64KEY;
+ BOOL is_wow64;
TRACE("() riid=%s, pclsid=%p\n", debugstr_guid(riid), pclsid);
@@ -2576,31 +2598,17 @@ HRESULT WINAPI CoGetPSClsid(REFIID riid, CLSID *pclsid)
StringFromGUID2(riid, path + ARRAYSIZE(wszInterface) - 1, CHARS_IN_GUID);
strcpyW(path + ARRAYSIZE(wszInterface) - 1 + CHARS_IN_GUID - 1, wszPSC);
- /* Open the key.. */
- if (open_classes_key(HKEY_CLASSES_ROOT, path, KEY_READ, &hkey))
- {
- WARN("No PSFactoryBuffer object is registered for IID %s\n", debugstr_guid(riid));
- return REGDB_E_IIDNOTREG;
- }
+ hr = get_ps_clsid_from_registry(path, 0, pclsid);
+ if (FAILED(hr) && (opposite == KEY_WOW64_32KEY ||
+ (IsWow64Process(GetCurrentProcess(), &is_wow64) && is_wow64)))
+ hr = get_ps_clsid_from_registry(path, opposite, pclsid);
- /* ... Once we have the key, query the registry to get the
- value of CLSID as a string, and convert it into a
- proper CLSID structure to be passed back to the app */
- len = sizeof(value);
- if (ERROR_SUCCESS != RegQueryValueW(hkey, NULL, value, &len))
- {
- RegCloseKey(hkey);
- return REGDB_E_IIDNOTREG;
- }
- RegCloseKey(hkey);
-
- /* We have the CLSID we want back from the registry as a string, so
- let's convert it into a CLSID structure */
- if (CLSIDFromString(value, pclsid) != NOERROR)
- return REGDB_E_IIDNOTREG;
+ if (hr == S_OK)
+ TRACE ("() Returning CLSID=%s\n", debugstr_guid(pclsid));
+ else
+ WARN("No PSFactoryBuffer object is registered for IID %s\n", debugstr_guid(riid));
- TRACE ("() Returning CLSID=%s\n", debugstr_guid(pclsid));
- return S_OK;
+ return hr;
}
/*****************************************************************************
diff --git a/dlls/ole32/tests/compobj.c b/dlls/ole32/tests/compobj.c
index b789794..1dfa9fb 100644
--- a/dlls/ole32/tests/compobj.c
+++ b/dlls/ole32/tests/compobj.c
@@ -1162,8 +1162,8 @@ static void test_CoGetPSClsid(void)
RegCloseKey(hkey_psclsid);
hr = CoGetPSClsid(&IID_DeadBeef, &clsid);
- todo_wine ok_ole_success(hr, "CoGetPSClsid");
- todo_wine ok(IsEqualGUID(&clsid, &IID_TestPS), "got clsid %s\n", wine_dbgstr_guid(&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);
More information about the wine-cvs
mailing list