Commit 72e3fdf0 authored by Zebediah Figura's avatar Zebediah Figura Committed by Alexandre Julliard

kernel32: Allow GetModuleBaseName() to succeed on a WoW64 process.

parent 54186a4c
...@@ -1654,6 +1654,29 @@ static BOOL get_ldr_module(HANDLE process, HMODULE module, LDR_MODULE *ldr_modul ...@@ -1654,6 +1654,29 @@ static BOOL get_ldr_module(HANDLE process, HMODULE module, LDR_MODULE *ldr_modul
return FALSE; 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.@) * K32EnumProcessModules (KERNEL32.@)
* *
...@@ -1720,7 +1743,25 @@ DWORD WINAPI K32GetModuleBaseNameW(HANDLE process, HMODULE module, ...@@ -1720,7 +1743,25 @@ DWORD WINAPI K32GetModuleBaseNameW(HANDLE process, HMODULE module,
LPWSTR base_name, DWORD size) LPWSTR base_name, DWORD size)
{ {
LDR_MODULE ldr_module; LDR_MODULE ldr_module;
BOOL wow64;
if (!IsWow64Process(process, &wow64))
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)) if (!get_ldr_module(process, module, &ldr_module))
return 0; return 0;
...@@ -1728,6 +1769,7 @@ DWORD WINAPI K32GetModuleBaseNameW(HANDLE process, HMODULE module, ...@@ -1728,6 +1769,7 @@ DWORD WINAPI K32GetModuleBaseNameW(HANDLE process, HMODULE module,
if (!ReadProcessMemory(process, ldr_module.BaseDllName.Buffer, if (!ReadProcessMemory(process, ldr_module.BaseDllName.Buffer,
base_name, size * sizeof(WCHAR), NULL)) base_name, size * sizeof(WCHAR), NULL))
return 0; return 0;
}
base_name[size] = 0; base_name[size] = 0;
return size; return size;
......
...@@ -182,6 +182,8 @@ static void test_EnumProcessModules(void) ...@@ -182,6 +182,8 @@ static void test_EnumProcessModules(void)
if (sizeof(void *) == 8) if (sizeof(void *) == 8)
{ {
char name[40];
strcpy(buffer, "C:\\windows\\syswow64\\notepad.exe"); strcpy(buffer, "C:\\windows\\syswow64\\notepad.exe");
ret = CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); ret = CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
ok(ret, "CreateProcess failed: %u\n", GetLastError()); ok(ret, "CreateProcess failed: %u\n", GetLastError());
...@@ -196,6 +198,10 @@ static void test_EnumProcessModules(void) ...@@ -196,6 +198,10 @@ static void test_EnumProcessModules(void)
ok(!!hMod, "expected non-NULL module\n"); ok(!!hMod, "expected non-NULL module\n");
ok(cbNeeded % sizeof(hMod) == 0, "got %u\n", cbNeeded); 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); TerminateProcess(pi.hProcess, 0);
} }
else if (wow64) else if (wow64)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment