1. ACPI设备检测中的_STA方法缺失问题解析
在ACPI(高级配置与电源管理接口)设备检测过程中,ACPIDetectPdoDevices函数负责枚举和创建设备对象。当该函数调用ACPIGetDevicePresenceSync宏来检查设备存在状态时,系统会尝试执行ACPI命名空间中设备的_STA(Status)方法。但在某些特殊情况下,当_STA方法对象不存在时,系统会意外地为PCI0设备创建PDO(物理设备对象),这个现象背后涉及ACPI规范实现中的几个关键机制。
_STA方法是ACPI规范中用于报告设备状态的标准控制方法,它返回一个32位整数值,其中各比特位表示不同的状态标志(如设备是否存在、是否正常工作等)。按照ACPI 6.4规范第6.3.7节要求,所有设备对象都应实现_STA方法。但实际上,许多嵌入式设备或旧硬件平台的ACPI表经常省略这个方法。
当ACPIGetDevicePresenceSync宏在PCI0设备下找不到_STA方法时,Windows ACPI驱动会按照以下逻辑处理:
- 首先检查_STA是否存在(通过AcpiGetHandle函数)
- 如果不存在,则回退到默认状态检测逻辑
- 默认认为设备存在且功能正常(相当于_STA返回0x0F)
- 继续创建设备PDO
这种处理方式源于ACPI规范中的向后兼容性原则。PCI0作为ACPI命名空间中的关键设备(通常代表主板上的PCI根总线),即使缺少_STA方法,系统也会假设它必须存在,否则整个PCI子系统将无法工作。
2. ACPIDetectPdoDevices函数的工作机制
ACPIDetectPdoDevices是Windows ACPI驱动中的关键函数,主要负责:
- 遍历ACPI命名空间中的设备树
- 通过_STA方法或替代方式确定设备存在状态
- 为存在的设备创建对应的PDO
- 建立设备栈所需的关联关系
当处理PCI0设备时,函数的执行流程如下:
c复制NTSTATUS ACPIDetectPdoDevices(
PDEVICE_OBJECT DeviceObject,
PACPI_PDO_IDENTIFICATION_DESCRIPTOR Desc)
{
// 获取设备ACPI句柄
