取消发送操作
下图演示了取消发送操作。
驱动程序为每个NET_BUFFER_LIST结构调用NDIS_SET_NET_BUFFER_LIST_CANCEL_ID 宏,该结构传递给较低级别的驱动程序进行传输。 NDIS_SET_NET_BUFFER_LIST_CANCEL_ID 函数使用取消标识符标记指定的数据包。
在将取消 ID 分配给数据包之前,驱动程序应调用 NdisGeneratePartialCancelId ,以获取它分配的每个取消 ID 的高序字节。 这可确保驱动程序不会重复系统中其他驱动程序分配的取消 ID。 驱动程序通常从 DriverEntry 例程调用 NdisGeneratePartialCancelId 一次;但是,驱动程序可以通过多次调用 NdisGeneratePartialCancelId 来获取多个部分取消标识符。
若要取消标记NET_BUFFER_LIST结构中数据的挂起传输,驱动程序会将取消 ID 传递给 NdisCancelSendNetBufferLists 函数。 驱动程序可以通过调用 NDIS_GET_NET_BUFFER_LIST_CANCEL_ID 宏来获取 NET_BUFFER_LIST 结构的取消 ID。
如果驱动程序使用相同的取消标识符标记所有 NET_BUFFER_LIST 结构,则只需调用 NdisCancelSendNetBufferLists 即可取消所有挂起的传输。 如果驱动程序使用唯一标识符标记NET_BUFFER_LIST结构的子组中的所有NET_BUFFER_LIST结构,则只需调用 NdisCancelSendNetBufferLists 即可取消该子组中所有挂起的传输。
NDIS 调用绑定上相应较低级别驱动程序的 MiniportCancelSend 函数。 中止挂起的传输后,基础微型端口驱动程序调用 NdisMSendNetBufferListsComplete 函数,以返回NET_BUFFER_LIST结构和完成状态NDIS_STATUS_SEND_ABORTED。 NDIS 又调用相应驱动程序的 ProtocolSendNetBufferListsComplete 函数。
在其 ProtocolSendNetBufferListsComplete 函数中,协议驱动程序可以调用将 CancelId 设置为 NULL 的NDIS_SET_NET_BUFFER_LIST_CANCEL_ID。 这可以防止NET_BUFFER_LIST无意中再次使用过时的取消 ID。