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 事件数据,此队列将会溢出。