处理协议驱动程序中的 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_ATTRIBUTES的 PowerManagementCapabilities 成员设置为 NULL,NDIS 将 NDIS_BIND_PARAMETERS 的 PowerManagementCapabilities 成员设置为 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 传递给 ProtocolNetPnPEvent 的 ProtocolBindingContext 参数指定绑定 .)
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 的调用。