PEP 的 AcceptAcpiNotification 回调例程接收的每个 ACPI 通知都附带一个通知参数,该参数指示通知的类型,以及指向包含指定通知类型信息的数据结构的数据参数。
在此调用中,Notification 参数设置为指示通知类型的PEP_NOTIFY_ACPI_XXX常量值。 Data 参数指向与此通知类型关联的PEP_ACPI_XXX结构类型。
AcceptAcpiNotification 回调例程使用以下 ACPI 通知 ID。
| 通知标识符 | 价值 | 关联结构 |
|---|---|---|
| ACPI设备准备通知 | 0x01 | PEP_ACPI_PREPARE_DEVICE |
| PEP_NOTIFY_ACPI_ABANDON_DEVICE | 0x02 | PEP_ACPI_ABANDON_DEVICE |
| PEP_NOTIFY_ACPI_REGISTER_DEVICE | 0x03 | PEP_ACPI_REGISTER_DEVICE |
| PEP_NOTIFY_ACPI_UNREGISTER_DEVICE | 0x04 | PEP_ACPI_UNREGISTER_DEVICE |
| PEP_NOTIFY_ACPI_ENUMERATE_DEVICE_NAMESPACE | 0x05 | PEP_ACPI_ENUMERATE_DEVICE_NAMESPACE |
| PEP_NOTIFY_ACPI_QUERY_OBJECT_INFORMATION | 0x06 | PEP_ACPI_查询对象信息 |
| PEP_NOTIFY_ACPI_评估控制方法 | 0x07 | PEP_ACPI_EVALUATE_CONTROL_METHOD |
| PEP_NOTIFY_ACPI_查询_设备控制_资源 | 0x08 | PEP_ACPI_QUERY_DEVICE_CONTROL_RESOURCES |
| PEP_NOTIFY_ACPI_TRANSLATED_DEVICE_CONTROL_RESOURCES | 0x09 | PEP_ACPI_设备控制资源翻译 |
PEP_NOTIFY_ACPI_PREPARE_DEVICE
通知:参数PEP_NOTIFY_ACPI_PREPARE_DEVICE。 数据:指向按名称标识设备的PEP_ACPI_PREPARE_DEVICE结构的指针。
允许 PEP 选择是否为设备提供 ACPI 服务。
当 Windows ACPI 驱动程序在设备枚举期间发现 ACPI 命名空间中的新设备时,Windows 电源管理框架(PoFx)会发送此通知。 此通知将发送到实现 AcceptAcpiNotification 回调例程的 PEP。
若要发送PEP_NOTIFY_ACPI_PREPARE_DEVICE通知,PoFx 调用 PEP 的 AcceptAcpiNotification 例程。 在此调用中,通知参数值PEP_NOTIFY_ACPI_PREPARE_DEVICE,Data 参数指向包含设备名称的PEP_ACPI_PREPARE_DEVICE结构。 如果 PEP 准备为此设备提供 ACPI 服务,PEP 会将此结构的 DeviceAccepted 成员设置为 TRUE。 若要拒绝提供此类服务,PEP 会将此成员设置为 FALSE。
如果 PEP 指示(通过设置 DeviceAccepted = TRUE)它已准备好为设备提供ACPI服务,PoFx 将通过发送PEP_NOTIFY_ACPI_REGISTER_DEVICE通知给PEP,以注册PEP成为该设备的唯一ACPI服务提供者来响应。 PoFx 期望只有一个 PEP 能够担任设备的 ACPI 服务提供者角色。
最佳做法是不要对PEP_NOTIFY_ACPI_PREPARE_DEVICE通知执行任何设备初始化。 相反,请延迟此初始化,直到收到设备的PEP_NOTIFY_ACPI_REGISTER_DEVICE通知或为设备调用 ACPI 控制方法(例如,_INI)。
对于PEP_NOTIFY_ACPI_PREPARE_DEVICE通知,始终在IRQL=PASSIVE_LEVEL调用AcceptAcpiNotification例程。
PEP_NOTIFY_ACPI_ABANDON_DEVICE
通知:值PEP_NOTIFY_ACPI_ABANDON_DEVICE。
数据:指向PEP_ACPI_ABANDON_DEVICE结构的指针,该结构用于标识已被放弃的设备。
通知 PEP 指定的设备已被遗弃,不再需要 PEP 的 ACPI 服务。
Windows 电源管理框架(PoFx)发送此通知,告知 PEP 设备不再由操作系统使用。 PEP 可以使用此通知来清理已分配用于跟踪设备状态的任何内部存储。
若要发送PEP_NOTIFY_ACPI_ABANDON_DEVICE通知,PoFx 调用 PEP 的 AcceptAcpiNotification 回调例程。 在此调用中,通知参数的值为:PEP_NOTIFY_ACPI_ABANDON_DEVICE,数据参数指向:PEP_ACPI_ABANDON_DEVICE结构。
PoFx 仅将此通知发送到已选择在以前的PEP_NOTIFY_ACPI_PREPARE_DEVICE通知中为设备提供 ACPI 服务的 PEP。 如果 PEP 已在之前的 PEP_NOTIFY_ACPI_REGISTER_DEVICE 通知中注册以提供这些服务,PoFx 会在发送 PEP_NOTIFY_ACPI_ABANDON_DEVICE 通知之前,为设备发送 PEP_NOTIFY_ACPI_UNREGISTER_DEVICE 通知。
对于 PEP_NOTIFY_ACPI_ABANDON_DEVICE 通知,AcceptAcpiNotification 例程始终在 IRQL = PASSIVE_LEVEL 调用。
PEP_NOTIFY_ACPI_REGISTER_DEVICE
通知:值PEP_NOTIFY_ACPI_REGISTER_DEVICE。
数据:指向标识设备的PEP_ACPI_REGISTER_DEVICE结构的指针。 为了响应此通知,PEP 应创建有效的 PEPHANDLE 值来标识设备并将此句柄值写入结构。
将 PEP 注册为唯一为指定设备提供 ACPI 服务的提供者。
Windows 电源管理框架(PoFx)将此通知发送给已在先前 PEP_NOTIFY_ACPI_PREPARE_DEVICE 通知中表明准备为指定设备提供 ACPI 服务的 PEP。
若要发送PEP_NOTIFY_ACPI_REGISTER_DEVICE通知,PoFx 调用 PEP 的 AcceptAcpiNotification 例程。 在此调用中,“通知”参数的值为“PEP_NOTIFY_ACPI_REGISTER_DEVICE”,“数据”参数指向一个“PEP_ACPI_REGISTER_DEVICE”结构,该结构用于标识PEP要为其提供ACPI服务的设备。
对于 PEP_NOTIFY_ACPI_REGISTER_DEVICE 通知,AcceptAcpiNotification 例程总是在 IRQL = PASSIVE_LEVEL 调用。
PEP_NOTIFY_ACPI_UNREGISTER_DEVICE
通知:值为 PEP_NOTIFY_ACPI_UNREGISTER_DEVICE。
数据:指向PEP_ACPI_UNREGISTER_DEVICE结构的指针,该结构包含设备的PEPHANDLE。
取消 PEP 中 ACPI 服务的指定设备的注册。
为了响应此通知,PEP 可以销毁在之前的 PEP_NOTIFY_ACPI_REGISTER_DEVICE 通知中为此设备创建的 PEPHANDLE。
若要发送PEP_NOTIFY_ACPI_UNREGISTER_DEVICE通知,PoFx 调用 PEP 的 AcceptAcpiNotification 回调例程。 在此调用中,通知参数的值为PEP_NOTIFY_ACPI_UNREGISTER_DEVICE,数据参数指向PEP_ACPI_UNREGISTER_DEVICE结构体。
对于 PEP_NOTIFY_ACPI_UNREGISTER_DEVICE 通知,AcceptAcpiNotification 例程始终在 IRQL = PASSIVE_LEVEL 调用。
PEP_NOTIFY_ACPI_ENUMERATE_DEVICE_NAMESPACE
通知:值PEP_NOTIFY_ACPI_ENUMERATE_DEVICE_NAMESPACE。
数据:指向PEP_ACPI_ENUMERATE_DEVICE_NAMESPACE结构的指针,该结构包含设备的 ACPI 命名空间中的对象的枚举。
查询 PEP,了解 ACPI 命名空间中指定设备支持的 ACPI 对象(本机方法)列表。
Windows ACPI 驱动程序使用此通知枚举的对象为指定设备生成命名空间。 此后,在引用此设备时,ACPI 驱动程序将仅针对这些对象查询 PEP。
发现设备后不久,Windows 电源管理框架(PoFx)将发送PEP_NOTIFY_ACPI_ENUMERATE_DEVICE_NAMESPACE通知,PEP 寄存器为设备提供 ACPI 服务。 有关此注册的详细信息,请参阅PEP_NOTIFY_ACPI_REGISTER_DEVICE。
若要发送PEP_NOTIFY_ACPI_ENUMERATE_DEVICE_NAMESPACE通知,PoFx 调用 PEP 的 AcceptAcpiNotification 回调例程。 在此调用中,通知参数的值为PEP_NOTIFY_ACPI_ENUMERATE_DEVICE_NAMESPACE,数据参数则指向PEP_ACPI_ENUMERATE_DEVICE_NAMESPACE结构体。
AcceptAcpiNotification 例程应处理PEP_NOTIFY_ACPI_ENUMERATE_DEVICE_NAMESPACE通知并返回 TRUE。 否则会导致错误检查。
对于 PEP_NOTIFY_ACPI_ENUMERATE_DEVICE_NAMESPACE 通知,AcceptAcpiNotification 例程始终在 IRQL = PASSIVE_LEVEL 调用。
PEP_NOTIFY_ACPI_QUERY_OBJECT_INFORMATION
通知:值为 PEP_NOTIFY_ACPI_QUERY_OBJECT_INFORMATION。
数据:指向一个 PEP_ACPI_QUERY_OBJECT_INFORMATION 结构的指针,该结构用于指定 ACPI 对象的属性。
查询 PEP 以获取有关以前枚举的 ACPI 对象的信息。
Windows 电源管理框架(PoFx)发送此通知,用于查询 PEP,以获取在处理先前 PEP_NOTIFY_ACPI_ENUMERATE_DEVICE_NAMESPACE 通知期间枚举的对象的属性。 目前,枚举的唯一对象是控制方法。
若要发送PEP_NOTIFY_ACPI_QUERY_OBJECT_INFORMATION通知,PoFx 调用 PEP 的 AcceptAcpiNotification 回调例程。 在此调用中,通知参数值为PEP_NOTIFY_ACPI_QUERY_OBJECT_INFORMATION,数据参数指向一个PEP_ACPI_QUERY_OBJECT_INFORMATION结构体。
对于PEP_NOTIFY_ACPI_QUERY_OBJECT_INFORMATION通知,AcceptAcpiNotification 例程始终在 IRQL = PASSIVE_LEVEL调用。
PEP_NOTIFY_ACPI_评估控制方法
通知:值为PEP_NOTIFY_ACPI_EVALUATE_CONTROL_METHOD。
数据:指向PEP_ACPI_EVALUATE_CONTROL_METHOD结构的指针,该结构指定要计算的 ACPI 控制方法、要提供给此方法的输入参数以及结果的输出缓冲区。
用于评估 PEP 是已注册处理程序的 ACPI 控制方法。
当 Windows ACPI 驱动程序需要评估 PEP 实现的 ACPI 控制方法时,Windows 电源管理框架 (PoFx) 会将此通知发送到 PEP。
若要发送PEP_NOTIFY_ACPI_EVALUATE_CONTROL_METHOD通知,PoFx 调用 PEP 的 AcceptAcpiNotification 回调例程。 在此调用中,通知参数值PEP_NOTIFY_ACPI_EVALUATE_CONTROL_METHOD,数据参数指向PEP_ACPI_EVALUATE_CONTROL_METHOD结构。
平台设计器可以选择是让 PEP 还是 ACPI 固件处理特定的 ACPI 控制方法。 如果 PEP 是 ACPI 控制方法的已注册处理程序,PoFx 会响应来自 Windows ACPI 驱动程序的请求,以便通过向 PEP 发送PEP_NOTIFY_ACPI_EVALUATE_CONTROL_METHOD通知来评估此方法。
下面是 PEP 可为设备处理的 ACPI 控制方法示例列表:
设备标识和配置:_HID、_CID、_UID、_ADR、_CLS、_SUB、_CRS、_PRS等。 设备电源管理和唤醒:_PS0到_PS3、_PR0到_PR3、_DSW等。 特定于设备的方法:_DSM和任何特定于设备堆栈的控制方法。 对于特殊设备(如 ACPI 时间和警报设备),此通知用于评估时间和警报方法(_GCP、_GRT、_SRT等)。
对于 PEP_NOTIFY_ACPI_EVALUATE_CONTROL_METHOD 通知,AcceptAcpiNotification 例程始终在 IRQL = PASSIVE_LEVEL 被调用。
PEP_NOTIFY_ACPI_查询_设备控制_资源
通知:值PEP_NOTIFY_ACPI_QUERY_DEVICE_CONTROL_RESOURCES。
数据:指向包含电源资源列表的PEP_ACPI_QUERY_DEVICE_CONTROL_RESOURCES结构的指针。
查询 PEP,获取控制设备电源所需的原始资源列表。
为了响应此通知,PEP 提供了控制设备电源所需的原始资源列表。 Windows ACPI 驱动程序需要此列表,以便它可以保留设备所需的电源资源,并向 PEP 提供相应的已翻译资源列表(通过发送PEP_NOTIFY_ACPI_TRANSLATED_DEVICE_CONTROL_RESOURCES通知)。 有关详细信息,请参阅原始资源和已翻译的资源。
若要发送PEP_NOTIFY_ACPI_QUERY_DEVICE_CONTROL_RESOURCES通知,Windows 电源管理框架(PoFx)调用 PEP 的 AcceptAcpiNotification 回调函数。 在此调用中,通知参数值为 PEP_NOTIFY_ACPI_QUERY_DEVICE_CONTROL_RESOURCES,数据参数指向 PEP_ACPI_QUERY_DEVICE_CONTROL_RESOURCES 结构体。
对于 PEP_NOTIFY_ACPI_QUERY_DEVICE_CONTROL_RESOURCES 通知,在 IRQL = PASSIVE_LEVEL 时始终调用 AcceptAcpiNotification 例程。
PEP_NOTIFY_ACPI_TRANSLATED_DEVICE_CONTROL_RESOURCES
通知:值PEP_NOTIFY_ACPI_TRANSLATED_DEVICE_CONTROL_RESOURCES。
数据:指向PEP_ACPI_TRANSLATED_DEVICE_CONTROL_RESOURCES结构的指针,此结构包含已翻译资源列表。
为 PEP 提供用于设备所需的任何电源控制资源的转译资源列表。
Windows 电源管理框架(PoFx)会发送此通知,如果 PEP 在响应之前的 PEP_NOTIFY_ACPI_QUERY_DEVICE_CONTROL_RESOURCES 通知时列出了任何原始资源。 PEP_NOTIFY_ACPI_TRANSLATED_DEVICE_CONTROL_RESOURCES 通知为 PEP 提供了对应的已翻译资源列表。 有关详细信息,请参阅原始资源和已翻译的资源。
要发送 PEP_NOTIFY_ACPI_TRANSLATED_DEVICE_CONTROL_RESOURCES 通知,PoFx 会调用 PEP 的 AcceptAcpiNotification 回调例程。 在此调用中,通知参数值为PEP_NOTIFY_ACPI_TRANSLATED_DEVICE_CONTROL_RESOURCES,数据参数指向PEP_ACPI_TRANSLATED_DEVICE_CONTROL_RESOURCES结构。
对于 PEP_NOTIFY_ACPI_TRANSLATED_DEVICE_CONTROL_RESOURCES 通知,AcceptAcpiNotification 例程总是在 IRQL = PASSIVE_LEVEL 上调用。
PEP_NOTIFY_ACPI_WORK
通知:值 PEP_NOTIFY_ACPI_WORK。
数据:指向PEP_WORK结构的指针。
每次 PEP 调用 RequestWorker 例程以请求来自 Windows 电源管理框架(PoFx)的工作项时,该项被发送到 PEP。 此通知仅用于 ACPI 相关工作。
PEP 调用 RequestWorker 例程以请求工作项后,PoFx 会通过发送 PEP PEP_NOTIFY_ACPI_WORK 通知来响应。 但是,在处理工作项所需的资源(即工作线程)可用之前,不会发送此通知。 通过这种方式,PoFx 保证 PEP 在通知期间传递给 PoFx 的工作请求绝不会因资源不足而失败。
在输入时,PEP 应假定 PEP_WORK 结构未初始化。 若要处理此通知,PEP 应将 WorkInformation 成员设置为指向由 PEP 分配的 PEP_WORK_INFORMATION 结构,该结构描述所请求的工作内容。 此外,PEP 应将 PEP_WORK 结构的 NeedWork 成员设置为 TRUE,以确认 PEP 已处理 PEP_NOTIFY_ACPI_WORK 通知,并且 WorkInformation 成员指向有效的 PEP_WORK_INFORMATION 结构。 如果 PEP 无法处理通知或者无法分配 PEP_WORK_INFORMATION 结构体,PEP 应将 WorkInformation 成员设置为 NULL,并将 NeedWork 成员设置为 FALSE。
对于 PEP_NOTIFY_ACPI_WORK 通知,总是要在 IRQL = PASSIVE_LEVEL下调用 AcceptAcpiNotification 例程。