处理协议驱动程序中的 PnP 事件和电源管理事件

当操作系统向表示网络接口卡 (NIC) 的目标设备对象发出即插即用 (PnP) I/O 请求数据包 (IRP) 或电源管理 IRP 时,NDIS 会截获该 IRP。 NDIS 通过调用驱动程序的 ProtocolNetPnPEvent 函数,向每个绑定协议驱动程序和每个绑定中间驱动程序指示事件。 在对 ProtocolNetPnPEvent 的调用中,NDIS 传递指向包含NET_PNP_EVENT结构的 NET_PNP_EVENT_NOTIFICATION 的指针。 NET_PNP_EVENT结构描述要指示的 PnP 事件或电源管理事件。 有关协议驱动程序 PnP 接口的详细信息,请参阅 处理协议驱动程序中的 PnP 事件通知

以下列表包含 PnP 和电源管理事件,如 NET_PNP_EVENT 结构中的 NetEvent 代码所示:

  • NetEventSetPower

    指示设置电源请求,该请求指定微型端口适配器应转换为特定电源状态。 电源管理感知协议驱动程序应始终通过返回NDIS_STATUS_SUCCESS成功此事件。 旧的协议驱动程序可以返回NDIS_STATUS_NOT_SUPPORTED,以指示 NDIS 应将其与微型端口适配器取消绑定。

    发出设置电源请求后,如果微型端口适配器正在转换为低功耗状态,NDIS 将暂停驱动程序堆栈。 如果微型端口适配器正在转换为工作状态 (D0) ,则在设置电源请求之前,NDIS 会重启驱动程序堆栈。 有关暂停和重启驱动程序堆栈的详细信息,请参阅 暂停驱动程序堆栈

    如果微型端口适配器处于低功耗状态,则协议驱动程序无法发出任何 OID 请求。 此要求是额外的电源管理限制,在驱动程序堆栈处于“已暂停”状态时,将添加到其他限制中。

    如果基础微型端口适配器无法识别电源管理,微型端口驱动程序会将NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTESPowerManagementCapabilities 成员设置为 NULL,NDIS 将 NDIS_BIND_PARAMETERSPowerManagementCapabilities 成员设置为 NULL

    注意 从 NDIS 6.30 开始,在收到此事件的通知后,协议驱动程序必须停止生成新的 I/O 请求,并且不应等待调用 ProtocolNetPnPEvent 的上下文中任何挂起的 I/O 请求完成。

    有关设置电源事件的详细信息,请参阅 在中间驱动程序中处理 PnP 事件和电源管理事件

  • NetEventQueryPower

    指示查询电源请求,该请求查询基础微型端口适配器是否可以转换到特定电源状态。 协议驱动程序应始终成功 NetEventQueryPower 。 建立活动连接后,协议驱动程序可以调用 PoRegisterSystemState 来注册连续忙状态。 只要状态注册生效,电源管理器就不会尝试使系统进入睡眠状态。 连接变为非活动状态后,协议驱动程序通过调用 PoUnregisterSystemState 取消状态注册。 协议驱动程序绝不应尝试通过使 NetEventQueryRemoveDevice 失败来阻止系统转换到睡眠状态。 请注意, NetEventQueryPower 始终后跟 NetEventSetPower。 设置设备当前电源状态的 NetEventSetPower 将取消 NetEventQueryPower

    注意 从 NDIS 6.30 开始,在收到此事件的通知后,协议驱动程序不应在调用 ProtocolNetPnPEvent 的上下文中等待任何挂起的 I/O 请求完成。

  • NetEventQueryRemoveDevice

    指示查询删除设备请求,该请求查询是否可以在不中断操作的情况下删除 NIC。 例如,如果协议驱动程序无法释放设备 (,因为设备正在使用) ,则必须通过返回NDIS_STATUS_FAILURE来使 NetEventQueryRemoveDevice 失败。

  • NetEventCancelRemoveDevice

    指示取消删除设备请求,该请求取消删除基础 NIC。 协议驱动程序应始终通过返回NDIS_STATUS_SUCCESS成功此事件。

  • NetEventReconfigure

    指示网络组件的配置已更改。 例如,如果用户更改 TCP/IP 的 IP 地址,NDIS 会使用 NetEventReconfigure 代码向 TCP/IP 协议指示此事件。 在极少数情况下,如果协议驱动程序无法应用指示的配置更改并且没有可用的默认值,则可能会返回失败代码。 分配内存的失败尝试是协议返回失败代码的一个示例。 返回错误代码可能会导致提示用户重启系统。

    协议应验证传递给其 ProtocolNetPnPEvent 函数的 NetEventReconfigure 相关数据。 有关此类数据的详细信息,请参阅 协议驱动程序NET_PNP_EVENT

  • NetEventBindList

    向协议驱动程序指示其绑定列表处理顺序已重新配置。 此列表指示在处理时应用于协议绑定的相对顺序,例如,可能路由到多个绑定之一的用户请求。 随此事件一起传递的缓冲区包含以 NULL 结尾的 Unicode 字符串格式的设备名称列表。 每个设备名称的格式与传递给 ProtocolBindAdapterEx 调用的 DeviceName 参数相同。

    协议应验证传递给其 ProtocolNetPnPEvent 函数的 NetEventBindList 相关数据。 有关此类数据的详细信息,请参阅 协议驱动程序NET_PNP_EVENT

    协议应验证传递给其 ProtocolNetPnPEvent 函数的 NetEventBindList 相关数据。 有关此类数据的详细信息,请参阅 协议驱动程序NET_PNP_EVENT

  • NetEventBindsComplete

    指示协议驱动程序已绑定到它可以绑定到的所有 NIC。 除非将 PnP NIC 插入系统,否则 NDIS 不会指示与协议驱动程序的更多绑定。

  • NetEventPnPCapabilities

    指示用户启用或禁用基础适配器的唤醒功能。 (NDIS 传递给 ProtocolNetPnPEventProtocolBindingContext 参数指定绑定 .)

  • NetEventPause

    指示指定的协议绑定应进入暂停状态。 NDIS 完成绑定的所有未完成发送请求后,绑定将进入“已暂停”状态。 有关暂停绑定的详细信息,请参阅 暂停绑定

  • NetEventRestart

    指示指定的协议绑定已进入“正在重启”状态。 协议驱动程序准备好恢复绑定的发送和接收操作后,绑定将进入“正在运行”状态。 有关重启绑定的详细信息,请参阅 重启绑定

  • NetEventPortActivation

    指示激活与指定绑定关联的端口列表。 有关暂停绑定的详细信息,请参阅 处理端口激活 PnP 事件

  • NetEventPortDeactivation

    指示停用与指定绑定关联的端口列表。 有关暂停绑定的详细信息,请参阅 处理端口停用 PnP 事件

  • NetEventIMReEnableDevice

    指示已更改 NDIS 6.0 或更高版本中间驱动程序的虚拟微型端口的配置。 NetEventIMReEnableDevice 类似于 NetEventReconfigure 事件,不同之处在于中间驱动程序接收单个虚拟微型端口的此事件, NetEventReconfigure 事件应用于所有中间驱动程序的虚拟微型端口。 例如,当用户禁用然后从设备管理器或其他源启用单个虚拟微型端口时,中间驱动程序会收到 NetEventIMReEnableDevice 事件。 有关中间驱动程序电源管理的示例,请参阅 GitHub 上的 Windows 驱动程序示例存储库中提供的 NDIS MUX 中间驱动程序和通知对象驱动程序示例

NET_PNP_EVENT 结构的 Buffer 成员指向包含特定于所指示事件的信息的缓冲区。

协议驱动程序可以使用 NdisCompleteNetPnPEvent 异步完成对 ProtocolNetPnPEvent 的调用。