This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
RE: [PATCH] windows-nat.c: Don't install a deprecated_xfer_memory method.
- From: "Pierre Muller" <pierre dot muller at ics-cnrs dot unistra dot fr>
- To: "'Pedro Alves'" <palves at redhat dot com>, <gdb-patches at sourceware dot org>
- Date: Fri, 23 Aug 2013 23:36:52 +0200
- Subject: RE: [PATCH] windows-nat.c: Don't install a deprecated_xfer_memory method.
- References: <20130823181245 dot 4023 dot 25651 dot stgit at brno dot lan>
Hi Pedro,
I think that your patch can be further enhanced by this change:
ReadProcessMemory and WriteProcessMemory
function both fail and report ERROR_PARTIAL_COPY
in GetLastError
if only a part of the requested memory was read/written.
Adding partial memory read/writes to windows native
allows for instance to get the true location at which a
memory chuck is not available anymore instead of the
start position of the read/write attempt if
it crosses over to region not readable or not writable.
Pierre
@@ -2315,20 +2364,23 @@ windows_stop (ptid_t ptid)
registers_changed (); /* refresh register state */
}
-static int
-windows_xfer_memory (CORE_ADDR memaddr, gdb_byte *our, int len,
- int write, struct mem_attrib *mem,
- struct target_ops *target)
+static LONGEST
+windows_xfer_memory (gdb_byte *readbuf, const gdb_byte *writebuf,
+ ULONGEST memaddr, LONGEST len)
{
SIZE_T done = 0;
- if (write)
+ BOOL success;
+ DWORD lasterror = 0;
+
+ if (writebuf != NULL)
{
DEBUG_MEM (("gdb: write target memory, %d bytes at %s\n",
len, core_addr_to_string (memaddr)));
- if (!WriteProcessMemory (current_process_handle,
- (LPVOID) (uintptr_t) memaddr, our,
- len, &done))
- done = 0;
+ success = WriteProcessMemory (current_process_handle,
+ (LPVOID) (uintptr_t) memaddr, writebuf,
+ len, &done);
+ if (!success)
+ lasterror = GetLastError ();
FlushInstructionCache (current_process_handle,
(LPCVOID) (uintptr_t) memaddr, len);
}
@@ -2336,12 +2388,17 @@ windows_xfer_memory (CORE_ADDR memaddr,
{
DEBUG_MEM (("gdb: read target memory, %d bytes at %s\n",
len, core_addr_to_string (memaddr)));
- if (!ReadProcessMemory (current_process_handle,
- (LPCVOID) (uintptr_t) memaddr, our,
- len, &done))
- done = 0;
+ success = ReadProcessMemory (current_process_handle,
+ (LPCVOID) (uintptr_t) memaddr, readbuf,
+ len, &done);
+ if (!success)
+ lasterror = GetLastError ();
}
- return done;
+ if (!success && lasterror == ERROR_PARTIAL_COPY && done > 0)
+ return done;
+ else
+ return success ? done : TARGET_XFER_E_IO;
+
}
static void
> -----Message d'origine-----
> De : gdb-patches-owner@sourceware.org [mailto:gdb-patches-
> owner@sourceware.org] De la part de Pedro Alves
> Envoyà : vendredi 23 aoÃt 2013 20:13
> Ã : gdb-patches@sourceware.org
> Objet : [PATCH] windows-nat.c: Don't install a deprecated_xfer_memory
> method.
>
> This stops another target from installing a
> target_ops->deprecated_xfer_memory method.
>
> I'm not setup for proper Cygwin/Windows testing, but I managed to
> cross build gdb from GNU/Linux, and copy the resulting binary to a
> Windows box. Running that gdb on itself worked well enough to run to
> main, so I can't imagine any regression from this. Does anyone want
> (and is willing) to run this through the testsuite?
>
> gdb/
> 2013-08-23 Pedro Alves <palves@redhat.com>
>
> * windows-nat.c (windows_xfer_memory): Adjust prototype to follow
> xfer_partial's interface. Return TARGET_XFER_E_IO on error.
> (windows_xfer_partial): Defer TARGET_OBJECT_MEMORY handling to
> windows_xfer_memory directly.
> (init_windows_ops): Don't install a deprecated_xfer_memory method.
> ---
> gdb/windows-nat.c | 36 ++++++++++++++----------------------
> 1 file changed, 14 insertions(+), 22 deletions(-)
>
> diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c
> index 9a0241b..a4e7107 100644
> --- a/gdb/windows-nat.c
> +++ b/gdb/windows-nat.c
> @@ -2315,20 +2315,20 @@ windows_stop (ptid_t ptid)
> registers_changed (); /* refresh register state */
> }
>
> -static int
> -windows_xfer_memory (CORE_ADDR memaddr, gdb_byte *our, int len,
> - int write, struct mem_attrib *mem,
> - struct target_ops *target)
> +static LONGEST
> +windows_xfer_memory (gdb_byte *readbuf, const gdb_byte *writebuf,
> + ULONGEST memaddr, LONGEST len)
> {
> SIZE_T done = 0;
> - if (write)
> + BOOL success;
> +
> + if (writebuf != NULL)
> {
> DEBUG_MEM (("gdb: write target memory, %d bytes at %s\n",
> len, core_addr_to_string (memaddr)));
> - if (!WriteProcessMemory (current_process_handle,
> - (LPVOID) (uintptr_t) memaddr, our,
> - len, &done))
> - done = 0;
> + success = WriteProcessMemory (current_process_handle,
> + (LPVOID) (uintptr_t) memaddr, writebuf,
> + len, &done);
> FlushInstructionCache (current_process_handle,
> (LPCVOID) (uintptr_t) memaddr, len);
> }
> @@ -2336,12 +2336,11 @@ windows_xfer_memory (CORE_ADDR memaddr, gdb_byte
> *our, int len,
> {
> DEBUG_MEM (("gdb: read target memory, %d bytes at %s\n",
> len, core_addr_to_string (memaddr)));
> - if (!ReadProcessMemory (current_process_handle,
> - (LPCVOID) (uintptr_t) memaddr, our,
> - len, &done))
> - done = 0;
> + success = ReadProcessMemory (current_process_handle,
> + (LPCVOID) (uintptr_t) memaddr, readbuf,
> + len, &done);
> }
> - return done;
> + return success ? done : TARGET_XFER_E_IO;
> }
>
> static void
> @@ -2442,13 +2441,7 @@ windows_xfer_partial (struct target_ops *ops, enum
> target_object object,
> switch (object)
> {
> case TARGET_OBJECT_MEMORY:
> - if (readbuf)
> - return (*ops->deprecated_xfer_memory) (offset, readbuf,
> - len, 0/*read*/, NULL, ops);
> - if (writebuf)
> - return (*ops->deprecated_xfer_memory) (offset, (gdb_byte *) writebuf,
> - len, 1/*write*/, NULL, ops);
> - return -1;
> + return windows_xfer_memory (readbuf, writebuf, offset, len);
>
> case TARGET_OBJECT_LIBRARIES:
> return windows_xfer_shared_libraries (ops, object, annex, readbuf,
> @@ -2502,7 +2495,6 @@ init_windows_ops (void)
> windows_ops.to_fetch_registers = windows_fetch_inferior_registers;
> windows_ops.to_store_registers = windows_store_inferior_registers;
> windows_ops.to_prepare_to_store = windows_prepare_to_store;
> - windows_ops.deprecated_xfer_memory = windows_xfer_memory;
> windows_ops.to_xfer_partial = windows_xfer_partial;
> windows_ops.to_files_info = windows_files_info;
> windows_ops.to_insert_breakpoint = memory_insert_breakpoint;