[PATCH v2 4/4] kernel32: Allow GetModuleInformation() to succeed on a WoW64 process.

Zebediah Figura zfigura at codeweavers.com
Tue May 29 09:33:06 CDT 2018


From: Zebediah Figura <z.figura12 at gmail.com>

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/kernel32/module.c        | 26 ++++++++++++++++++++++----
 dlls/psapi/tests/psapi_main.c |  7 +++++++
 2 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/dlls/kernel32/module.c b/dlls/kernel32/module.c
index 01d28a8..3ab70e8 100644
--- a/dlls/kernel32/module.c
+++ b/dlls/kernel32/module.c
@@ -1907,6 +1907,7 @@ BOOL WINAPI K32GetModuleInformation(HANDLE process, HMODULE module,
                                     MODULEINFO *modinfo, DWORD cb)
 {
     LDR_MODULE ldr_module;
+    BOOL wow64;
 
     if (cb < sizeof(MODULEINFO))
     {
@@ -1914,12 +1915,29 @@ BOOL WINAPI K32GetModuleInformation(HANDLE process, HMODULE module,
         return FALSE;
     }
 
-    if (!get_ldr_module(process, module, &ldr_module))
+    if (!IsWow64Process(process, &wow64))
         return FALSE;
 
-    modinfo->lpBaseOfDll = ldr_module.BaseAddress;
-    modinfo->SizeOfImage = ldr_module.SizeOfImage;
-    modinfo->EntryPoint  = ldr_module.EntryPoint;
+    if (sizeof(void *) == 8 && wow64)
+    {
+        LDR_MODULE32 ldr_module32;
+
+        if (!get_ldr_module32(process, module, &ldr_module32))
+            return FALSE;
+
+        modinfo->lpBaseOfDll = (void *)(DWORD_PTR)ldr_module32.BaseAddress;
+        modinfo->SizeOfImage = ldr_module32.SizeOfImage;
+        modinfo->EntryPoint  = (void *)(DWORD_PTR)ldr_module32.EntryPoint;
+    }
+    else
+    {
+        if (!get_ldr_module(process, module, &ldr_module))
+            return FALSE;
+
+        modinfo->lpBaseOfDll = ldr_module.BaseAddress;
+        modinfo->SizeOfImage = ldr_module.SizeOfImage;
+        modinfo->EntryPoint  = ldr_module.EntryPoint;
+    }
     return TRUE;
 }
 
diff --git a/dlls/psapi/tests/psapi_main.c b/dlls/psapi/tests/psapi_main.c
index 8f65296..7e874a0 100644
--- a/dlls/psapi/tests/psapi_main.c
+++ b/dlls/psapi/tests/psapi_main.c
@@ -182,6 +182,7 @@ static void test_EnumProcessModules(void)
 
     if (sizeof(void *) == 8)
     {
+        MODULEINFO info;
         char name[40];
 
         strcpy(buffer, "C:\\windows\\syswow64\\notepad.exe");
@@ -207,6 +208,12 @@ static void test_EnumProcessModules(void)
 todo_wine
         ok(!strcmp(name, buffer), "got %s\n", name);
 
+        ret = GetModuleInformation(pi.hProcess, hMod, &info, sizeof(info));
+        ok(ret, "got error %u\n", GetLastError());
+        ok(info.lpBaseOfDll == hMod, "expected %p, got %p\n", hMod, info.lpBaseOfDll);
+        ok(info.SizeOfImage, "image size was 0\n");
+        ok(info.EntryPoint >= info.lpBaseOfDll, "got entry point %p\n", info.EntryPoint);
+
         TerminateProcess(pi.hProcess, 0);
     }
     else if (wow64)
-- 
2.7.4




More information about the wine-devel mailing list