Author: hbelusca
Date: Fri Dec 25 18:43:16 2015
New Revision: 70417
URL:
http://svn.reactos.org/svn/reactos?rev=70417&view=rev
Log:
[KDCOM]
For MSVC builds (using KDCOM kd64 WinDbg protocol): Bail out for droppable packets after a
given number of retries, if no debugger is attached (list of droppable packets can be
found in
http://articles.sysprogs.org/kdvmware/kdcom.shtml section "KDCOM
protocol", subsection "Droppable packets").
CORE-10541 #resolve #comment Finally fixed in revision r70417!
CORE-7106
Modified:
trunk/reactos/drivers/base/kdcom/kddll.c
Modified: trunk/reactos/drivers/base/kdcom/kddll.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/base/kdcom/kddll.c…
==============================================================================
--- trunk/reactos/drivers/base/kdcom/kddll.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/base/kdcom/kddll.c [iso-8859-1] Fri Dec 25 18:43:16 2015
@@ -11,7 +11,7 @@
/* GLOBALS ********************************************************************/
ULONG CurrentPacketId = INITIAL_PACKET_ID | SYNC_PACKET_ID;
-ULONG RemotePacketId = INITIAL_PACKET_ID;
+ULONG RemotePacketId = INITIAL_PACKET_ID;
/* PRIVATE FUNCTIONS **********************************************************/
@@ -90,7 +90,7 @@
ULONG Checksum;
/* Special handling for breakin packet */
- if(PacketType == PACKET_TYPE_KD_POLL_BREAKIN)
+ if (PacketType == PACKET_TYPE_KD_POLL_BREAKIN)
{
return KdpPollBreakIn();
}
@@ -170,14 +170,14 @@
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");
+ KDDBGPRINT("KdReceivePacket - got
PACKET_TYPE_KD_RESET\n");
+ CurrentPacketId = INITIAL_PACKET_ID;
+ RemotePacketId = INITIAL_PACKET_ID;
KdpSendControlPacket(PACKET_TYPE_KD_RESET, 0);
- CurrentPacketId = INITIAL_PACKET_ID;
- RemotePacketId = INITIAL_PACKET_ID;
/* Fall through */
case PACKET_TYPE_KD_RESEND:
@@ -187,7 +187,8 @@
default:
KDDBGPRINT("KdReceivePacket - got unknown control
packet\n");
- return KDP_PACKET_RESEND;
+ /* We got an invalid packet, ignore it and start over */
+ continue;
}
}
@@ -218,7 +219,7 @@
/* 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. */
@@ -277,7 +278,7 @@
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;
}
@@ -369,6 +370,7 @@
{
/* Packet received, we can quit the loop */
CurrentPacketId &= ~SYNC_PACKET_ID;
+ Retries = KdContext->KdpDefaultRetries;
break;
}
else if (KdStatus == KDP_PACKET_TIMEOUT)
@@ -383,10 +385,36 @@
*/
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 */