Skip to content

Commit

Permalink
[KDCOM]
Browse files Browse the repository at this point in the history
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
  • Loading branch information
HBelusca committed Dec 25, 2015
1 parent 385bbab commit f4e200b
Showing 1 changed file with 39 additions and 11 deletions.
50 changes: 39 additions & 11 deletions reactos/drivers/base/kdcom/kddll.c
Expand Up @@ -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 **********************************************************/
Expand Down Expand Up @@ -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();
}
Expand Down Expand Up @@ -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:
Expand All @@ -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;
}
}

Expand Down Expand Up @@ -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. */
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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)
Expand All @@ -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 */
Expand Down

0 comments on commit f4e200b

Please sign in to comment.