news 2026/3/8 7:08:39

ACPI!ACPIBuildProcessDevicePhaseAdr函数对节点ISA的处理-是否存在

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ACPI!ACPIBuildProcessDevicePhaseAdr函数对节点ISA的处理-是否存在

ACPI!ACPIBuildProcessDevicePhaseAdr函数对节点ISA的处理
1: kd> kc
#
00 ACPI!ACPIGet
01 ACPI!ACPIBuildProcessDevicePhaseAdr
02 ACPI!ACPIBuildProcessGenericList
03 ACPI!ACPIBuildDeviceDpc
04 nt!KiRetireDpcList
05 nt!KiDispatchInterrupt
WARNING: Frame IP not in any known module. Following frames may be wrong.
06 0x0
1: kd> dv
Target = 0x00000000
ObjectID = 0x4154535f
Flags = 0x40040802
SimpleArgument = 0x00000000
SimpleArgumentSize = 0
CallBackRoutine = 0xf73fa5bc
CallBackContext = 0x89984188
Buffer = 0x899841cc
BufferSize = 0x00000000
completionRoutine = 0xf7407364
status = 0n1074006018
argument = struct _ObjData
argumentPtr = 0x00000000
acpiObject = 0x00000000
deviceExtension = 0x899c0a88
async = 0x01 ''
argumentCount = 0
1: kd> u f7407364
ACPI!ACPIGetWorkerForInteger [d:\srv03rtm\base\busdrv\acpi\driver\nt\get.c @ 4707]:
f7407364 55 push ebp
f7407365 8bec mov ebp,esp
f7407367 51 push ecx
f7407368 53 push ebx
f7407369 8b5d0c mov ebx,dword ptr [ebp+0Ch]
f740736c 85db test ebx,ebx
f740736e 56 push esi
f740736f 57 push edi


ACPIGetExit:

//
// Remember to not execute the callback routine
//
request->Flags |= GET_PROP_SKIP_CALLBACK;

//
// Call the completion routine to actually do the post-processing
//
(completionRoutine)(
acpiObject,
status,
&(request->ResultData),
request
);


1: kd> kc
#
00 ACPI!ACPIGetWorkerForInteger
01 ACPI!ACPIGet
02 ACPI!ACPIBuildProcessDevicePhaseAdr
03 ACPI!ACPIBuildProcessGenericList
04 ACPI!ACPIBuildDeviceDpc
05 nt!KiRetireDpcList
06 nt!KiDispatchInterrupt
WARNING: Frame IP not in any known module. Following frames may be wrong.
07 0x0
1: kd> dv
AcpiObject = 0x00000000
Status = 0n-1073741772
Result = 0x898f71fc
Context = 0x898f71d0
freeData = 0x00 ''
1: kd> ?0n-1073741772
Evaluate expression: -1073741772 = c0000034


1: kd> dt ACPI_GET_REQUEST 0x898f71d0
+0x000 Flags : 0x60040802
+0x000 UFlags : __unnamed
+0x004 ObjectID : 0x4154535f
+0x008 ListEntry : _LIST_ENTRY [ 0xf743b940 - 0x895e8dc0 ]
+0x010 DeviceExtension : 0x899c0a88 _DEVICE_EXTENSION
+0x014 AcpiObject : 0x899b2278 _NSObj
+0x018 CallBackRoutine : 0xf73fa5bc void ACPI!ACPIBuildCompleteMustSucceed+0
+0x01c CallBackContext : 0x89984188 Void
+0x020 Buffer : 0x899841cc -> (null)
+0x024 BufferSize : (null)
+0x028 Status : 0n0
+0x02c ResultData : _ObjData

1: kd> db 0x899b2278
899b2278 bc 21 9b 89 68 3c 9b 89-ac ff 9a 89 bc 22 9b 89 .!..h<......."..
899b2288 49 53 41 5f 30 f3 9a 89-34 22 9b 89 00 00 06 00 ISA_0...4"......


#define GET_CONVERT_TO_ADDRESS 0x00000400
#define GET_CONVERT_TO_DEVICE_PRESENCE 0x00000800
#define GET_PROP_SKIP_CALLBACK 0x20000000

1: kd> kc
#
00 ACPI!ACPIGetConvertToDevicePresence
01 ACPI!ACPIGetWorkerForInteger
02 ACPI!ACPIGet
03 ACPI!ACPIBuildProcessDevicePhaseAdr
04 ACPI!ACPIBuildProcessGenericList
05 ACPI!ACPIBuildDeviceDpc
06 nt!KiRetireDpcList
07 nt!KiDispatchInterrupt
WARNING: Frame IP not in any known module. Following frames may be wrong.
08 0x0
1: kd> dv
DeviceExtension = 0x899c0a88
Status = 0n-1073741772
Result = 0x898f71fc

NTSTATUS
ACPIGetConvertToDevicePresence(
IN PDEVICE_EXTENSION DeviceExtension,
IN NTSTATUS Status,
IN POBJDATA Result,
IN ULONG Flags,
OUT PVOID *Buffer,
OUT ULONG *BufferSize
)
{
ULONG deviceStatus = STA_STATUS_DEFAULT;
NTSTATUS status;


#define STA_STATUS_PRESENT 0x00000001
#define STA_STATUS_ENABLED 0x00000002
#define STA_STATUS_USER_INTERFACE 0x00000004
#define STA_STATUS_WORKING_OK 0x00000008
#define STA_STATUS_DEFAULT ( STA_STATUS_PRESENT | \
STA_STATUS_ENABLED | \
STA_STATUS_USER_INTERFACE | \
STA_STATUS_WORKING_OK)


Device (ISA)
{
Name (_ADR, 0x00070000) // _ADR: Address
Device (MBRD)
{
Name (_HID, EisaId ("PNP0C02")) // _HID: Hardware ID
Name (_UID, 0x1F) // _UID: Unique ID
Name (RSRC, ResourceTemplate ()
{

如果一个节点没有_sta方法,默认存在这个设备!!!

1: kd> g
Breakpoint 4 hit
eax=00000000 ebx=c0000034 ecx=00000000 edx=00000000 esi=899c0a88 edi=0000000f
eip=f7409910 esp=f78aee84 ebp=f78aeea4 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!ACPIInternalUpdateDeviceStatus:
f7409910 55 push ebp
1: kd> dv
DeviceExtension = 0x899c0a88
DeviceStatus = 0xf
oldIrql = 0x00 ''

1: kd> dx -r1 ((ACPI!_DEVICE_EXTENSION *)0x899c0a88)
((ACPI!_DEVICE_EXTENSION *)0x899c0a88) : 0x899c0a88 [Type: _DEVICE_EXTENSION *]
[+0x000] Flags : 0x40100000000008 [Type: unsigned __int64]

[+0x10c] DeviceID : 0x70000 : Unable to read memory at Address 0x70000 [Type: unsigned char *]
[+0x10c] Address : 0x70000 [Type: unsigned long]

[+0x12c] AcpiObject : 0x899b2278 [Type: _NSObj *]
[+0x130] DeviceObject : 0x0 [Type: _DEVICE_OBJECT *]
[+0x134] TargetDeviceObject : 0x0 [Type: _DEVICE_OBJECT *]
[+0x138] PhysicalDeviceObject : 0x0 [Type: _DEVICE_OBJECT *]
[+0x13c] ParentExtension : 0x899c0d58 [Type: _DEVICE_EXTENSION *]
[+0x140] ChildDeviceList [Type: _LIST_ENTRY]
[+0x148] SiblingDeviceList [Type: _LIST_ENTRY]
[+0x150] EjectDeviceHead [Type: _LIST_ENTRY]
[+0x158] EjectDeviceList [Type: _LIST_ENTRY]

1: kd> gu
eax=00000000 ebx=c0000034 ecx=00401000 edx=00000000 esi=899c0a88 edi=0000000f
eip=f7406da5 esp=f78aee90 ebp=f78aeea4 iopl=0 nv up ei pl nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000202
ACPI!ACPIGetConvertToDevicePresence+0xcf:
f7406da5 5e pop esi
1: kd> dx -r1 ((ACPI!_DEVICE_EXTENSION *)0x899c0a88)
((ACPI!_DEVICE_EXTENSION *)0x899c0a88) : 0x899c0a88 [Type: _DEVICE_EXTENSION *]
[+0x000] Flags : 0x40100000000008 [Type: unsigned __int64]

没有什么变化,因为在ACPI!ACPIBuildProcessRunMethodPhaseCheckSta函数的时候已经运行过了。


1: kd> gu
eax=00000000 ebx=c0000034 ecx=00401000 edx=00000000 esi=898f71d0 edi=898f71fc
eip=f74073d9 esp=f78aeec4 ebp=f78aeed4 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!ACPIGetWorkerForInteger+0x75:
f74073d9 ebe6 jmp ACPI!ACPIGetWorkerForInteger+0x5d (f74073c1)
1: kd> kc
#
00 ACPI!ACPIGetWorkerForInteger
01 ACPI!ACPIGet
02 ACPI!ACPIBuildProcessDevicePhaseAdr
03 ACPI!ACPIBuildProcessGenericList
04 ACPI!ACPIBuildDeviceDpc
05 nt!KiRetireDpcList
06 nt!KiDispatchInterrupt
WARNING: Frame IP not in any known module. Following frames may be wrong.
07 0x0


//
// What happened?
//
ACPIDevPrint( (
ACPI_PRINT_LOADING,
deviceExtension,
"ACPIBuildProcessDevicePhaseAdr: Status = %08lx\n",
status
) );

//
// Common code to handle the result of the 'Get' routine
//
if (status != STATUS_PENDING) {

ACPIBuildCompleteMustSucceed(
NULL,
status,
NULL,
BuildRequest
);

}


1: kd> kc
#
00 ACPI!ACPIBuildProcessDevicePhaseAdr
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> dt ACPI_BUILD_REQUEST 0x89984188
+0x000 ListEntry : _LIST_ENTRY [ 0x89984138 - 0x89986158 ]
+0x008 Signature : 0x5f534750
+0x00c Flags : 1
+0x00c UFlags : __unnamed
+0x010 WorkDone : 1
+0x014 CurrentWorkDone : 4
+0x018 NextWorkDone : 8 +0x018 NextWorkDone : 8
+0x01c BuildContext : 0x899c0a88 Void
+0x020 Status : 0n0
+0x024 CurrentObject : 0x899b22bc _NSObj
+0x028 CallBack : (null)
+0x02c CallBackContext : (null)
+0x030 DeviceRequest : __unnamed
+0x030 RunRequest : __unnamed
+0x030 SynchronizeRequest : __unnamed
+0x044 Integer : 0xf
+0x044 String : 0x0000000f "--- memory read error at address 0x0000000f ---"
+0x044 TargetListEntry : 0x0000000f _LIST_ENTRY


//
// Because its rather annoying to base everything off the WORK_DONE_STEP_XX
// defines (espacially if you have to renumber them), these defines are
// used to abstract it out
//
#define WORK_DONE_ADR WORK_DONE_STEP_1
#define WORK_DONE_ADR_OR_HID WORK_DONE_STEP_0
#define WORK_DONE_CID WORK_DONE_STEP_4
#define WORK_DONE_CRS WORK_DONE_STEP_16
#define WORK_DONE_EJD WORK_DONE_STEP_6
#define WORK_DONE_HID WORK_DONE_STEP_2
#define WORK_DONE_PR0 WORK_DONE_STEP_10
#define WORK_DONE_PR1 WORK_DONE_STEP_12
#define WORK_DONE_PR2 WORK_DONE_STEP_14
#define WORK_DONE_PRW WORK_DONE_STEP_8
#define WORK_DONE_PSC WORK_DONE_STEP_18
#define WORK_DONE_STA WORK_DONE_STEP_5
#define WORK_DONE_UID WORK_DONE_STEP_3

#define WORK_DONE_STA WORK_DONE_STEP_5
#define WORK_DONE_CID WORK_DONE_STEP_4


1: kd> x ACPI!ACPIBuild*dispatch
f74380d4 ACPI!AcpiBuildPowerResourceDispatch = <function> *[5]
f7438104 ACPI!AcpiBuildThermalZoneDispatch = <function> *[4]
f74380e8 ACPI!AcpiBuildRunMethodDispatch = <function> *[7]
f7438008 ACPI!AcpiBuildDeviceDispatch = <function> *[23]
f74380c4 ACPI!AcpiBuildOperationRegionDispatch = <function> *[4]
1: kd> dx -r1 (*((ACPI!long (*(*)[23])(_ACPI_BUILD_REQUEST *))0xf7438008))
(*((ACPI!long (*(*)[23])(_ACPI_BUILD_REQUEST *))0xf7438008)) [Type: long (* [23])(_ACPI_BUILD_REQUEST *)]
[0] : 0xf73fb840 [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[1] : 0x0 [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[2] : 0xf73fce98 [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[3] : 0xf73fb118 [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[4] : 0xf73fb09e [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[5] : 0xf73fb40c [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[6] : 0xf73fb7a0 [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[7] : 0xf73fb246 [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[8] : 0xf73fb72e [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[9] : 0xf73fafda [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[10] : 0xf73fddf2 [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[11] : 0xf73fafda [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[12] : 0xf73fd18a [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[13] : 0xf73fafda [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[14] : 0xf73fcf04 [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[15] : 0xf73fafda [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[16] : 0xf73fcfca [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[17] : 0xf73fafda [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[18] : 0xf73fd09e [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[19] : 0xf73fafda [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[20] : 0xf73fb36a [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[21] : 0xf73faf0a [Type: long (*)(_ACPI_BUILD_REQUEST *)]
[22] : 0xf73fb57c [Type: long (*)(_ACPI_BUILD_REQUEST *)]
1: kd> u f73fb72e
ACPI!ACPIBuildProcessDevicePhaseSta [d:\srv03rtm\base\busdrv\acpi\driver\nt\buildsrc.c @ 4479]:
f73fb72e 55 push ebp
f73fb72f 8bec mov ebp,esp
f73fb731 56 push esi
f73fb732 8b7508 mov esi,dword ptr [ebp+8]
f73fb735 57 push edi
f73fb736 8b7e1c mov edi,dword ptr [esi+1Ch]
f73fb739 6a00 push 0
f73fb73b 68feb63ff7 push offset ACPI!ACPIBuildProcessDevicePhasePsc+0x182 (f73fb6fe)

} else {

//
// Note: we don't have a race condition here because only one
// routine can be processing a request at any given time. Thus it
// is safe for us to specify a new next phase
//
buildRequest->NextWorkDone = WORK_DONE_FAILURE;

//
// Transition to the next stage
//
ACPIBuildCompleteCommon(
&(buildRequest->WorkDone),
nextWorkDone
);

}


1: kd> kc
#
00 ACPI!ACPIBuildCompleteCommon
01 ACPI!ACPIBuildCompleteMustSucceed
02 ACPI!ACPIBuildProcessDevicePhaseAdr
03 ACPI!ACPIBuildProcessGenericList
04 ACPI!ACPIBuildDeviceDpc
05 nt!KiRetireDpcList
06 nt!KiDispatchInterrupt
WARNING: Frame IP not in any known module. Following frames may be wrong.
07 0x0
1: kd> dv
OldWorkDone = 0x89984198
NewWorkDone = 8


1: kd> x acpi!AcpiBuildDpcRunning
f743b89e ACPI!AcpiBuildDpcRunning = 0x01 ''


1: kd> gu
eax=00000041 ebx=899c0a88 ecx=00000041 edx=00000002 esi=89984188 edi=00000000
eip=f73fa5fe esp=f78aef3c ebp=f78aef3c 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!ACPIBuildCompleteMustSucceed+0x42:
f73fa5fe 5d pop ebp
1: kd> gu
eax=00000041 ebx=899c0a88 ecx=00000041 edx=00000002 esi=89984188 edi=00000000
eip=f73fb105 esp=f78aef44 ebp=f78aef60 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!ACPIBuildProcessDevicePhaseAdr+0x67:
f73fb105 83c410 add esp,10h
1: kd> gu
Breakpoint 6 hit
eax=00000000 ebx=00000004 ecx=00000041 edx=00000002 esi=89984188 edi=80b019f4
eip=f73fb914 esp=f78aef6c ebp=f78aef84 iopl=0 nv up ei ng nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000282
ACPI!ACPIBuildProcessGenericList+0x50:
f73fb914 85db test ebx,ebx

NTSTATUS
ACPIBuildProcessGenericList(
IN PLIST_ENTRY ListEntry,
IN PACPI_BUILD_FUNCTION *DispatchTable
)
{

//
// Look at the dispatch table to see if there is a function to
// call
//
buildFunction = DispatchTable[ workDone ]; =ecx=f73fb72e

1: kd> p
eax=00000008 ebx=89984198 ecx=f73fb72e edx=00000001 esi=89984188 edi=80b019f4
eip=f73fb8f7 esp=f78aef6c ebp=f78aef84 iopl=0 nv up ei ng nz ac pe cy
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000297
ACPI!ACPIBuildProcessGenericList+0x33:
f73fb8f7 85c9 test ecx,ecx

1: kd> u f73fb72e
ACPI!ACPIBuildProcessDevicePhaseSta [d:\srv03rtm\base\busdrv\acpi\driver\nt\buildsrc.c @ 4479]:
f73fb72e 55 push ebp
f73fb72f 8bec mov ebp,esp
f73fb731 56 push esi
f73fb732 8b7508 mov esi,dword ptr [ebp+8]
f73fb735 57 push edi
f73fb736 8b7e1c mov edi,dword ptr [esi+1Ch]
f73fb739 6a00 push 0
f73fb73b 68feb63ff7 push offset ACPI!ACPIBuildProcessDevicePhasePsc+0x182 (f73fb6fe)


1: kd> t
Breakpoint 5 hit
eax=00000008 ebx=00000008 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!ACPIBuildProcessDevicePhaseSta (f73fb72e)}


1: kd> t
eax=00000008 ebx=00000008 ecx=89984198 edx=00000001 esi=89984188 edi=80b019f4
eip=f73fb72e esp=f78aef64 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!ACPIBuildProcessDevicePhaseSta:
f73fb72e 55 push ebp
1: kd> kc
#
00 ACPI!ACPIBuildProcessDevicePhaseSta
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


#define WORK_DONE_EJD WORK_DONE_STEP_6

//
// The next stage is to start running the _EJD
//
BuildRequest->NextWorkDone = WORK_DONE_EJD;

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

电商返利系统中佣金计算的幂等性保障与对账补偿机制实现

电商返利系统中佣金计算的幂等性保障与对账补偿机制实现 大家好&#xff0c;我是 微赚淘客系统3.0 的研发者省赚客&#xff01; 在微赚淘客系统3.0中&#xff0c;用户通过专属推广链接下单后&#xff0c;平台需从电商平台&#xff08;如淘宝联盟、京东联盟&#xff09;获取订…

作者头像 李华
网站建设 2026/3/7 7:21:09

基于PLC的温室远程监控系统,西门子s71200(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于PLC的温室远程监控系统&#xff0c;西门子s71200(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码基于PLC的温室远程监控系统&#xff0c;西门子。s71200,含程序、报基于PLC的温室远程监控系统&#xff0c;西门子s71200&…

作者头像 李华
网站建设 2026/3/5 16:26:02

AI开发-python-langchain框架(1-7 提示词-模板中的模板)

本案例通过精心设计的提示模板&#xff0c;将历史对话内容与用户指令有机组合&#xff0c;引导模型生成精准的对话摘要。这种设计模拟了真实对话场景&#xff1a;模型既能回顾之前的交流内容&#xff0c;又能理解当前提出的总结要求&#xff0c;从而输出符合预期的结果。 消息模…

作者头像 李华
网站建设 2026/3/4 5:07:01

【Android毕设源码分享】基于微信小程序的古代天文知识科普系统设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/3/2 16:30:30

xilinx-DNA

一、Device DNA 具体含义 Device DNA​ 是 AMD Xilinx 现场可编程门阵列 和自适应计算加速平台 芯片中一项至关重要的硅片级安全与识别特性。 您可以将其理解为芯片的 “硅片指纹”​ 或 “不可克隆的硬件序列号”。 本质&#xff1a;一个在芯片生产测试阶段被永久性熔断&…

作者头像 李华