diff --git a/reactos/drivers/base/kdgdb/gdb_input.c b/reactos/drivers/base/kdgdb/gdb_input.c index ddbb2dc62cb..1f0c027528c 100644 --- a/reactos/drivers/base/kdgdb/gdb_input.c +++ b/reactos/drivers/base/kdgdb/gdb_input.c @@ -830,7 +830,7 @@ handle_gdb_c( /* See if we should update the program counter */ if (Exception && (Exception->ExceptionRecord.ExceptionCode == STATUS_BREAKPOINT) - && ProgramCounter == KdDebuggerDataBlock->BreakpointWithStatus.Pointer) + && ((*(KD_BREAKPOINT_TYPE*)ProgramCounter) == KD_BREAKPOINT_VALUE)) { /* We must get past the breakpoint instruction */ KdpSetContextPc(&CurrentContext, ProgramCounter + KD_BREAKPOINT_SIZE); diff --git a/reactos/drivers/base/kdgdb/kdgdb.h b/reactos/drivers/base/kdgdb/kdgdb.h index 4710319ea88..243aa984e05 100644 --- a/reactos/drivers/base/kdgdb/kdgdb.h +++ b/reactos/drivers/base/kdgdb/kdgdb.h @@ -121,7 +121,9 @@ extern void gdb_send_registers(void); ((Context)->Eip) # define KdpSetContextPc(Context, ProgramCounter) \ ((Context)->Eip = (ProgramCounter)) +# define KD_BREAKPOINT_TYPE UCHAR # define KD_BREAKPOINT_SIZE sizeof(UCHAR) +# define KD_BREAKPOINT_VALUE 0xCC /* Single step mode */ # define KdpSetSingleStep(Context) \ ((Context)->EFlags |= EFLAGS_TF) diff --git a/reactos/drivers/base/kdgdb/kdpacket.c b/reactos/drivers/base/kdgdb/kdpacket.c index 2a0ee60a2fb..a808739bbb7 100644 --- a/reactos/drivers/base/kdgdb/kdpacket.c +++ b/reactos/drivers/base/kdgdb/kdpacket.c @@ -183,6 +183,7 @@ send_kd_debug_io( switch (DebugIO->ApiNumber) { case DbgKdPrintStringApi: + case DbgKdGetStringApi: gdb_send_debug_io(String, TRUE); break; default: @@ -362,28 +363,34 @@ KdReceivePacket( _Out_ PULONG DataLength, _Inout_ PKD_CONTEXT KdContext) { - DBGKD_MANIPULATE_STATE64* State; - - /* Special handling for breakin packet */ if (PacketType == PACKET_TYPE_KD_POLL_BREAKIN) { return KdpPollBreakIn(); } - if (PacketType != PACKET_TYPE_KD_STATE_MANIPULATE) + if (PacketType == PACKET_TYPE_KD_DEBUG_IO) { - /* What should we do ? */ - while (1); + /* HACK ! RtlAssert asks for (boipt), always say "o" --> break once. */ + MessageData->Length = 1; + MessageData->Buffer[0] = 'o'; + return KdPacketReceived; } - State = (DBGKD_MANIPULATE_STATE64*)MessageHeader->Buffer; + if (PacketType == PACKET_TYPE_KD_STATE_MANIPULATE) + { + DBGKD_MANIPULATE_STATE64* State = (DBGKD_MANIPULATE_STATE64*)MessageHeader->Buffer; - /* Maybe we are in a send<->receive loop that GDB doesn't need to know about */ - if (KdpManipulateStateHandler != NULL) - return KdpManipulateStateHandler(State, MessageData, DataLength, KdContext); + /* Maybe we are in a send<->receive loop that GDB doesn't need to know about */ + if (KdpManipulateStateHandler != NULL) + return KdpManipulateStateHandler(State, MessageData, DataLength, KdContext); - /* Receive data from GDB and interpret it */ - return gdb_receive_and_interpret_packet(State, MessageData, DataLength, KdContext); + /* Receive data from GDB and interpret it */ + return gdb_receive_and_interpret_packet(State, MessageData, DataLength, KdContext); + } + + /* What should we do ? */ + while (1); + return KdPacketNeedsResend; } VOID