中间驱动程序网络数据管理
中间驱动程序从更高级别驱动程序接收 NET_BUFFER_LIST 结构,其中包含一个或多个关联的 MDL,以便通过网络发送。 如果驱动程序具有无连接的下边缘,中间驱动程序可以通过调用 NdisSendNetBufferLists 将数据传递到基础驱动程序;如果驱动程序具有面向连接的下边缘,则通过调用 NdisCoSendNetBufferLists 。 或者,中间驱动程序可以采取一些操作来修改链接缓冲区的内容或传入数据相对于其他传输的顺序或计时。
根据中间驱动程序的用途,此类驱动程序可以重新打包链接到传入NET_BUFFER_LIST结构的缓冲区。 例如,在以下情况下,中间驱动程序会重新打包网络数据:
与通过基础介质在单个缓冲区中发送的数据缓冲区相比,中间驱动程序从过度协议驱动程序接收的数据缓冲区更大。 因此,中间驱动程序必须将传入数据划分为较小的缓冲区。
中间驱动程序通过在将每次发送转发到基础驱动程序之前压缩或加密数据来更改网络数据的长度或内容。
有关创建网络数据管理的信息,请参阅 协议驱动程序缓冲区管理。
NDIS 提供用于克隆和分段 NET_BUFFER_LIST 结构的接口。 有关克隆和碎片结构的详细信息,请参阅 派生NET_BUFFER_LIST结构。
可以根据需要在驱动程序初始化时或在 ProtocolBindAdapterEx 函数中分配NET_BUFFER_LIST结构。 如有必要,出于性能原因,中间驱动程序开发人员可以在初始化时分配一些结构,以便 ProtocolReceiveNetBufferLists 具有预先分配的资源,以便将传入数据复制到其中以指示给更高级别的驱动程序,并且 MiniportSendNetBufferLists 具有可用的 NET_BUFFER_LIST 结构 (,并且可能还有缓冲区) 将传入的发送网络数据传递到下一个较低的驱动程序。
如果中间驱动程序将数据或接收的数据复制到新的缓冲区或缓冲区,并且最后一个缓冲区中实际数据的长度小于缓冲区的分配长度,则中间驱动程序可以调用 NdisAdjustMdlLength ,以将缓冲区调整为数据的实际长度。
具有无连接下边缘的中间驱动程序始终从其 ProtocolReceiveNetBufferLists 函数接收来自基础微型端口适配器的传入数据。
具有面向连接的下边缘的中间驱动程序始终从其 ProtocolCoReceiveNetBufferLists 函数接收来自基础微型端口适配器的传入数据。