NDIS小端口驱动开发(三)

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

相关推荐
亽仒凣凣1 小时前
Windows安装Redis图文教程
数据库·windows·redis
炫彩@之星2 小时前
Windows和Linux安全配置和加固
linux·windows·安全·系统安全配置和加固
小奥超人2 小时前
RAR压缩算法的文件修复功能详解
windows·经验分享·winrar·办公技巧
疯狂飙车的蜗牛8 小时前
从零玩转CanMV-K230(4)-小核Linux驱动开发参考
linux·运维·驱动开发
Clockwiseee12 小时前
php伪协议
windows·安全·web安全·网络安全
njnu@liyong12 小时前
图解HTTP-HTTP报文
网络协议·计算机网络·http
唐宋元明清218814 小时前
.NET 阻止系统睡眠/息屏
windows·电源
kaixin_learn_qt_ing14 小时前
了解RPC
网络·网络协议·rpc
yylの博客16 小时前
Windows通过git-bash安装zsh
windows·git·bash·zsh
爱吃水果蝙蝠汤16 小时前
DATACOM-IP单播路由(BGP)-复习-实验
网络·网络协议·tcp/ip