微型端口驱动程序处理来自过度驱动程序的发送请求,并发出接收指示。 在单个函数调用中,NDIS 微型端口驱动程序可以指示具有多个接收 NET_BUFFER_LIST 结构的链接列表。 微型端口驱动程序可以处理对每个NET_BUFFER_LIST结构上具有多个 NET_BUFFER 结构的多个NET_BUFFER_LIST结构列表的发送请求。
微型端口驱动程序必须管理接收缓冲池。 大多数微型端口驱动程序创建池,这些池使用每个NET_BUFFER_LIST结构预分配单个NET_BUFFER结构。
缓冲池管理
微型端口驱动程序通常从 MiniportInitializeEx 调用 NdisAllocateNetBufferListPool 来创建NET_BUFFER_LIST结构的池。 微型端口驱动程序使用这些结构来指示接收的数据。
通常,分配NET_BUFFER_LIST结构的微型端口驱动程序会在该NET_BUFFER_LIST结构上分配一个 NET_BUFFER 结构并将其排队。 在分配NET_BUFFER_LIST结构池时预分配NET_BUFFER结构比单独分配NET_BUFFER_LIST结构和NET_BUFFER结构更有效。
微型端口驱动程序可以调用 NdisAllocateNetBufferListPool 并将 AllocateNetBuffer 参数设置为 TRUE ,以指示 预分配NET_BUFFER 结构。 在这种情况下,NET_BUFFER结构预分配了驱动程序从池中分配的每个NET_BUFFER_LIST结构。 此类驱动程序必须调用 NdisAllocateNetBufferAndNetBufferList 才能从此池分配结构。
通常,微型端口驱动程序从 MiniportInitializeEx 调用 NdisAllocateNetBufferAndNetBufferList,以分配后续接收操作所需的任意数量的缓冲区。 在这种情况下,驱动程序管理可用缓冲区的内部列表。
MiniportReturnNetBufferLists 函数可以准备返回的 NET_BUFFER_LIST 结构,以便在后续接收指示中重复使用。 例如,尽管 MiniportReturnNetBufferLists 可以将NET_BUFFER_LIST结构返回到池 (,但它可以调用 NdisFreeNetBufferList) ,但重复使用结构而不将它们返回到池可能更有效。
当 NDIS 停止适配器时,微型端口驱动程序应释放所有NET_BUFFER_LIST结构和关联的数据。 驱动程序可以调用 NdisFreeNetBufferList 来释放结构,并调用 NdisFreeNetBufferListPool 函数来释放NET_BUFFER_LIST池。
数据发送
这部分可以参考NDIS驱动开发-NET_BUFFER体系,下图演示了微型端口驱动程序发送操作:
NDIS 调用微型端口驱动程序的 MiniportSendNetBufferLists 函数来传输由 NET_BUFFER_LIST 结构链接列表描述的网络数据。
微型端口驱动程序调用 NdisMSendNetBufferListsComplete 函数,以将NET_BUFFER_LIST结构的链接列表返回到过度的驱动程序,并返回发送请求的最终状态。
取消发送
下图演示了微型端口驱动程序取消发送操作:
协议、Filter和中间驱动程序可以调用 NdisCancelSendNetBufferLists 来取消未完成的发送请求。 在发出发送请求之前,这些过度的驱动程序必须使用取消 ID 标记发送数据。
NDIS 调用微型端口驱动程序的 MiniportCancelSend 函数来取消所有标有指定取消标识符的 NET_BUFFER_LIST 结构的传输。
微型端口驱动程序的 MiniportCancelSend 函数执行以下操作:
- 遍历指定适配器的未完成发送请求列表,并调用 NDIS_GET_NET_BUFFER_LIST_CANCEL_ID 以获取每个NET_BUFFER_LIST结构的取消标识符。 微型端口驱动程序将NDIS_GET_NET_BUFFER_LIST_CANCEL_ID返回的取消 ID 与 NDIS 传递给 MiniportCancelSend 的取消 ID 进行比较;
- 从其取消标识符与未完成发送请求列表中指定的取消标识符匹配的所有NET_BUFFER_LIST结构中删除;
- 为所有已取消的NET_BUFFER_LIST结构调用 NdisMSendNetBufferListsComplete 函数以返回结构。微型端口驱动程序将NET_BUFFER_LIST结构的状态字段设置为NDIS_STATUS_SEND_ABORTED;
数据接收
这部分可以参考NDIS驱动开发-NET_BUFFER体系 ,下图演示了微型端口驱动程序接收指示
微型端口驱动程序调用 NdisMIndicateReceiveNetBufferLists 函数来指示从网络接收数据。 NdisMIndicateReceiveNetBufferLists 函数将指示的NET_BUFFER_LIST结构列表传递到堆栈上方的驱动程序。
如果微型端口驱动程序在 NdisMIndicateReceiveNetBufferLists 的 ReceiveFlags 参数中设置NDIS_RECEIVE_FLAGS_RESOURCES标志,则表示微型端口驱动程序必须立即重新获得NET_BUFFER_LIST结构的所有权。 在这种情况下,NDIS 不调用微型端口驱动程序的 MiniportReturnNetBufferLists 函数来返回 NET_BUFFER_LIST 结构。 微型端口驱动程序在 NdisMIndicateReceiveNetBufferLists 返回后立即重新获得所有权。
如果微型端口驱动程序未在 NdisMIndicateReceiveNetBufferLists 的 ReceiveFlags 参数中设置NDIS_RECEIVE_FLAGS_RESOURCES标志,则 NDIS 会将指示NET_BUFFER_LIST结构返回到微型端口驱动程序的 MiniportReturnNetBufferLists 函数。 在这种情况下,微型端口驱动程序放弃所指示结构的所有权,直到 NDIS 将它们返回到 MiniportReturnNetBufferLists 为止。