Given code is working perfect to generate new copy of NDIS_PACKET,
NDIS_STATUS
CreateNewSendNdisPacket(IN NDIS_HANDLE SendPacketPoolHandle,
IN PNDIS_PACKET pkt_old,
IN PGUINT8 pkt_raw,
IN GUINT32 pkt_len,
OUT PNDIS_PACKET * pkt_new)
{
NDIS_STATUS Status;
NdisDprAllocatePacket(&Status, pkt_new, SendPacketPoolHandle);
if(Status == NDIS_STATUS_SUCCESS)
{
PNDIS_BUFFER MyBuffer;
PSEND_RSVD SendRsvd;SendRsvd = (PSEND_RSVD)((*pkt_new)->ProtocolReserved);
SendRsvd->OriginalPkt = pkt_old;
NdisAllocateBuffer(&Status, &MyBuffer, SendPacketPoolHandle, pkt_raw, pkt_len);
if(Status == NDIS_STATUS_SUCCESS)
{
NdisChainBufferAtFront((*pkt_new), MyBuffer);
(*pkt_new)->Private.Flags = NdisGetPacketFlags(pkt_old);
}
}
return Status;
}
NDIS_STATUS
CreateNewRecvNdisPacket(IN NDIS_HANDLE RecvPacketPoolHandle,
IN PNDIS_PACKET pkt_old,
IN PGUINT8 pkt_raw,
IN GUINT32 pkt_len,
OUT PNDIS_PACKET * pkt_new)
{
NDIS_STATUS Status;NdisDprAllocatePacket(&Status, pkt_new, RecvPacketPoolHandle);
if(Status == NDIS_STATUS_SUCCESS)
{
PNDIS_BUFFER MyBuffer;
PRECV_RSVD RecvRsvd;RecvRsvd = (PSEND_RSVD)((*pkt_new)->MiniportReserved);
RecvRsvd->OriginalPkt = pkt_old;NdisAllocateBuffer(&Status, &MyBuffer, RecvPacketPoolHandle, pkt_raw, pkt_len);
if(Status == NDIS_STATUS_SUCCESS)
{
NdisChainBufferAtFront((*pkt_new), MyBuffer);
(*pkt_new)->Private.Flags = NdisGetPacketFlags(pkt_old);
}
}
return Status;
}
Don’t forget to delete memory after send complete. I have used above functions in PassThru example of NDIS-WDK.