[PATCH 3/7] rundll32: Activate context at ID 123 before calling library functions.

Zhiyi Zhang zzhang at codeweavers.com
Wed Apr 13 02:49:11 CDT 2022


This is required to enable common control v6 for library functions called by rundll32.exe.

Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
 programs/rundll32/rundll32.c | 25 +++++++++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)

diff --git a/programs/rundll32/rundll32.c b/programs/rundll32/rundll32.c
index fe9d17f0f48..deae5d664c3 100644
--- a/programs/rundll32/rundll32.c
+++ b/programs/rundll32/rundll32.c
@@ -276,9 +276,12 @@ int WINAPI wWinMain(HINSTANCE instance, HINSTANCE hOldInstance, LPWSTR szCmdLine
     HWND hWnd;
     LPWSTR szDllName,szEntryPoint;
     void *entry_point = NULL;
-    BOOL unicode = FALSE, win16 = FALSE;
+    BOOL unicode = FALSE, win16 = FALSE, activated = FALSE;
+    HMODULE hDll, hCtx = INVALID_HANDLE_VALUE;
+    WCHAR path[MAX_PATH];
     STARTUPINFOW info;
-    HMODULE hDll;
+    ULONG_PTR cookie;
+    ACTCTXW ctx;
 
     hWnd=NULL;
     hDll=NULL;
@@ -301,6 +304,21 @@ int WINAPI wWinMain(HINSTANCE instance, HINSTANCE hOldInstance, LPWSTR szCmdLine
         szEntryPoint = get_next_arg(&szCmdLine);
     WINE_TRACE("EntryPoint=%s\n",wine_dbgstr_w(szEntryPoint));
 
+    /* Activate context before DllMain() is called */
+    if (SearchPathW(NULL, szDllName, NULL, ARRAY_SIZE(path), path, NULL))
+    {
+        memset(&ctx, 0, sizeof(ctx));
+        ctx.cbSize = sizeof(ctx);
+        ctx.lpSource = path;
+        ctx.lpResourceName = MAKEINTRESOURCEW(123);
+        ctx.dwFlags = ACTCTX_FLAG_RESOURCE_NAME_VALID;
+        hCtx = CreateActCtxW(&ctx);
+        if (hCtx != INVALID_HANDLE_VALUE)
+            activated = ActivateActCtx(hCtx, &cookie);
+        else
+            WINE_TRACE("No manifest at ID 123 in %s\n", wine_dbgstr_w(path));
+    }
+
     /* Load the library */
     hDll=LoadLibraryW(szDllName);
     if (hDll) entry_point = get_entry_point32( hDll, szEntryPoint, &unicode );
@@ -363,6 +381,9 @@ int WINAPI wWinMain(HINSTANCE instance, HINSTANCE hOldInstance, LPWSTR szCmdLine
     }
 
 CLEANUP:
+    if (activated)
+        DeactivateActCtx(0, cookie);
+    ReleaseActCtx(hCtx);
     if (hWnd)
         DestroyWindow(hWnd);
     if (hDll)
-- 
2.32.0




More information about the wine-devel mailing list