Author: jgardou
Date: Fri Aug 26 21:07:27 2016
New Revision: 72467

URL: http://svn.reactos.org/svn/reactos?rev=72467&view=rev
Log:
[KDGDB]
 - Add a ugly and grotesque hack to give "o" back to RtlAssert so that we 
actually break on ASSERTs
 - Check for the breakpoint instruction for deciding when to move forward the 
ProgramCounter. This is OK since KD removes all breakpoints set when hitting a 
soft BP


Modified:
    trunk/reactos/drivers/base/kdgdb/gdb_input.c
    trunk/reactos/drivers/base/kdgdb/kdgdb.h
    trunk/reactos/drivers/base/kdgdb/kdpacket.c

Modified: trunk/reactos/drivers/base/kdgdb/gdb_input.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/base/kdgdb/gdb_input.c?rev=72467&r1=72466&r2=72467&view=diff
==============================================================================
--- trunk/reactos/drivers/base/kdgdb/gdb_input.c        [iso-8859-1] (original)
+++ trunk/reactos/drivers/base/kdgdb/gdb_input.c        [iso-8859-1] Fri Aug 26 
21:07:27 2016
@@ -830,7 +830,7 @@
 
         /* 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);

Modified: trunk/reactos/drivers/base/kdgdb/kdgdb.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/base/kdgdb/kdgdb.h?rev=72467&r1=72466&r2=72467&view=diff
==============================================================================
--- trunk/reactos/drivers/base/kdgdb/kdgdb.h    [iso-8859-1] (original)
+++ trunk/reactos/drivers/base/kdgdb/kdgdb.h    [iso-8859-1] Fri Aug 26 
21:07:27 2016
@@ -121,7 +121,9 @@
     ((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)

Modified: trunk/reactos/drivers/base/kdgdb/kdpacket.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/base/kdgdb/kdpacket.c?rev=72467&r1=72466&r2=72467&view=diff
==============================================================================
--- trunk/reactos/drivers/base/kdgdb/kdpacket.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/base/kdgdb/kdpacket.c [iso-8859-1] Fri Aug 26 
21:07:27 2016
@@ -183,6 +183,7 @@
     switch (DebugIO->ApiNumber)
     {
     case DbgKdPrintStringApi:
+    case DbgKdGetStringApi:
         gdb_send_debug_io(String, TRUE);
         break;
     default:
@@ -362,28 +363,34 @@
     _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)
-    {
-        /* What should we do ? */
-        while (1);
-    }
-
-    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);
-
-    /* Receive data from GDB  and interpret it */
-    return gdb_receive_and_interpret_packet(State, MessageData, DataLength, 
KdContext);
+    if (PacketType == PACKET_TYPE_KD_DEBUG_IO)
+    {
+        /* HACK ! RtlAssert asks for (boipt), always say "o" --> break once. */
+        MessageData->Length = 1;
+        MessageData->Buffer[0] = 'o';
+        return KdPacketReceived;
+    }
+
+    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);
+
+        /* 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


Reply via email to