[PATCH 2/2] combase: Lookup activatable class library in the activation context.

Rémi Bernon rbernon at codeweavers.com
Fri Apr 22 05:01:05 CDT 2022


Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---

This adds a todo_wine because we're now succeeding in loading the DLL,
but we don't call get_TrustLevel when retrieving the activation factory.

 dlls/combase/roapi.c       | 21 +++++++++++++++++++++
 dlls/combase/tests/roapi.c |  6 ++----
 2 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/dlls/combase/roapi.c b/dlls/combase/roapi.c
index 46adf088247..1aa2f5fe77b 100644
--- a/dlls/combase/roapi.c
+++ b/dlls/combase/roapi.c
@@ -37,8 +37,18 @@ static const char *debugstr_hstring(HSTRING hstr)
     return wine_dbgstr_wn(str, len);
 }
 
+struct activatable_class_data
+{
+    ULONG size;
+    DWORD unk;
+    DWORD module_len;
+    DWORD module_offset;
+    DWORD threading_model;
+};
+
 static HRESULT get_library_for_classid(const WCHAR *classid, WCHAR **out)
 {
+    ACTCTX_SECTION_KEYED_DATA data;
     HKEY hkey_root, hkey_class;
     DWORD type, size;
     HRESULT hr;
@@ -46,6 +56,17 @@ static HRESULT get_library_for_classid(const WCHAR *classid, WCHAR **out)
 
     *out = NULL;
 
+    /* search activation context first */
+    data.cbSize = sizeof(data);
+    if (FindActCtxSectionStringW(FIND_ACTCTX_SECTION_KEY_RETURN_HACTCTX, NULL,
+            ACTIVATION_CONTEXT_SECTION_WINRT_ACTIVATABLE_CLASSES, classid, &data))
+    {
+        struct activatable_class_data *activatable_class = (struct activatable_class_data *)data.lpData;
+        void *ptr = (BYTE *)data.lpSectionBase + activatable_class->module_offset;
+        *out = wcsdup(ptr);
+        return S_OK;
+    }
+
     /* load class registry key */
     if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\WindowsRuntime\\ActivatableClassId",
                       0, KEY_READ, &hkey_root))
diff --git a/dlls/combase/tests/roapi.c b/dlls/combase/tests/roapi.c
index 579b1502797..592a0d3f595 100644
--- a/dlls/combase/tests/roapi.c
+++ b/dlls/combase/tests/roapi.c
@@ -95,21 +95,19 @@ static void test_ActivationFactories(void)
     todo_wine
     ok(hr == E_NOTIMPL || broken(hr == REGDB_E_CLASSNOTREG) /* <= w1064v1809 */,
             "RoGetActivationFactory returned %#lx.\n", hr);
+    todo_wine
     ok(factory == NULL, "got factory %p.\n", factory);
+    if (factory) IActivationFactory_Release(factory);
     WindowsDeleteString(str);
     hr = WindowsCreateString(L"Wine.Test.Trusted", ARRAY_SIZE(L"Wine.Test.Trusted") - 1, &str);
     ok(hr == S_OK, "WindowsCreateString returned %#lx.\n", hr);
     hr = RoGetActivationFactory(str, &IID_IActivationFactory, (void **)&factory);
-    todo_wine
     ok(hr == S_OK || broken(hr == REGDB_E_CLASSNOTREG) /* <= w1064v1809 */,
             "RoGetActivationFactory returned %#lx.\n", hr);
     if (hr == REGDB_E_CLASSNOTREG)
         ok(!factory, "got factory %p.\n", factory);
     else
-    {
-        todo_wine
         ok(!!factory, "got factory %p.\n", factory);
-    }
     if (!factory) ref = 0;
     else ref = IActivationFactory_Release(factory);
     ok(ref == 0, "Release returned %lu\n", ref);
-- 
2.35.1




More information about the wine-devel mailing list