I have an NDIS IM driver that works fine when ProtocolReceivePacket is called. However, for adapters that come in through ProtocolReceive, it does not. I always receive the entire packet. I am modifying the packets and then sending them on. Here is a condensed version of the code. Any insight would be appreciated.
NDIS_STATUS
PtReceive(IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE MacReceiveContext,
IN PVOID HeaderBuffer, IN UINT HeaderBufferSize,
IN PVOID LookAheadBuffer, IN UINT LookAheadBufferSize, IN UINT PacketSize)
{
PADAPT pAdapt = (PADAPT)ProtocolBindingContext;
PNDIS_PACKET MyPacket, Packet;
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
PRECV_RSVD recvRsvd;
PNDIS_BUFFER pNewNdisBfr = NULL;
do
{
Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext);
if (Packet != NULL)
{
NdisDprAllocatePacket(&Status, &MyPacket, pAdapt->RecvPacketPoolHandle);
if (Status == NDIS_STATUS_SUCCESS)
{
// Not shown - Modify existing packet - in newPayload
recvRsvd = (PRECV_RSVD)(MyPacket->MiniportReserved);
recvRsvd->OriginalPkt = Packet;
NdisAllocateBuffer(&status, &pNewNdisBfr, pAdapt->RecvBufferPoolHandle,
newPayload, newPktLen);
recvRsvd->newBuffer = TRUE; // Show new NDIS_BUFFER used.
NdisChainBufferAtFront(MyPacket, pNewNdisBfr);
NDIS_SET_ORIGINAL_PACKET(MyPacket, NDIS_GET_ORIGINAL_PACKET(Packet));
NDIS_SET_PACKET_HEADER_SIZE(MyPacket, HeaderBufferSize);
NdisGetPacketFlags(MyPacket) = NdisGetPacketFlags(Packet);
NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES);
NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1);
NdisDprFreePacket(MyPacket);
break;
}
else
{
LOGERROR((“PTReceive:NdisDprAllocatePacket Failed\n”));
}
}
else
{
// TBD
}
} while(FALSE);
return Status;
}
INT
PtReceivePacket(IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet)
{
PADAPT pAdapt =(PADAPT)ProtocolBindingContext;
NDIS_STATUS status;
PNDIS_PACKET myPacket;
PRECV_RSVD recvRsvd;
NdisDprAllocatePacket(&status, &myPacket, pAdapt->RecvPacketPoolHandle);
if (status != NDIS_STATUS_SUCCESS)
{
LOGERROR((“PtReceivePacket:NdisDprAllocatePacket Failed, status=0x%08x\n”,
status));
return(0);
}
// Not shown - Modify existing packet - in newPayload
recvRsvd = (PRECV_RSVD)(MyPacket->MiniportReserved);
recvRsvd->OriginalPkt = Packet;
NdisAllocateBuffer(&status, &pNewNdisBfr, pAdapt->RecvBufferPoolHandle,
newPayload, newPktLen);
recvRsvd->newBuffer = TRUE; // Show new NDIS_BUFFER used.
NdisChainBufferAtFront(MyPacket, pNewNdisBfr);
NDIS_SET_ORIGINAL_PACKET(myPacket, NDIS_GET_ORIGINAL_PACKET(Packet));
NdisGetPacketFlags(myPacket) = NdisGetPacketFlags(Packet);
status = NDIS_GET_PACKET_STATUS(Packet);
NDIS_SET_PACKET_STATUS(myPacket, status);
NDIS_SET_PACKET_HEADER_SIZE(myPacket,
NDIS_GET_PACKET_HEADER_SIZE(Packet));
NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &myPacket, 1);
return((status != NDIS_STATUS_RESOURCES) ? 1 : 0);
}