Propagating a State-Manipulation Operation
[The TCP chimney offload feature is deprecated and should not be used.]
The following figure shows the propagation of a state-manipulation operation through an intermediate driver.
The host stack initiates a state-manipulation operation by calling one of the following NDIS functions:
When calling one of these functions, the host stack passes a pointer to an NDIS_PROTOCOL_OFFLOAD_BLOCK_LIST structure. Any accompanying state immediately follows the NDIS_PROTOCOL_OFFLOAD_BLOCK_LIST structure in memory.
In response to the host stack's call to a state-manipulation function, NDIS calls an intermediate driver's corresponding state-manipulation function:
NDIS converts the NDIS_PROTOCOL_OFFLOAD_BLOCK_LIST structure that was supplied by the host stack to an NDIS_MINIPORT_OFFLOAD_BLOCK_LIST structure. NDIS passes a pointer to the NDIS_MINIPORT_OFFLOAD_BLOCK_LIST structure to the intermediate driver's MiniportXxxOffload function.
To propagate the state-manipulation operation to the underlying driver or offload target, the intermediate driver calls the corresponding NDIS state-manipulation function. For example, if NDIS called the intermediate driver's MiniportQueryOffload function, the intermediate driver calls NdisQueryOffload.
Before calling the corresponding NDIS state-manipulation function, the intermediate driver converts the NDIS_MINIPORT_OFFLOAD_BLOCK_LIST structure that was passed in by NDIS into an NDIS_PROTOCOL_OFFLOAD_BLOCK_LIST structure. This conversion involves storing the ImReserved and SourceHandle members of the NDIS_MINIPORT_OFFLOAD_BLOCK_LIST structure. (For more information about this process, see Reusing an NDIS_MINIPORT_OFFLOAD_BLOCK_LIST Structure.) The intermediate driver passes a pointer to the NDIS_PROTOCOL_OFFLOAD_BLOCK_LIST structure to the NdisXxxOffload function.
In response to an intermediate driver's call to the NdisXxxOffload function, NDIS calls the underlying driver's or offload target's corresponding MiniportXxxOffload function. NDIS converts the NDIS_PROTOCOL_OFFLOAD_BLOCK_LIST structure that was supplied by the intermediate driver to an NDIS_MINIPORT_OFFLOAD_BLOCK_LIST structure. NDIS passes a pointer to the NDIS_MINIPORT_OFFLOAD_BLOCK_LIST structure to the underlying driver's or offload target's MiniportXxxOffload function.