1. ACPI构建请求处理机制深度解析
在Windows内核的ACPI驱动中,构建请求的处理是一个复杂而精妙的过程。今天我将带大家深入分析ACPIBuildProcessRunMethodPhaseRunMethod到ACPIBuildProcessRunMethodPhaseRecurse的完整调用链,揭示ACPI驱动如何管理和执行设备初始化方法。
1.1 ACPI构建请求核心结构
首先我们需要了解_ACPI_BUILD_REQUEST这个核心数据结构,它承载了整个构建过程的上下文信息:
c复制typedef struct _ACPI_BUILD_REQUEST {
LIST_ENTRY ListEntry; // 链表指针
ULONG Signature; // 签名标识('GPGS')
union {
ULONG Flags; // 标志位
struct {
ULONG Device : 1; // 设备请求标志
ULONG Sync : 1; // 同步标志
ULONG Run : 1; // 运行方法标志
ULONG ReleaseReference : 1; // 释放引用标志
// ...其他标志位
} UFlags;
};
ULONG WorkDone; // 当前工作状态
ULONG CurrentWorkDone; // 已完成的工作阶段
ULONG NextWorkDone; // 下一工作阶段
PVOID BuildContext; // 构建上下文(通常指向设备扩展)
LONG Status; // 状态码
// ...其他字段
} ACPI_BUILD_REQUEST;
从调试信息中我们可以看到,当断点命中时,寄存器状态如下:
code复制eax=00000005 ebx=00000005 ecx=89906798 edx=00000001
esi=89906788 edi=80b019f4 eip=f73fbcf2 esp=f78aef64
ebp=f78aef84
关键指针BuildRequest = 0x89906788指向当前请求结构,通过dt命令可以查看其完整内容。特别值得注意的是RunRequest.ControlMethodName字段显示为"_INI",这表明当前正在处理ACPI的初始化方法。
1.2 工作阶段状态机
ACPI构建请求的处理本质上是一个状态机,通过WorkDone、CurrentWorkDone和NextWorkDone三个字段协同工作:
c复制typedef enum _WORK_DONE {
WORK_DONE_COMPLETE = 0, // 完成状态
WORK_DONE_PENDING, // 挂起状态
WORK_DONE_FAILURE,
