[BROWSEUI] SHExplorerParseCmdLine: Fix parsing of /root (#6752)
[reactos.git] / drivers / base / kdcom / kddll.c
index 99b4ad0..7bae16d 100644 (file)
@@ -3,16 +3,15 @@
  * PROJECT:         ReactOS kernel
  * FILE:            drivers/base/kddll/kddll.c
  * PURPOSE:         Base functions for the kernel debugger.
- * PROGRAMMER:      Timo Kreuzer (timo.kreuzer@ewactos.org)
+ * PROGRAMMER:      Timo Kreuzer (timo.kreuzer@reactos.org)
  */
 
 #include "kddll.h"
 
 /* GLOBALS ********************************************************************/
 
-PFNDBGPRNT KdpDbgPrint = NULL;
 ULONG CurrentPacketId = INITIAL_PACKET_ID | SYNC_PACKET_ID;
-ULONG RemotePacketId = INITIAL_PACKET_ID;
+ULONG RemotePacketId  = INITIAL_PACKET_ID;
 
 
 /* PRIVATE FUNCTIONS **********************************************************/
@@ -91,7 +90,7 @@ KdReceivePacket(
     ULONG Checksum;
 
     /* Special handling for breakin packet */
-    if(PacketType == PACKET_TYPE_KD_POLL_BREAKIN)
+    if (PacketType == PACKET_TYPE_KD_POLL_BREAKIN)
     {
         return KdpPollBreakIn();
     }
@@ -171,14 +170,14 @@ KdReceivePacket(
                         CurrentPacketId ^= 1;
                         return KDP_PACKET_RECEIVED;
                     }
-                    /* That's not what we were waiting for, start over. */
+                    /* That's not what we were waiting for, start over */
                     continue;
 
                 case PACKET_TYPE_KD_RESET:
-                    KDDBGPRINT("KdReceivePacket - got a reset packet\n");
-                    KdpSendControlPacket(PACKET_TYPE_KD_RESET, 0);
+                    KDDBGPRINT("KdReceivePacket - got PACKET_TYPE_KD_RESET\n");
                     CurrentPacketId = INITIAL_PACKET_ID;
-                    RemotePacketId = INITIAL_PACKET_ID;
+                    RemotePacketId  = INITIAL_PACKET_ID;
+                    KdpSendControlPacket(PACKET_TYPE_KD_RESET, 0);
                     /* Fall through */
 
                 case PACKET_TYPE_KD_RESEND:
@@ -188,7 +187,8 @@ KdReceivePacket(
 
                 default:
                     KDDBGPRINT("KdReceivePacket - got unknown control packet\n");
-                    return KDP_PACKET_RESEND;
+                    /* We got an invalid packet, ignore it and start over */
+                    continue;
             }
         }
 
@@ -219,7 +219,7 @@ KdReceivePacket(
 
         /* Receive the message header data */
         KdStatus = KdpReceiveBuffer(MessageHeader->Buffer,
-                                   MessageHeader->Length);
+                                    MessageHeader->Length);
         if (KdStatus != KDP_PACKET_RECEIVED)
         {
             /* Didn't receive data. Packet needs to be resent. */
@@ -237,7 +237,7 @@ KdReceivePacket(
         /* Calculate the length of the message data */
         *DataLength = Packet.ByteCount - MessageHeader->Length;
 
-        /* Shall we receive messsage data? */
+        /* Shall we receive message data? */
         if (MessageData)
         {
             /* Set the length of the message data */
@@ -278,7 +278,7 @@ KdReceivePacket(
         if (Packet.Checksum != Checksum)
         {
             KDDBGPRINT("KdReceivePacket - wrong cheksum, got %x, calculated %x\n",
-                          Packet.Checksum, Checksum);
+                       Packet.Checksum, Checksum);
             KdpSendControlPacket(PACKET_TYPE_KD_RESEND, 0);
             continue;
         }
@@ -349,7 +349,7 @@ KdSendPacket(
         /* Send the message header */
         KdpSendBuffer(MessageHeader->Buffer, MessageHeader->Length);
 
-        /* If we have meesage data, also send it */
+        /* If we have message data, also send it */
         if (MessageData)
         {
             KdpSendBuffer(MessageData->Buffer, MessageData->Length);
@@ -370,6 +370,7 @@ KdSendPacket(
         {
             /* Packet received, we can quit the loop */
             CurrentPacketId &= ~SYNC_PACKET_ID;
+            Retries = KdContext->KdpDefaultRetries;
             break;
         }
         else if (KdStatus == KDP_PACKET_TIMEOUT)
@@ -384,10 +385,36 @@ KdSendPacket(
              */
             if (Retries == 0)
             {
-                if (PacketType == PACKET_TYPE_KD_DEBUG_IO)
+                ULONG MessageId = *(PULONG)MessageHeader->Buffer;
+                switch (PacketType)
                 {
-                    return;
+                    case PACKET_TYPE_KD_DEBUG_IO:
+                    {
+                        if (MessageId != DbgKdPrintStringApi) continue;
+                        break;
+                    }
+
+                    case PACKET_TYPE_KD_STATE_CHANGE32:
+                    case PACKET_TYPE_KD_STATE_CHANGE64:
+                    {
+                        if (MessageId != DbgKdLoadSymbolsStateChange) continue;
+                        break;
+                    }
+
+                    case PACKET_TYPE_KD_FILE_IO:
+                    {
+                        if (MessageId != DbgKdCreateFileApi) continue;
+                        break;
+                    }
                 }
+
+                /* Reset debugger state */
+                KD_DEBUGGER_NOT_PRESENT = TRUE;
+                SharedUserData->KdDebuggerEnabled &= ~0x00000002;
+                CurrentPacketId = INITIAL_PACKET_ID | SYNC_PACKET_ID;
+                RemotePacketId  = INITIAL_PACKET_ID;
+
+                return;
             }
         }
         // else (KdStatus == KDP_PACKET_RESEND) /* Resend the packet */