- UCHAR Byte = 0;
- KDSTATUS RcvCode;
- KD_PACKET Packet;
- ULONG Checksum;
-
- /* Special handling for breakin packet */
- if(PacketType == PACKET_TYPE_KD_POLL_BREAKIN)
- {
- if (KdPortGetByteEx(&DefaultPort, &Byte))
- {
- if (Byte == BREAKIN_PACKET_BYTE)
- {
- return KdPacketReceived;
- }
- }
- return KdPacketTimedOut;
- }
-
- for (;;)
- {
- /* Step 1 - Read PacketLeader */
- RcvCode = KdpReceivePacketLeader(&Packet.PacketLeader);
- if (RcvCode != KdPacketReceived)
- {
- /* Couldn't read a correct packet leader. Start over. */
- continue;
- }
-
- /* Step 2 - Read PacketType */
- RcvCode = KdpReceiveBuffer(&Packet.PacketType, sizeof(USHORT));
- if (RcvCode != KdPacketReceived)
- {
- /* Didn't receive a PacketType or PacketType is bad. Start over. */
- continue;
- }
-
- /* Step 3 - Read ByteCount */
- RcvCode = KdpReceiveBuffer(&Packet.ByteCount, sizeof(USHORT));
- if (RcvCode != KdPacketReceived || Packet.ByteCount > PACKET_MAX_SIZE)
- {
- /* Didn't receive ByteCount or it's too big. Start over. */
- continue;
- }
-
- /* Step 4 - Read PacketId */
- RcvCode = KdpReceiveBuffer(&Packet.PacketId, sizeof(ULONG));
- if (RcvCode != KdPacketReceived)
- {
- /* Didn't receive PacketId. Start over. */
- continue;
- }
-
-/*
- if (Packet.PacketId != ExpectedPacketId)
- {
- // Ask for a resend!
- continue;
- }
-*/
-
- /* Step 5 - Read Checksum */
- RcvCode = KdpReceiveBuffer(&Packet.Checksum, sizeof(ULONG));
- if (RcvCode != KdPacketReceived)
- {
- /* Didn't receive Checksum. Start over. */
- continue;
- }
-
- /* Step 6 - Handle control packets */
- if (Packet.PacketLeader == CONTROL_PACKET_LEADER)
- {
- switch (Packet.PacketType)
- {
- case PACKET_TYPE_KD_ACKNOWLEDGE:
- if (PacketType == PACKET_TYPE_KD_ACKNOWLEDGE)
- {
- /* Remote acknowledges the last packet */
- CurrentPacketId ^= 1;
- return KdPacketReceived;
- }
- /* That's not what we were waiting for, start over. */
- continue;
-
- case PACKET_TYPE_KD_RESET:
- FrLdrDbgPrint("KdReceivePacket - got a reset packet\n");
- KdpSendControlPacket(PACKET_TYPE_KD_RESET, 0);
- CurrentPacketId = INITIAL_PACKET_ID;
- /* Fall through */
-
- case PACKET_TYPE_KD_RESEND:
- /* Remote wants us to resend the last packet */
- return KdPacketNeedsResend;
-
- default:
- FrLdrDbgPrint("KdReceivePacket - got unknown control packet\n");
- return KdPacketNeedsResend;
- }
- }
-
- /* Did we wait for an ack packet? */
- if (PacketType == PACKET_TYPE_KD_ACKNOWLEDGE)
- {
- /* We received something different, start over */
- continue;
- }
-
- /* Did we get the right packet type? */
- if (PacketType != Packet.PacketType)
- {
- /* We received something different, start over */
- continue;
- }
-
- /* Get size of the message header */
- switch (Packet.PacketType)
- {
- case PACKET_TYPE_KD_STATE_CHANGE64:
- MessageHeader->Length = sizeof(DBGKD_WAIT_STATE_CHANGE64);
- break;
-
- case PACKET_TYPE_KD_STATE_MANIPULATE:
- MessageHeader->Length = sizeof(DBGKD_MANIPULATE_STATE64);
- break;
-
- case PACKET_TYPE_KD_DEBUG_IO:
- MessageHeader->Length = sizeof(DBGKD_DEBUG_IO);
- break;
-
- default:
- FrLdrDbgPrint("KdReceivePacket - unknown PacketType\n");
- return KdPacketNeedsResend;
- }
-
-//FrLdrDbgPrint("KdReceivePacket - got normal PacketType\n");
-
- /* Packet smaller than expected? */
- if (MessageHeader->Length > Packet.ByteCount)
- {
- FrLdrDbgPrint("KdReceivePacket - too few data (%d) for type %d\n",
- Packet.ByteCount, MessageHeader->Length);
- MessageHeader->Length = Packet.ByteCount;
- }
-
-//FrLdrDbgPrint("KdReceivePacket - got normal PacketType, Buffer = %p\n", MessageHeader->Buffer);
-
- /* Receive the message header data */
- RcvCode = KdpReceiveBuffer(MessageHeader->Buffer,
- MessageHeader->Length);
- if (RcvCode != KdPacketReceived)
- {
- /* Didn't receive data. Start over. */
- FrLdrDbgPrint("KdReceivePacket - Didn't receive message header data. Start over\n");
- continue;
- }
-
-//FrLdrDbgPrint("KdReceivePacket - got normal PacketType 3\n");
-
- /* Calculate checksum for the header data */
- Checksum = KdpCalculateChecksum(MessageHeader->Buffer,
- MessageHeader->Length);
-
- /* Shall we receive messsage data? */
- if (MessageData)
- {
- /* Calculate the length of the message data */
- MessageData->Length = Packet.ByteCount - MessageHeader->Length;
-
- /* Do we have data? */
- if (MessageData->Length)
- {
- FrLdrDbgPrint("KdReceivePacket - got data\n");
-
- /* Receive the message data */
- RcvCode = KdpReceiveBuffer(MessageData->Buffer,
- MessageData->Length);
- if (RcvCode != KdPacketReceived)
- {
- /* Didn't receive data. Start over. */
- FrLdrDbgPrint("KdReceivePacket - Didn't receive message data. Start over\n");
- continue;
- }
-
- /* Add cheksum for message data */
- Checksum += KdpCalculateChecksum(MessageData->Buffer,
- MessageData->Length);
- }
- }
-
- /* Compare checksum */
- if (Packet.Checksum != Checksum)
- {
- KdpSendControlPacket(PACKET_TYPE_KD_RESEND, CurrentPacketId);
- FrLdrDbgPrint("KdReceivePacket - wrong cheksum, got %x, calculated %x\n",
- Packet.Checksum, Checksum);
- continue;
- }
-
- /* We must receive a PACKET_TRAILING_BYTE now */
- RcvCode = KdpReceiveBuffer(&Byte, sizeof(UCHAR));
-
- /* Acknowledge the received packet */
- KdpSendControlPacket(PACKET_TYPE_KD_ACKNOWLEDGE, Packet.PacketId);
-
-//FrLdrDbgPrint("KdReceivePacket - all ok\n");
-
- return KdPacketReceived;
- }
-
- return KdPacketReceived;