diff options
author | Pierre Muller <muller@sourceware.org> | 2013-09-02 14:32:19 +0000 |
---|---|---|
committer | Pierre Muller <muller@sourceware.org> | 2013-09-02 14:32:19 +0000 |
commit | cee83bcb4927035bcdc60a9e3daba2e1ee8eb0f0 (patch) | |
tree | fedb9ffbe69612fb4dfb41bcd13773929f6509d2 /gdb/gdbserver/win32-low.c | |
parent | 9a13b2fa01990ef21856bba455fdd39d5d81eb5f (diff) | |
download | gdb-cee83bcb4927035bcdc60a9e3daba2e1ee8eb0f0.zip gdb-cee83bcb4927035bcdc60a9e3daba2e1ee8eb0f0.tar.gz gdb-cee83bcb4927035bcdc60a9e3daba2e1ee8eb0f0.tar.bz2 |
* win32-low.c (child_xfer_memory): Check if ReadProcessMemory
or WriteProcessMemory complete successfully and handle
ERROR_PARTIAL_COPY error.
Diffstat (limited to 'gdb/gdbserver/win32-low.c')
-rw-r--r-- | gdb/gdbserver/win32-low.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/gdb/gdbserver/win32-low.c b/gdb/gdbserver/win32-low.c index 4e87a43..549c29f 100644 --- a/gdb/gdbserver/win32-low.c +++ b/gdb/gdbserver/win32-low.c @@ -278,21 +278,30 @@ static int child_xfer_memory (CORE_ADDR memaddr, char *our, int len, int write, struct target_ops *target) { - SIZE_T done; + BOOL success; + SIZE_T done = 0; + DWORD lasterror = 0; uintptr_t addr = (uintptr_t) memaddr; if (write) { - WriteProcessMemory (current_process_handle, (LPVOID) addr, - (LPCVOID) our, len, &done); + success = WriteProcessMemory (current_process_handle, (LPVOID) addr, + (LPCVOID) our, len, &done); + if (!success) + lasterror = GetLastError (); FlushInstructionCache (current_process_handle, (LPCVOID) addr, len); } else { - ReadProcessMemory (current_process_handle, (LPCVOID) addr, (LPVOID) our, - len, &done); + success = ReadProcessMemory (current_process_handle, (LPCVOID) addr, + (LPVOID) our, len, &done); + if (!success) + lasterror = GetLastError (); } - return done; + if (!success && lasterror == ERROR_PARTIAL_COPY && done > 0) + return done; + else + return success ? done : -1; } /* Clear out any old thread list and reinitialize it to a pristine |