1. ACPI核心函数调用链解析
在Windows内核中,ACPI子系统负责处理高级配置与电源管理接口的底层交互。当用户空间程序或驱动程序需要执行ACPI方法时,会触发一系列关键函数调用。这个调用链从ACPIBuildRunMethodRequest开始,经过多个关键环节最终完成ACPI操作。
1.1 ACPIBuildRunMethodRequest函数入口
ACPIBuildRunMethodRequest是ACPI方法执行的起点,主要负责构造方法调用请求。这个函数会执行以下关键操作:
- 参数验证:检查输入参数的有效性,包括方法名、参数列表和调用上下文
- 内存分配:为ACPI请求分配非分页池内存
- 请求结构初始化:填充ACPI_EVALUATE_CONTROL结构体
- 安全校验:验证调用者是否有权限执行目标方法
典型的调用示例如下:
c复制NTSTATUS status = ACPIBuildRunMethodRequest(
&request,
"\\_SB.PCI0.LPCB.EC0.FAN1",
&inputArgs,
&outputBufferSize);
1.2 ACPIGet函数的核心作用
ACPIGet函数负责从ACPI命名空间中获取指定对象。其内部实现涉及:
- 命名空间解析:将ACPI路径分解为各个节点
- 对象查找:在ACPI命名空间树中递归查找目标对象
- 类型检查:验证找到的对象是否与方法调用兼容
- 引用计数管理:增加对象引用计数防止意外释放
这个函数常见的返回状态包括:
- STATUS_SUCCESS:成功找到目标对象
- STATUS_ACPI_INVALID_NAME:无效的ACPI路径
- STATUS_ACPI_INVALID_OBJECT_TYPE:对象类型不匹配
2. ACPI方法执行流程详解
2.1 PushCall与ParseCall的协作机制
PushCall和ParseCall函数共同构成了ACPI方法的解析和执行引擎:
PushCall的工作流程:
- 创建新的执行上下文环境
- 压入当前执行状态到调用栈
- 准备方法参数和局部变量空间
- 设置程序计数器指向方法入口
