完成 NDIS 选择性挂起空闲通知

NDIS 调用 MiniportIdleNotification 处理程序函数来通知驱动程序基础网络适配器似乎处于空闲状态。 有关此操作的详细信息,请参阅 处理 NDIS 选择性挂起空闲通知

发出空闲通知后,微型端口驱动程序会在以下条件下完成 NDIS 选择性挂起空闲通知:

  • NDIS 通过调用基础微型端口驱动程序的 MiniportCancelIdleNotification 处理程序函数来取消空闲通知。

  • 微型端口驱动程序完成空闲通知本身。 执行此操作的原因特定于驱动程序和适配器的设计和要求。 例如,如果驱动程序检测到网络适配器上的接收活动,则它可以完成空闲通知。

注意 微型端口驱动程序无法显式取消空闲通知。 当 NDIS 取消空闲通知时,微型端口驱动程序必须按照本主题中所述完成通知。 有关详细信息,请参阅 取消 NDIS 选择性挂起空闲通知

在任一情况下,微型端口驱动程序都必须完成空闲通知才能将适配器恢复为全功率状态。 若要完成空闲通知,微型端口驱动程序必须取消任何特定于总线的 I/O 请求数据包, (IRP) 之前可能已针对空闲通知发出。 最后,驱动程序调用 NdisMIdleNotificationComplete 以通知 NDIS 网络适配器可以转换为全功率状态。

例如,USB 网络适配器的微型端口驱动程序通过以下步骤完成空闲通知:

  1. 微型端口驱动程序取消挂起的 USB 空闲请求 (IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION) IRP。 当 NDIS 调用驱动程序的 MiniportIdleNotification 函数时,微型端口驱动程序以前向基础 USB 总线驱动程序发出了此 IRP。 微型端口驱动程序通过调用 IoCancelIrp 取消此 IRP。

  2. 当总线驱动程序取消 USB 空闲请求 IRP 时,它会为 IRP 调用微型端口驱动程序的完成例程。 此调用通知驱动程序 IRP 已完成,网络适配器可以转换为全电源状态。 在完成例程的上下文中,驱动程序调用 NdisMIdleNotificationComplete 以通知 NDIS 网络适配器可以转换为全功率状态。

    有关如何实现 USB 空闲请求 IRP 完成例程的详细信息,请参阅 实现 USB 空闲请求 IRP 完成例程

注意根据取消特定于总线的空闲请求的依赖项,微型端口驱动程序在调用 MiniportCancelIdleNotification 的上下文中同步调用 NdisMIdleNotificationComplete,或者在 MiniportCancelIdleNotification 返回后异步调用 NdisMIdleNotificationComplete。

在微型端口驱动程序取消空闲通知的任何特定于总线的 IRP 后,它将调用 NdisMIdleNotificationComplete。 此调用通知 NDIS 空闲通知已完成。 然后,NDIS 通过将网络适配器转换为全功率状态来完成选择性挂起操作。

调用 NdisMIdleNotificationComplete 时,NDIS 执行以下步骤:

  1. NDIS 向基础总线驱动程序 发出IRP_MN_SET_POWER 问题。 此 IRP 请求总线驱动程序将网络适配器的电源状态设置为 PowerDeviceD0。

  2. NDIS (OID 发出对象标识符,) 对微型端口驱动程序 OID_PNP_SET_POWER 集请求。 在此 OID 请求中,NDIS 指定网络适配器现在正在转换为 NdisDeviceStateD0 的全功率状态。

    处理此 OID 集请求时,驱动程序将准备适配器以执行全功率操作。 这包括将接收和发送引擎还原到转换到低功耗状态之前的相同状态。 然后,驱动程序使用 NDIS_STATUS_SUCCESS 完成 OID 请求。

下图显示了微型端口驱动程序完成 USB 网络适配器的空闲通知时所涉及的步骤。

说明完成 USB 网络适配器的空闲通知所涉及的步骤的示意图。

注意 微型端口驱动程序完成空闲通知时,不得调用 NdisMIdleNotificationConfirm 获取之前通过调用 NdisMIdleNotificationComplete 完成的空闲通知。