news 2026/8/10 10:43:42

ACPI!ACPIBuildProcessDevicePhasePsc函数分析对节点iSA的处理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ACPI!ACPIBuildProcessDevicePhasePsc函数分析对节点iSA的处理

ACPI!ACPIBuildProcessDevicePhasePsc函数分析对节点iSA的处理

1: kd> g
Breakpoint 5 hit
eax=00000016 ebx=00000016 ecx=89984198 edx=00000001 esi=89984188 edi=80b019f4
eip=f73fb911 esp=f78aef68 ebp=f78aef84 iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
ACPI!ACPIBuildProcessGenericList+0x4d:
f73fb911 ff55f4 call dword ptr [ebp-0Ch] ss:0010:f78aef78={ACPI!ACPIBuildProcessDevicePhasePsc (f73fb57c)}
1: kd> kc
#
00 ACPI!ACPIBuildProcessDevicePhasePsc
01 ACPI!ACPIBuildProcessGenericList
02 ACPI!ACPIBuildDeviceDpc
03 nt!KiRetireDpcList
04 nt!KiDispatchInterrupt
WARNING: Frame IP not in any known module. Following frames may be wrong.
05 0x0
1: kd> dv
BuildRequest = 0x89984188
matrixIndex = 0n8 (No matching enumerant)
i = 0n-1986510456 (No matching enumerant)

typedef enum _SYSTEM_POWER_STATE {
PowerSystemUnspecified = 0,
PowerSystemWorking = 1,
PowerSystemSleeping1 = 2,
PowerSystemSleeping2 = 3,
PowerSystemSleeping3 = 4,
PowerSystemHibernate = 5,
PowerSystemShutdown = 6,
PowerSystemMaximum = 7
} SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;


1: kd> dv matrixIndex
matrixIndex = PowerSystemSleeping1 (0n2)
2 3 4 5

//
// For each S state, walk PR0 to PR2 until you find a resource that
// cannot be ON in S state. The next lighter D state is then the lightest
// D state for the given S state.
//
for ( ; matrixIndex <= PowerSystemHibernate ; matrixIndex++ ) {

//
// Loop on all members of the PowerNode
//
for (i = PowerDeviceD0; i <= PowerDeviceD2; i++ ) {


1: kd> dx -id 0,0,899a2278 -r1 (*((ACPI!_ACPI_POWER_INFO *)0x899c0b18))
(*((ACPI!_ACPI_POWER_INFO *)0x899c0b18)) [Type: _ACPI_POWER_INFO]
[+0x000] Context : 0x0 [Type: void *]
[+0x004] PowerState : PowerDeviceUnspecified (0) [Type: _DEVICE_POWER_STATE]
[+0x008] DeviceNotifyHandler : 0x0 [Type: void (*)(void *,unsigned long)]
[+0x00c] HandlerContext : 0x0 [Type: void *]
[+0x010] PowerNode [Type: _ACPI_DEVICE_POWER_NODE * [4]]//这个
[+0x020] PowerObject [Type: _NSObj * [5]]
[+0x034] WakeBit : 0x0 [Type: unsigned long]
[+0x038] DevicePowerMatrix [Type: _DEVICE_POWER_STATE [7]]//这个
1: kd> dx -id 0,0,899a2278 -r1 (*((ACPI!_ACPI_DEVICE_POWER_NODE * (*)[4])0x899c0b28))
(*((ACPI!_ACPI_DEVICE_POWER_NODE * (*)[4])0x899c0b28)) [Type: _ACPI_DEVICE_POWER_NODE * [4]]
[0] : 0x0 [Type: _ACPI_DEVICE_POWER_NODE *]
[1] : 0x0 [Type: _ACPI_DEVICE_POWER_NODE *]
[2] : 0x0 [Type: _ACPI_DEVICE_POWER_NODE *]
[3] : 0x0 [Type: _ACPI_DEVICE_POWER_NODE *]

1: kd> dx -id 0,0,899a2278 -r1 (*((ACPI!_DEVICE_POWER_STATE (*)[7])0x899c0b50))
(*((ACPI!_DEVICE_POWER_STATE (*)[7])0x899c0b50)) [Type: _DEVICE_POWER_STATE [7]]
[0] : PowerDeviceUnspecified (0) [Type: _DEVICE_POWER_STATE]
[1] : PowerDeviceD0 (1) [Type: _DEVICE_POWER_STATE]
[2] : PowerDeviceD0 (1) [Type: _DEVICE_POWER_STATE]
[3] : PowerDeviceD0 (1) [Type: _DEVICE_POWER_STATE]
[4] : PowerDeviceD0 (1) [Type: _DEVICE_POWER_STATE]
[5] : PowerDeviceD3 (4) [Type: _DEVICE_POWER_STATE]
[6] : PowerDeviceD3 (4) [Type: _DEVICE_POWER_STATE]

1: kd> dd 0x899c0b50
899c0b50 00000000 00000001 00000001 00000001
899c0b60 00000001 00000004 00000004 00000000

typedef enum _DEVICE_POWER_STATE {
PowerDeviceUnspecified = 0,
PowerDeviceD0,
PowerDeviceD1,
PowerDeviceD2,
PowerDeviceD3,
PowerDeviceMaximum
} DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;


1: kd> dv
BuildRequest = 0x00000004
matrixIndex = PowerSystemSleeping2 (0n3)
i = PowerDeviceD3 (0n4)

//
// If we have had a device node, but don't have now, that means
// that we found a D level that is compliant for this S-state
//
if (deviceNode == NULL) {

ACPIDevPrint( (
ACPI_PRINT_LOADING,
deviceExtension,
"ACPIBuildDeviceProcessPhasePsc: D%x <-> S%x\n",
(i - PowerDeviceD0),
matrixIndex - PowerSystemWorking
) );

//
// This device can be in Di state while in SmatrixIndex state
//
powerInfo->DevicePowerMatrix[matrixIndex] = i;
break;

1: kd> dx -id 0,0,899a2278 -r1 (*((ACPI!_ACPI_POWER_INFO *)0x899c0b18))
(*((ACPI!_ACPI_POWER_INFO *)0x899c0b18)) [Type: _ACPI_POWER_INFO]
[+0x000] Context : 0x0 [Type: void *]
[+0x004] PowerState : PowerDeviceUnspecified (0) [Type: _DEVICE_POWER_STATE]
[+0x008] DeviceNotifyHandler : 0x0 [Type: void (*)(void *,unsigned long)]
[+0x00c] HandlerContext : 0x0 [Type: void *]
[+0x010] PowerNode [Type: _ACPI_DEVICE_POWER_NODE * [4]]
[+0x020] PowerObject [Type: _NSObj * [5]]
[+0x034] WakeBit : 0x0 [Type: unsigned long]
[+0x038] DevicePowerMatrix [Type: _DEVICE_POWER_STATE [7]]
[+0x054] SystemWakeLevel : PowerSystemUnspecified (0) [Type: _SYSTEM_POWER_STATE]


//
// Now that we have built the matrix, we can figure out what D-level the
// device can support wake with.
//
powerInfo->DeviceWakeLevel =
powerInfo->DevicePowerMatrix[powerInfo->SystemWakeLevel];

1: kd> dx -id 0,0,899a2278 -r1 (*((ACPI!_DEVICE_POWER_STATE (*)[7])0x899c0b50))
(*((ACPI!_DEVICE_POWER_STATE (*)[7])0x899c0b50)) [Type: _DEVICE_POWER_STATE [7]]
[0] : PowerDeviceUnspecified (0) [Type: _DEVICE_POWER_STATE]
[1] : PowerDeviceD0 (1) [Type: _DEVICE_POWER_STATE]
[2] : PowerDeviceD0 (1) [Type: _DEVICE_POWER_STATE]
[3] : PowerDeviceD0 (1) [Type: _DEVICE_POWER_STATE]
[4] : PowerDeviceD0 (1) [Type: _DEVICE_POWER_STATE]
[5] : PowerDeviceD3 (4) [Type: _DEVICE_POWER_STATE]
[6] : PowerDeviceD3 (4) [Type: _DEVICE_POWER_STATE]


typedef enum _SYSTEM_POWER_STATE {
PowerSystemUnspecified = 0,
PowerSystemWorking = 1,
PowerSystemSleeping1 = 2, 2
PowerSystemSleeping2 = 3, 3
PowerSystemSleeping3 = 4, 4
PowerSystemHibernate = 5, 5
PowerSystemShutdown = 6,
PowerSystemMaximum = 7
} SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;

外循环循环4次,内循环循环3次,共循环12次。

typedef enum _DEVICE_POWER_STATE {
PowerDeviceUnspecified = 0,
PowerDeviceD0, 1
PowerDeviceD1, 2
PowerDeviceD2, 3
PowerDeviceD3,
PowerDeviceMaximum
} DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;

for ( ; matrixIndex <= PowerSystemHibernate ; matrixIndex++ ) {

//
// Loop on all members of the PowerNode
//
for (i = PowerDeviceD0; i <= PowerDeviceD2; i++ ) {

//
// Are there any resources to look at?
//
deviceNode = powerInfo->PowerNode[i];
if (deviceNode == NULL) {

continue;

}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/9 18:42:40

Nodejs+vue微信小程序的反诈科普平台

文章目录 技术架构设计核心功能模块数据安全方案性能优化策略数据分析体系运营推广机制 --nodejs技术栈--结论源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 技术架构设计 采用Node.js作为后端服务框架&#xff0c;搭配Express或Koa构…

作者头像 李华
网站建设 2026/8/7 8:11:41

Nodejs+vue微信小程序的宠物领养平台

文章目录项目背景技术栈核心功能创新点应用价值--nodejs技术栈--结论源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;项目背景 随着社会对宠物领养需求的增长&#xff0c;开发一个基于Node.js和Vue的微信小程序宠物领养平台&#xff0c…

作者头像 李华
网站建设 2026/8/4 11:55:37

Nodejs+vue微信小程序的汽车租赁系统l9k0e

文章目录 系统概述技术架构核心功能数据交互安全与优化扩展性 --nodejs技术栈--结论源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 系统概述 Node.js与Vue结合的微信小程序汽车租赁系统&#xff08;项目代号l9k0e&#xff09;是一个前…

作者头像 李华
网站建设 2026/8/9 21:44:32

Python 元组(tuple)高级用法全解析:不可变性下的高效编程

Python 元组&#xff08;tuple&#xff09;高级用法全解析&#xff1a;不可变性下的高效编程 元组&#xff08;tuple&#xff09;作为Python中与列表并列的核心序列类型&#xff0c;常被误认为“只读列表”。但其不可变性&#xff08;immutable&#xff09;带来的特性的——哈…

作者头像 李华
网站建设 2026/8/9 16:00:00

[今日战况]创新高了!黄金有色吃大肉!ETF三因子轮动实盘跟踪!股票量化分析工具QTYX-V3.3.6

前言 我们的股票量化系统QTYX在实战中不断迭代升级!!!分享QTYX系统目的是提供给大家一个搭建量化系统的模版&#xff0c;帮助大家搭建属于自己的系统。因此我们提供源码&#xff0c;可以根据自己的风格二次开发。 关于QTYX的使用攻略可以查看链接&#xff1a;QTYX使用攻略QTYX一…

作者头像 李华
网站建设 2026/7/31 14:01:31

VB.NET和VBA教程-读取Range(“A1:C10“).Value得到数组的区别

前面已学“VBA对单元格区域读取”的知识&#xff1a; 在VBA中-读取Range("A1:C10").Value得到数组你弄明白了吗&#xff1f; VB.NET与VBA对单元格区域读取有什么区别 在 VB.NET 中&#xff0c;数组默认是从 0 开始索引的&#xff0c;但处理 Excel 数据时有特殊情况。…

作者头像 李华