1. ACPI!ReadFieldObj函数深度解析:Device (PE70)处理机制揭秘
在ACPI驱动开发领域,ReadFieldObj函数作为关键操作接口,负责处理设备对象的字段读取请求。最近在分析Device (PE70)的初始化流程时,发现其第二阶段处理与ACPI!AccessFieldData调用存在精妙的交互机制。这个发现对于理解ACPI驱动如何管理设备字段访问至关重要——特别是当pafo->dwData被填充后,整个设备状态机就会发生关键转变。
本文将基于实际逆向工程案例,拆解ReadFieldObj函数对PE70设备的处理逻辑。你会看到完整的调用栈分析、数据结构演变过程,以及最重要的——为什么AccessFieldData调用后的dwData赋值会成为整个流程的转折点。这些内容来自对Windows ACPI.sys驱动模块的深度剖析,所有地址和偏移量都基于最新内核版本验证。
2. PE70设备处理的两阶段模型
2.1 第一阶段:ACPI!ReadFieldObj的初始调用
当ACPI驱动首次处理PE70设备时,ReadFieldObj函数会执行标准化的字段读取流程。通过内核调试器跟踪,我们可以看到典型的调用参数结构:
c复制typedef struct _ACPI_READ_FIELD_CTX {
PACPI_DEVICE pDevice; // 指向PE70设备对象
ULONG fieldOffset; // 字段偏移量
PVOID pBuffer; // 输出缓冲区
SIZE_T bufferSize; // 缓冲区大小
} ACPI_READ_FIELD_CTX;
在这个阶段,函数主要完成三项关键操作:
- 验证设备状态(检查PE70的_STA返回值)
- 建立字段访问路径(解析_PRT下的字段定义)
- 准备AccessFieldData调用环境(初始化pafo结构体)
重要提示:此时pafo->dwData尚未被赋值,所有字段数据都保持初始零值。这是后续第二阶段能被触发的前提条件。
2.2 第二阶段触发条件与状态转换
当第一次ReadFieldObj调用完成后,ACPI
