微型端口驱动程序处理来自过度驱动程序的发送请求,并发出接收指示。 在单个函数调用中,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驱动开发-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 为止。