mirror of
https://github.com/reactos/reactos.git
synced 2025-01-01 03:54:02 +00:00
[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
This commit is contained in:
parent
385bbababc
commit
f4e200b907
1 changed files with 39 additions and 11 deletions
|
@ -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 */
|
||||
|
|
Loading…
Reference in a new issue