ACPI WMI 接口

ACPI WMI 接口是微软对 ACPI 规范的专有扩展,旨在允许硬件供应商在其 ACPI 固件中嵌入 WMI (Windows Management Instrumentation) 对象。通过 ACPI WMI 实现的典型功能包括现代笔记本电脑上的热键事件以及 BIOS 选项的配置。

PNP0C14 ACPI 设备

WMI 对象的发现通过定义 PNP ID 为 PNP0C14 的 ACPI 设备来处理。这些设备将包含一组 ACPI 缓冲区和方法,用于映射和执行 WMI 方法和/或查询。如果存在多个此类设备,则每个设备都必须具有唯一的 ACPI UID。

_WDG 缓冲区

_WDG 缓冲区用于发现 WMI 对象,并且必须是静态的。其内部结构由大小为 20 字节的数据块组成,包含以下数据

偏移量

大小(字节)

内容

0x00

16

128 位 Variant 2 对象 GUID。

0x10

2

2 字符方法 ID 或单字节通知 ID。

0x12

1

对象实例计数。

0x13

1

对象标志。

WMI 对象标志控制是否使用方法 ID 或通知 ID

  • 0x1: 数据块使用成本高,必须显式启用/禁用。

  • 0x2: 数据块包含 WMI 方法。

  • 0x4: 数据块包含 ASCIZ 字符串。

  • 0x8: 数据块描述 WMI 事件,使用通知 ID 而非方法 ID。

每个 WMI 对象 GUID 可以在一个系统中出现多次。方法/通知 ID 用于构建与 WMI 对象交互所使用的 ACPI 方法名称。

WQxx ACPI 方法

如果数据块不包含 WMI 方法,则其内容可以通过此必需的 ACPI 方法检索。ACPI 方法名称的最后两个字符是要查询的数据块的方法 ID。它们的单个参数是一个整数,描述了应查询的实例。如果数据块只包含一个实例,则此参数可以省略。

WSxx ACPI 方法

WQxx ACPI 方法类似,但它是可选的,并接受一个额外的缓冲区作为其第二个参数。实例参数也不能省略。

WMxx ACPI 方法

用于执行与数据块关联的 WMI 方法。ACPI 方法名称的最后两个字符是包含 WMI 方法的数据块的方法 ID。它们的第一个参数是描述应执行方法的实例的整数。第二个参数是描述要执行的 WMI 方法 ID 的整数,第三个参数是包含 WMI 方法参数的缓冲区。如果数据块被标记为包含 ASCIZ 字符串,则此缓冲区应包含 ASCIZ 字符串。ACPI 方法将返回已执行的 WMI 方法的结果。

WExx ACPI 方法

用于可选地启用/禁用 WMI 事件,ACPI 方法的最后两个字符是描述 WMI 事件的数据块的通知 ID 的十六进制值。它们的第一个参数是一个整数,如果 WMI 事件应被禁用,则其值为 0,其他值将启用 WMI 事件。

WCxx ACPI 方法

WExx ACPI 方法类似,但它控制的是数据收集而非事件,因此 ACPI 方法名称的最后两个字符是要启用/禁用数据块的方法 ID。

在设置数据块之前也会调用这些 ACPI 方法,以匹配 Windows 驱动程序的行为。

_WED ACPI 方法

用于检索额外的 WMI 事件数据,其单个参数是一个整数,包含事件的通知 ID。每次收到 ACPI 通知时都应评估此方法,因为某些 ACPI 实现使用队列存储 WMI 事件数据项。如果在收到多个 WMI 事件后未检索到关联的 WMI 事件数据,此队列将会溢出。