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

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

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

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

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

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

提供了完成函数用于以下目的:

  • 设置和查询配置。

  • 重置硬件。

  • 显示状态。

  • 显示已接收的数据。

  • 传输收到的数据。