[PATCH 2/2] ole32: Remove workaround for creating objects from context proxy-stub descriptions.
Nikolay Sivov
nsivov at codeweavers.com
Fri Jun 12 04:58:00 CDT 2020
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/ole32/compobj.c | 41 +---------------
dlls/ole32/tests/compobj.c | 95 ++++++++++++++++++++++++++++++++++++++
2 files changed, 97 insertions(+), 39 deletions(-)
diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c
index df234498e65..6d9904a1650 100644
--- a/dlls/ole32/compobj.c
+++ b/dlls/ole32/compobj.c
@@ -3138,9 +3138,7 @@ HRESULT WINAPI DECLSPEC_HOTPATCH CoGetClassObject(
if (CLSCTX_INPROC & dwClsContext)
{
- ASSEMBLY_FILE_DETAILED_INFORMATION *file_info = NULL;
ACTCTX_SECTION_KEYED_DATA data;
- const CLSID *clsid = NULL;
data.cbSize = sizeof(data);
/* search activation context first */
@@ -3153,46 +3151,11 @@ HRESULT WINAPI DECLSPEC_HOTPATCH CoGetClassObject(
clsreg.u.actctx.module_name = (WCHAR *)((BYTE *)data.lpSectionBase + comclass->name_offset);
clsreg.u.actctx.hactctx = data.hActCtx;
clsreg.u.actctx.threading_model = comclass->model;
- clsid = &comclass->clsid;
- }
- else if (FindActCtxSectionGuid(FIND_ACTCTX_SECTION_KEY_RETURN_HACTCTX, NULL,
- ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION, rclsid, &data))
- {
- ACTIVATION_CONTEXT_QUERY_INDEX query_index;
- SIZE_T required_len = 0;
-
- query_index.ulAssemblyIndex = data.ulAssemblyRosterIndex - 1;
- query_index.ulFileIndexInAssembly = 0;
-
- QueryActCtxW(0, data.hActCtx, &query_index, FileInformationInAssemblyOfAssemblyInActivationContext,
- NULL, 0, &required_len);
- if (required_len)
- {
- file_info = heap_alloc(required_len);
- if (file_info)
- {
- if (QueryActCtxW(0, data.hActCtx, &query_index, FileInformationInAssemblyOfAssemblyInActivationContext,
- file_info, required_len, &required_len))
- {
- clsreg.u.actctx.module_name = file_info->lpFileName;
- clsreg.u.actctx.hactctx = data.hActCtx;
- clsreg.u.actctx.threading_model = ThreadingModel_Both;
- clsid = rclsid;
- }
- else
- heap_free(file_info);
- }
- }
- }
-
- if (clsreg.u.actctx.hactctx)
- {
clsreg.origin = CLASS_REG_ACTCTX;
- hres = get_inproc_class_object(apt, &clsreg, clsid, iid, !(dwClsContext & WINE_CLSCTX_DONT_HOST), ppv);
- ReleaseActCtx(clsreg.u.actctx.hactctx);
+ hres = get_inproc_class_object(apt, &clsreg, &comclass->clsid, iid, !(dwClsContext & WINE_CLSCTX_DONT_HOST), ppv);
+ ReleaseActCtx(data.hActCtx);
apartment_release(apt);
- heap_free(file_info);
return hres;
}
}
diff --git a/dlls/ole32/tests/compobj.c b/dlls/ole32/tests/compobj.c
index d6ccbc58823..eb172aac28d 100644
--- a/dlls/ole32/tests/compobj.c
+++ b/dlls/ole32/tests/compobj.c
@@ -347,6 +347,32 @@ static const char actctx_manifest[] =
" </clrClass>"
"</assembly>";
+static const char actctx_manifest2[] =
+"<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\">"
+"<assemblyIdentity version=\"1.2.3.4\" name=\"Wine.Test\" type=\"win32\""
+" publicKeyToken=\"6595b6414666f1df\" />"
+"<file name=\"testlib.dll\">"
+" <comInterfaceProxyStub "
+" name=\"Testiface7\""
+" iid=\"{52222222-1234-1234-1234-56789abcdef0}\""
+" proxyStubClsid32=\"{82222222-1234-1234-1234-56789abcdef0}\""
+" threadingModel=\"Apartment\""
+" />"
+"</file>"
+"<file name=\"testlib4.dll\">"
+" <comInterfaceProxyStub "
+" name=\"Testiface8\""
+" iid=\"{92222222-1234-1234-1234-56789abcdef0}\""
+" threadingModel=\"Apartment\""
+" />"
+"</file>"
+" <comInterfaceExternalProxyStub "
+" name=\"Iifaceps3\""
+" iid=\"{42222222-1234-1234-1234-56789abcdef0}\""
+" proxyStubClsid32=\"{66666666-8888-7777-6666-555555555555}\""
+" />"
+"</assembly>";
+
DEFINE_GUID(CLSID_Testclass, 0x12345678, 0x1234, 0x1234, 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0);
static void test_ProgIDFromCLSID(void)
@@ -692,6 +718,28 @@ static void test_CoCreateInstance(void)
test_apt_type(APTTYPE_CURRENT, APTTYPEQUALIFIER_NONE);
}
+struct comclassredirect_data
+{
+ ULONG size;
+ ULONG flags;
+ DWORD model;
+ GUID clsid;
+ GUID alias;
+ GUID clsid2;
+ GUID tlid;
+ ULONG name_len;
+ ULONG name_offset;
+ ULONG progid_len;
+ ULONG progid_offset;
+ ULONG clrdata_len;
+ ULONG clrdata_offset;
+ DWORD miscstatus;
+ DWORD miscstatuscontent;
+ DWORD miscstatusthumbnail;
+ DWORD miscstatusicon;
+ DWORD miscstatusdocprint;
+};
+
static void test_CoGetClassObject(void)
{
HRESULT hr;
@@ -763,6 +811,53 @@ static void test_CoGetClassObject(void)
deactivate_context(handle, cookie);
}
+ if ((handle = activate_context(actctx_manifest2, &cookie)))
+ {
+ struct comclassredirect_data *comclass;
+ ACTCTX_SECTION_KEYED_DATA data;
+ BOOL ret;
+
+ /* This one will load test dll and get back specific error code. */
+ hr = CoGetClassObject(&IID_Testiface7, CLSCTX_INPROC_SERVER, NULL, &IID_IUnknown, (void **)&pUnk);
+ ok(hr == 0x80001235 || broken(hr == HRESULT_FROM_WIN32(ERROR_MOD_NOT_FOUND)) /* winxp */, "Unexpected hr %#x.\n", hr);
+
+ hr = CoGetClassObject(&IID_Testiface8, CLSCTX_INPROC_SERVER, NULL, &IID_IUnknown, (void **)&pUnk);
+ ok(FAILED(hr), "Unexpected hr %#x.\n", hr);
+
+ memset(&data, 0, sizeof(data));
+ data.cbSize = sizeof(data);
+ ret = FindActCtxSectionGuid(0, NULL, ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION, &IID_Testiface8, &data);
+ ok(ret, "Section not found.\n");
+
+ memset(&data, 0, sizeof(data));
+ data.cbSize = sizeof(data);
+
+ /* External proxy-stubs are not accessible. */
+ ret = FindActCtxSectionGuid(0, NULL, ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION, &IID_Testiface3, &data);
+ ok(!ret, "Unexpected return value.\n");
+
+ ret = FindActCtxSectionGuid(0, NULL, ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION, &IID_TestPS, &data);
+ ok(!ret, "Unexpected return value.\n");
+
+ ret = FindActCtxSectionGuid(0, NULL, ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION, &IID_Testiface7, &data);
+ ok(ret, "Unexpected return value.\n");
+
+ ret = FindActCtxSectionGuid(0, NULL, ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION, &IID_Testiface4, &data);
+ ok(!ret, "Unexpected return value.\n");
+
+ ret = FindActCtxSectionGuid(0, NULL, ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION, &IID_Testiface8, &data);
+ ok(ret, "Unexpected return value.\n");
+
+ comclass = data.lpData;
+ if (comclass)
+ {
+ WCHAR *name = (WCHAR *)((char *)data.lpSectionBase + comclass->name_offset);
+ ok(!lstrcmpW(name, L"testlib4.dll"), "Unexpected module name %s.\n", wine_dbgstr_w(name));
+ }
+
+ deactivate_context(handle, cookie);
+ }
+
CoUninitialize();
}
--
2.27.0
More information about the wine-devel
mailing list