From: Piotr Caban piotr@codeweavers.com
--- dlls/ntdll/unix/virtual.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-)
diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c index 0d88315164a..ef206d58652 100644 --- a/dlls/ntdll/unix/virtual.c +++ b/dlls/ntdll/unix/virtual.c @@ -6025,7 +6025,26 @@ NTSTATUS WINAPI NtReadVirtualMemory( HANDLE process, const void *addr, void *buf { unsigned int status;
- if (virtual_check_buffer_for_write( buffer, size )) + if (!virtual_check_buffer_for_write( buffer, size )) + { + status = STATUS_ACCESS_VIOLATION; + size = 0; + } + else if (process == GetCurrentProcess()) + { + __TRY + { + memmove( buffer, addr, size ); + status = STATUS_SUCCESS; + } + __EXCEPT + { + status = STATUS_PARTIAL_COPY; + size = 0; + } + __ENDTRY + } + else { SERVER_START_REQ( read_process_memory ) { @@ -6036,11 +6055,6 @@ NTSTATUS WINAPI NtReadVirtualMemory( HANDLE process, const void *addr, void *buf } SERVER_END_REQ; } - else - { - status = STATUS_ACCESS_VIOLATION; - size = 0; - } if (bytes_read) *bytes_read = size; return status; }