diff --git a/dlls/kernel32/module.c b/dlls/kernel32/module.c index ac1f45f9bbc..41080aac17f 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 31414902bbb..cc38706d04c 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, "expected 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)