From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- dlls/kernel32/tests/virtual.c | 3 --- dlls/kernelbase/memory.c | 17 +++++++++++++++-- 2 files changed, 15 insertions(+), 5 deletions(-)
diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c index 0feac0d70ac..f8700473163 100644 --- a/dlls/kernel32/tests/virtual.c +++ b/dlls/kernel32/tests/virtual.c @@ -4424,11 +4424,8 @@ static void test_WriteProcessMemory(void) memset(dst, 0x5A, sizeof(dst)); written = 666; ret = WriteProcessMemory(hproc, dst, src, sizeof(src), &written); - todo_wine ok(ret, "WriteProcessMemory failed\n"); - todo_wine ok(written == sizeof(src), "copied = %Id\n", written); - todo_wine ok(dst[0] == 0xA5 && dst[sizeof(dst) - 1] == 0xA5, "Write operation failed\n");
CloseHandle(hproc); diff --git a/dlls/kernelbase/memory.c b/dlls/kernelbase/memory.c index 10745303499..83eaa70507a 100644 --- a/dlls/kernelbase/memory.c +++ b/dlls/kernelbase/memory.c @@ -612,8 +612,21 @@ BOOL WINAPI DECLSPEC_HOTPATCH WriteProcessMemory( HANDLE process, void *addr, co
if (!VirtualQueryEx( process, addr, &info, sizeof(info) )) { - close_cross_process_connection( list ); - return FALSE; + HANDLE process_alt; + BOOL alt_ok = FALSE; + + if (GetLastError() == ERROR_ACCESS_DENIED && + DuplicateHandle( GetCurrentProcess(), process, GetCurrentProcess(), &process_alt, + PROCESS_QUERY_INFORMATION, FALSE, 0 )) + { + alt_ok = VirtualQueryEx( process_alt, addr, &info, sizeof(info) ); + CloseHandle( process_alt ); + } + if (!alt_ok) + { + close_cross_process_connection( list ); + return FALSE; + } }
switch (info.Protect & ~(PAGE_GUARD | PAGE_NOCACHE))