kernel32: Allow GetModuleBaseName() to succeed on a WoW64 process.
Signed-off-by: Zebediah Figura <z.figura12@gmail.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
54186a4c9f
commit
72e3fdf0a2
|
@ -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,14 +1743,33 @@ 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 (!get_ldr_module(process, module, &ldr_module))
|
if (!IsWow64Process(process, &wow64))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
size = min(ldr_module.BaseDllName.Length / sizeof(WCHAR), size);
|
if (sizeof(void *) == 8 && wow64)
|
||||||
if (!ReadProcessMemory(process, ldr_module.BaseDllName.Buffer,
|
{
|
||||||
base_name, size * sizeof(WCHAR), NULL))
|
LDR_MODULE32 ldr_module32;
|
||||||
return 0;
|
|
||||||
|
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;
|
base_name[size] = 0;
|
||||||
return size;
|
return size;
|
||||||
|
|
|
@ -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)
|
||||||
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)
|
||||||
|
|
Loading…
Reference in New Issue