Porting Intermediate Driver Send and Receive Operations to NDIS 6.0
Like NDIS 5.x intermediate drivers, NDIS 6.0 intermediate drivers can originate or forward send requests and receive indications.
However, data transfer code paths in NDIS 6.0 have changed in the following ways:
The NET_BUFFER_LIST structures and NET_BUFFER structures replace the NDIS_PACKET structure.
Drivers can send and receive multiple packets in a single call without determining the number of packets beforehand because the packets are provided in a linked list of NET_BUFFER structures instead of an array of NDIS_PACKET structures.
The completion status of a send or receive operation is indicated in the Status member of the NET_BUFFER_LIST structure. This completion status is not returned as a function return code or a parameter of the ProtocolSendNetBufferListsComplete or NdisMSendNetBufferListsComplete function.
The TCP/IP stack that is included in Windows Vista guarantees that all NET_BUFFER structures in a NET_BUFFER_LIST structure are targeted for the same MAC address, IP address, and TCP port. Intermediate drivers are required to provide the same behavior on TCP/IP data sent to underlying drivers.
All send and receive operations are asynchronous.
Intermediate drivers must specify backfill requirements. The intermediate driver receives backfill requirements from underlying drivers in the NDIS_BIND_PARAMETERS or restart attributes. The intermediate driver specifies its backfill size requirements for its virtual miniports in the NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES structure or restart attributes. The driver adds its backfill size requirement to the size that the underlying drivers reported.
NDIS 4.0 and 5.0 intermediate drivers must allocate a new NDIS_PACKET structure to encapsulate data that they pass on. These intermediate drivers must also copy any out-of-band (OOB) data to the new packet. NDIS 5.1 intermediate drivers that support packet stacking avoid this extra data handling in most common cases. NDIS 6.0 provides context information with the NET_BUFFER_LIST and eliminates the need for packet stacking.
NDIS 6.0 also provides the ability to clone, fragment, and reassemble NET_BUFFER_LIST structures. For more information about cloning, fragmenting, and reassembling NET_BUFFER_LIST structures, see Derived NET_BUFFER_LIST Structures
NDIS 6.0 filter drivers can bypass send and receive operations to improve system performance. For more information about filter drivers, see NDIS 6.0 Filter Drivers.
For more information about send and receive operations in the miniport upper edge of an intermediate driver, see Porting Miniport Driver Send and Receive Operations to NDIS 6.0.
For more information about send and receive operations in the protocol lower edge of an intermediate driver, see Porting Protocol Driver Send and Receive Operations to NDIS 6.0.