kernel32: Allow GetModuleFileNameEx() 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
72e3fdf0a2
commit
54f287d88a
@ -1812,17 +1812,36 @@ DWORD WINAPI K32GetModuleFileNameExW(HANDLE process, HMODULE module,
|
|||||||
LPWSTR file_name, DWORD size)
|
LPWSTR file_name, DWORD size)
|
||||||
{
|
{
|
||||||
LDR_MODULE ldr_module;
|
LDR_MODULE ldr_module;
|
||||||
|
BOOL wow64;
|
||||||
DWORD len;
|
DWORD len;
|
||||||
|
|
||||||
if (!size) return 0;
|
if (!size) return 0;
|
||||||
|
|
||||||
if(!get_ldr_module(process, module, &ldr_module))
|
if (!IsWow64Process(process, &wow64))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
len = ldr_module.FullDllName.Length / sizeof(WCHAR);
|
if (sizeof(void *) == 8 && wow64)
|
||||||
if (!ReadProcessMemory(process, ldr_module.FullDllName.Buffer,
|
{
|
||||||
file_name, min( len, size ) * sizeof(WCHAR), NULL))
|
LDR_MODULE32 ldr_module32;
|
||||||
return 0;
|
|
||||||
|
if (!get_ldr_module32(process, module, &ldr_module32))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
len = ldr_module32.FullDllName.Length / sizeof(WCHAR);
|
||||||
|
if (!ReadProcessMemory(process, (void *)(DWORD_PTR)ldr_module32.FullDllName.Buffer,
|
||||||
|
file_name, min( len, size ) * sizeof(WCHAR), NULL))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!get_ldr_module(process, module, &ldr_module))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
len = ldr_module.FullDllName.Length / sizeof(WCHAR);
|
||||||
|
if (!ReadProcessMemory(process, ldr_module.FullDllName.Buffer,
|
||||||
|
file_name, min( len, size ) * sizeof(WCHAR), NULL))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (len < size)
|
if (len < size)
|
||||||
{
|
{
|
||||||
|
@ -202,6 +202,11 @@ static void test_EnumProcessModules(void)
|
|||||||
ok(ret, "got error %u\n", GetLastError());
|
ok(ret, "got error %u\n", GetLastError());
|
||||||
ok(!strcmp(name, "notepad.exe"), "got %s\n", name);
|
ok(!strcmp(name, "notepad.exe"), "got %s\n", name);
|
||||||
|
|
||||||
|
ret = GetModuleFileNameExA(pi.hProcess, hMod, name, sizeof(name));
|
||||||
|
ok(ret, "got error %u\n", GetLastError());
|
||||||
|
todo_wine
|
||||||
|
ok(!strcmp(name, buffer), "got %s\n", name);
|
||||||
|
|
||||||
TerminateProcess(pi.hProcess, 0);
|
TerminateProcess(pi.hProcess, 0);
|
||||||
}
|
}
|
||||||
else if (wow64)
|
else if (wow64)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user