From 38ca96eb96d3ffc31ba548a2c5fde1a0ab1b8108 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Sun, 14 Sep 2014 14:27:58 +0000 Subject: [PATCH 1/1] [KDGDB] - Improve the 'm' (read memory) gdb request svn path=/trunk/; revision=64145 --- reactos/drivers/base/kdgdb/gdb_input.c | 33 ++++++++++++++++++++++++++ reactos/drivers/base/kdgdb/gdb_send.c | 12 ++++++++++ reactos/drivers/base/kdgdb/kdgdb.h | 1 + reactos/drivers/base/kdgdb/kdpacket.c | 4 ---- 4 files changed, 46 insertions(+), 4 deletions(-) diff --git a/reactos/drivers/base/kdgdb/gdb_input.c b/reactos/drivers/base/kdgdb/gdb_input.c index a048b5193b5..0f8ab25aeaa 100644 --- a/reactos/drivers/base/kdgdb/gdb_input.c +++ b/reactos/drivers/base/kdgdb/gdb_input.c @@ -275,6 +275,35 @@ handle_gdb_registers( } #endif +static +void +ReadMemorySendHandler( + _In_ ULONG PacketType, + _In_ PSTRING MessageHeader, + _In_ PSTRING MessageData) +{ + DBGKD_MANIPULATE_STATE64* State = (DBGKD_MANIPULATE_STATE64*)MessageHeader->Buffer; + + if (PacketType != PACKET_TYPE_KD_STATE_MANIPULATE) + { + // KdAssert + KDDBGPRINT("Wrong packet type (%lu) received after DbgKdReadVirtualMemoryApi request.\n", PacketType); + while (1); + } + + if (State->ApiNumber != DbgKdReadVirtualMemoryApi) + { + KDDBGPRINT("Wrong API number (%lu) after DbgKdReadVirtualMemoryApi request.\n", State->ApiNumber); + } + + /* Check status */ + if (!NT_SUCCESS(State->ReturnStatus)) + send_gdb_ntstatus(State->ReturnStatus); + else + send_gdb_memory(MessageData->Buffer, MessageData->Length); + KdpSendPacketHandler = NULL; +} + static KDSTATUS handle_gdb_read_mem( @@ -292,6 +321,10 @@ handle_gdb_read_mem( State->u.ReadMemory.TargetBaseAddress = hex_to_address(&gdb_input[1]); State->u.ReadMemory.TransferCount = hex_to_address(strstr(&gdb_input[1], ",") + 1); + + /* KD will reply with KdSendPacket. Catch it */ + KdpSendPacketHandler = ReadMemorySendHandler; + return KdPacketReceived; } diff --git a/reactos/drivers/base/kdgdb/gdb_send.c b/reactos/drivers/base/kdgdb/gdb_send.c index 980498e89e3..b31faebf002 100644 --- a/reactos/drivers/base/kdgdb/gdb_send.c +++ b/reactos/drivers/base/kdgdb/gdb_send.c @@ -185,3 +185,15 @@ gdb_send_exception(void) ptr += sprintf(ptr, "core:%x;", CurrentStateChange.Processor); send_gdb_packet(gdb_out); } + +void +send_gdb_ntstatus( + _In_ NTSTATUS Status) +{ + /* Just build a EXX packet and send it */ + char gdb_out[4]; + gdb_out[0] = 'E'; + exception_code_to_gdb(Status, &gdb_out[1]); + gdb_out[3] = '\0'; + send_gdb_packet(gdb_out); +} diff --git a/reactos/drivers/base/kdgdb/kdgdb.h b/reactos/drivers/base/kdgdb/kdgdb.h index 03cac67bfe0..07a0eab9adc 100644 --- a/reactos/drivers/base/kdgdb/kdgdb.h +++ b/reactos/drivers/base/kdgdb/kdgdb.h @@ -52,6 +52,7 @@ void send_gdb_packet(_In_ CHAR* Buffer); void send_gdb_memory(_In_ VOID* Buffer, size_t Length); void gdb_send_debug_io(_In_ PSTRING String); void gdb_send_exception(void); +void send_gdb_ntstatus(_In_ NTSTATUS Status); /* kdcom.c */ KDSTATUS NTAPI KdpPollBreakIn(VOID); diff --git a/reactos/drivers/base/kdgdb/kdpacket.c b/reactos/drivers/base/kdgdb/kdpacket.c index dee08a8734b..9d2982610d6 100644 --- a/reactos/drivers/base/kdgdb/kdpacket.c +++ b/reactos/drivers/base/kdgdb/kdpacket.c @@ -100,10 +100,6 @@ send_kd_state_manipulate( gdb_send_registers((CONTEXT*)MessageData->Buffer); return; #endif - case DbgKdReadVirtualMemoryApi: - /* Answer to 'm' GDB request */ - send_gdb_memory(MessageData->Buffer, State->u.ReadMemory.ActualBytesRead); - break; case DbgKdGetVersionApi: { LIST_ENTRY* DebuggerDataList; -- 2.17.1