/* 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);
((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)
switch (DebugIO->ApiNumber)
{
case DbgKdPrintStringApi:
+ case DbgKdGetStringApi:
gdb_send_debug_io(String, TRUE);
break;
default:
_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