网络驱动程序中的异步 I/O 和 Completion 函数

延迟是某些网络操作固有的。 由于这种延迟,微型端口驱动程序提供的许多上边缘函数和协议驱动程序的下边缘函数旨在支持异步操作。 网络驱动程序依赖于异步处理大多数操作的能力,而不是浪费 CPU 周期等待一些耗时的任务完成或硬件事件发出信号。

使用 完成 函数支持异步网络 I/O。 以下示例演示如何将完成函数用于网络 发送 操作,但对于协议或微型端口驱动程序执行的许多其他操作,也存在相同的机制。

当协议驱动程序调用 NDIS 发送数据包时,导致调用微型端口驱动程序的 MiniportSendNetBufferLists 函数时,微型端口驱动程序可以尝试立即完成此请求,并返回相应的状态值作为结果。 对于同步操作,NDIS_STATUS_SUCCESS成功完成发送、NDIS_STATUS_RESOURCES和指示某种故障NDIS_STATUS_FAILURE可能的响应。

但是,当微型端口驱动程序 (或 NDIS) 将数据包排队并等待 NIC 指示发送操作的结果时,发送操作可能需要一些时间才能完成。 微型端口驱动程序 MiniportSendNetBufferLists 函数可以通过返回状态值NDIS_STATUS_PENDING异步处理此操作。 当微型端口驱动程序完成发送操作时,它会调用完成函数 NdisMSendNetBufferListsComplete,并将指针传递到已发送的数据包描述符。 此信息将传递到协议驱动程序,发出完成信号。

大多数可能需要较长时间才能完成的驱动程序操作都支持使用类似完成函数的异步操作。 此类函数的名称形式为 NdisMXxxComplete

完成函数也提供给:

  • 设置和查询配置。

  • 重置硬件。

  • 指示状态。

  • 指示收到的数据。

  • 传输接收的数据。