Transmitting Network Data Through an Intermediate Driver
As discussed in Registering an Intermediate Driver as a Miniport Driver, an intermediate driver must provide a MiniportSendNetBufferLists function when it registers with NdisMRegisterMiniportDriver. The MiniportSendNetBufferLists function can forward incoming NET_BUFFER_LIST structures by calling NdisSendNetBufferLists if the driver has a connectionless lower edge . MiniportSendNetBufferLists can send the list of NET_BUFFER_LIST structures it receives with NdisSendNetBufferLists without regard to the capabilities of the underlying miniport driver.
MiniportSendNetBufferLists receives a list of NET_BUFFER_LIST structures arranged in an order determined by an overlying caller of NdisSendNetBufferLists. In most cases, the intermediate driver should maintain this ordering as it passes an incoming array of NET_BUFFER_LIST structures on to the underlying miniport driver. An intermediate driver that modifies data in network data before passing them on to the underlying driver can reorder a list.
NDIS always preserves the ordering of NET_BUFFER_LIST structure pointers as passed as a linked list to NdisSendNetBufferLists. The underlying miniport driver also assumes that list that is passed in to its MiniportSendNetBufferLists function implies the network data should be transmitted in the same order.