Note NDIS 5. x has been deprecated and is superseded by NDIS 6. x. For new NDIS driver development, see Network Drivers Starting with Windows Vista. For information about porting NDIS 5. x drivers to NDIS 6. x, see Porting NDIS 5.x Drivers to NDIS 6.0.
NDIS_SET_ORIGINAL_PACKET sets the information in a given packet descriptor to the information from a packet descriptor that was originally indicated up by a lower-level driver.
VOID NDIS_SET_ORIGINAL_PACKET( _Inout_ PNDIS_PACKET Packet, _In_ PNDIS_PACKET OriginalPacket );
- Packet [in, out]
Pointer to a packet descriptor that NDIS_SET_ORIGINAL_PACKET sets from the original packet descriptor in OriginalPacket or points to the current packet descriptor if OriginalPacket is NULL.
- OriginalPacket [in]
Pointer to a packet descriptor that was originally indicated up by a lower-level driver.
If intermediate drivers are present in a layered stack of NDIS drivers, those intermediate drivers must repackage packets that they receive before indicating the packets up to the next layer. In this situation, intermediate drivers should call NDIS_SET_ORIGINAL_PACKET to set the contents of a new packet from a packet that was indicated up by a lower-level driver. To retrieve a packet that was received from a lower-level driver, drivers call the NdisGetReceivedPacket function. To obtain a pointer to the original packet that was indicated up by the lowest-level driver in the layered stack, drivers call the NDIS_GET_ORIGINAL_PACKET macro and pass the pointer to the received packet. Using this method of retrieving and repackaging, each driver in the layered stack can access the out-of-band (OOB) data block that is associated with packets that are received from the network without requiring that packets be copied to each layer.
Before calling NDIS_SET_ORIGINAL_PACKET, intermediate drivers must allocate a packet descriptor and map this packet descriptor's chain of buffer descriptors to the original packet descriptor's chain of buffer descriptors. Intermediate drivers should always allocate their packet descriptors from packet pools that the drivers set up during initialization.
The following example code retrieves a packet that was received from the driver below, obtains the original packet from OldPkt, and then sets MyPkt with the original-packet contents.
// Get the original packet, which could be the received packet // or the packet originating from the lowest-level driver. // This result is based on the number of layered drivers in the stack. // Then, set the result on the packet that will be indicated to the // next level so the OOB data block is accessible. // OldPkt = NdisGetReceivedPacket(BindingHandle, MacReceiveContext); NdisDprAllocatePacket(&Status, &MyPkt, RecvPacketPoolHandle); MyPkt->Private.Head = OldPkt->Private.Head; MyPkt->Private.Tail = OldPkt->Private.Tail; NDIS_SET_ORIGINAL_PACKET(MyPkt, NDIS_GET_ORIGINAL_PACKET(OldPkt));