From: Zebediah Figura z.figura12@gmail.com
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/kernel32/module.c | 52 ++++++++++++++++++++++++++++++++++++++----- dlls/psapi/tests/psapi_main.c | 6 +++++ 2 files changed, 53 insertions(+), 5 deletions(-)
diff --git a/dlls/kernel32/module.c b/dlls/kernel32/module.c index ac1f45f..41080aa 100644 --- a/dlls/kernel32/module.c +++ b/dlls/kernel32/module.c @@ -1654,6 +1654,29 @@ static BOOL get_ldr_module(HANDLE process, HMODULE module, LDR_MODULE *ldr_modul return FALSE; }
+static BOOL get_ldr_module32(HANDLE process, HMODULE module, LDR_MODULE32 *ldr_module) +{ + MODULE_ITERATOR iter; + INT ret; + + if (!init_module_iterator(&iter, process)) + return FALSE; + + while ((ret = module_iterator_next(&iter)) > 0) + /* When hModule is NULL we return the process image - which will be + * the first module since our iterator uses InLoadOrderModuleList */ + if (!module || (DWORD)(DWORD_PTR) module == iter.ldr_module32.BaseAddress) + { + *ldr_module = iter.ldr_module32; + return TRUE; + } + + if (ret == 0) + SetLastError(ERROR_INVALID_HANDLE); + + return FALSE; +} + /*********************************************************************** * K32EnumProcessModules (KERNEL32.@) * @@ -1720,14 +1743,33 @@ DWORD WINAPI K32GetModuleBaseNameW(HANDLE process, HMODULE module, LPWSTR base_name, DWORD size) { LDR_MODULE ldr_module; + BOOL wow64;
- if (!get_ldr_module(process, module, &ldr_module)) + if (!IsWow64Process(process, &wow64)) return 0;
- size = min(ldr_module.BaseDllName.Length / sizeof(WCHAR), size); - if (!ReadProcessMemory(process, ldr_module.BaseDllName.Buffer, - base_name, size * sizeof(WCHAR), NULL)) - return 0; + if (sizeof(void *) == 8 && wow64) + { + LDR_MODULE32 ldr_module32; + + if (!get_ldr_module32(process, module, &ldr_module32)) + return 0; + + size = min(ldr_module32.BaseDllName.Length / sizeof(WCHAR), size); + if (!ReadProcessMemory(process, (void *)(DWORD_PTR)ldr_module32.BaseDllName.Buffer, + base_name, size * sizeof(WCHAR), NULL)) + return 0; + } + else + { + if (!get_ldr_module(process, module, &ldr_module)) + return 0; + + size = min(ldr_module.BaseDllName.Length / sizeof(WCHAR), size); + if (!ReadProcessMemory(process, ldr_module.BaseDllName.Buffer, + base_name, size * sizeof(WCHAR), NULL)) + return 0; + }
base_name[size] = 0; return size; diff --git a/dlls/psapi/tests/psapi_main.c b/dlls/psapi/tests/psapi_main.c index 169f9b0..782fb6f 100644 --- a/dlls/psapi/tests/psapi_main.c +++ b/dlls/psapi/tests/psapi_main.c @@ -182,6 +182,8 @@ static void test_EnumProcessModules(void)
if (sizeof(void *) == 8) { + char name[40]; + strcpy(buffer, "C:\windows\syswow64\notepad.exe"); ret = CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); ok(ret, "CreateProcess failed: %u\n", GetLastError()); @@ -196,6 +198,10 @@ static void test_EnumProcessModules(void) ok(!!hMod, "expeced non-NULL module\n"); ok(cbNeeded % sizeof(hMod) == 0, "got %u\n", cbNeeded);
+ ret = GetModuleBaseNameA(pi.hProcess, hMod, name, sizeof(name)); + ok(ret, "got error %u\n", GetLastError()); + ok(!strcmp(name, "notepad.exe"), "got %s\n", name); + TerminateProcess(pi.hProcess, 0); } else if (wow64)