From f4e200b907a31df831b84d7b57e93be151954817 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Fri, 25 Dec 2015 18:43:16 +0000 Subject: [PATCH] [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 svn path=/trunk/; revision=70417 --- reactos/drivers/base/kdcom/kddll.c | 50 +++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 11 deletions(-) diff --git a/reactos/drivers/base/kdcom/kddll.c b/reactos/drivers/base/kdcom/kddll.c index a26a4414285..1779ef94d16 100644 --- a/reactos/drivers/base/kdcom/kddll.c +++ b/reactos/drivers/base/kdcom/kddll.c @@ -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 @@ KdReceivePacket( 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 @@ 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: @@ -187,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; } } @@ -218,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. */ @@ -277,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; } @@ -369,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) @@ -383,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 */