news 2026/4/23 13:14:01

ACPI!ACPIDetectPdoDevices函数分析对节点PCI0的处理_STA方法不存在默认存在

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ACPI!ACPIDetectPdoDevices函数分析对节点PCI0的处理_STA方法不存在默认存在

ACPI!ACPIDetectPdoDevices函数分析对节点PCI0的处理_STA方法不存在默认存在

//
// Grab the first child
//
deviceExtension = (PDEVICE_EXTENSION) CONTAINING_RECORD(
parentExtension->ChildDeviceList.Flink,
DEVICE_EXTENSION,
SiblingDeviceList
);

0: kd> p
eax=89981b58 ebx=f743b620 ecx=f743b620 edx=00000000 esi=899c0ea0 edi=804ee090
eip=f74002cb esp=f789a220 ebp=f789a250 iopl=0 nv up ei pl nz ac pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000216
ACPI!ACPIDetectPdoDevices+0xed:
f74002cb 81c6b8feffff add esi,0FFFFFEB8h


//
// Update the current device status
//
status = ACPIGetDevicePresenceSync(
deviceExtension,
(PVOID *) &deviceStatus,
NULL

//
// This macro is used to get the device status synchronously
//
#define ACPIGetDevicePresenceSync( \
DeviceExtension, \
Buffer, \
BufferSize \
) \
ACPIGetDevicePresence( \
DeviceExtension, \
GET_PROP_SKIP_CALLBACK, \
NULL, \
NULL, \
Buffer, \
BufferSize \
)

//
// This macro is used to get the device presence
//
#define ACPIGetDevicePresence( \
DeviceExtension, \
Flags, \
CallBack, \
Context, \
Buffer, \
BufferSize \
) \
ACPIGet( \
DeviceExtension, \
PACKED_STA, \
(GET_REQUEST_INTEGER | \
GET_TYPE_INTEGER | \
GET_CONVERT_TO_DEVICE_PRESENCE | \
Flags ), \
NULL, \
0, \
CallBack, \
Context, \
(PVOID *) Buffer, \
(PULONG) BufferSize \
)

对比:ACPIGetDevicePresenceAsync第二个参数是:GET_PROP_ASYNCHRONOUS
//
// This macro is used to get the device status asynchronously
//
#define ACPIGetDevicePresenceAsync( \
DeviceExtension, \
CallBack, \
Context, \
Buffer, \
BufferSize \
) \
ACPIGetDevicePresence( \
DeviceExtension, \
GET_PROP_ASYNCHRONOUS, \
CallBack, \
Context, \
Buffer, \
BufferSize \
)


ACPIGetDevicePresenceSync第二个参数是:GET_PROP_SKIP_CALLBACK
//
// This macro is used to get the device status synchronously
//
#define ACPIGetDevicePresenceSync( \
DeviceExtension, \
Buffer, \
BufferSize \
) \
ACPIGetDevicePresence( \
DeviceExtension, \
GET_PROP_SKIP_CALLBACK, \
NULL, \
NULL, \
Buffer, \
BufferSize \
)
对比结束:


0: kd> kc
#
00 ACPI!ACPIGet
01 ACPI!ACPIDetectPdoDevices
02 ACPI!ACPIRootIrpQueryBusRelations
03 ACPI!ACPIRootIrpQueryDeviceRelations
04 ACPI!ACPIDispatchIrp
05 nt!IofCallDriver
06 nt!IopSynchronousCall
07 nt!IopQueryDeviceRelations
08 nt!PipEnumerateDevice
09 nt!PipProcessDevNodeTree
0a nt!PipDeviceActionWorker
0b nt!PipRequestDeviceAction
0c nt!IopInitializeBootDrivers
0d nt!IoInitSystem
0e nt!Phase1Initialization
0f nt!PspSystemThreadStartup
10 nt!KiThreadStartup
0: kd> dv
Target = 0x899c0d58
ObjectID = 0x4154535f
Flags = 0x20040802
SimpleArgument = 0x00000000
SimpleArgumentSize = 0
CallBackRoutine = 0x00000000
CallBackContext = 0x00000000
Buffer = 0xf789a22c
BufferSize = 0x00000000


case GET_REQUEST_INTEGER:
completionRoutine = ACPIGetWorkerForInteger;


//
// Go out and see if the requested object is present
//
acpiObject = ACPIAmliGetNamedChild(
acpiObject,
ObjectID
);
if (!acpiObject) {

status = STATUS_OBJECT_NAME_NOT_FOUND;
goto ACPIGetExit;

}
0: kd> gu
eax=00000000 ebx=f743b938 ecx=899affac edx=00000000 esi=89968640 edi=89968648
eip=f74078dd esp=f789a1b8 ebp=f789a1f4 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!ACPIGet+0x225:
f74078dd 85c0 test eax,eax


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
);


0: kd> kc
#
00 ACPI!ACPIGetWorkerForInteger
01 ACPI!ACPIGet
02 ACPI!ACPIDetectPdoDevices
03 ACPI!ACPIRootIrpQueryBusRelations
04 ACPI!ACPIRootIrpQueryDeviceRelations
05 ACPI!ACPIDispatchIrp
06 nt!IofCallDriver
07 nt!IopSynchronousCall
08 nt!IopQueryDeviceRelations
09 nt!PipEnumerateDevice
0a nt!PipProcessDevNodeTree
0b nt!PipDeviceActionWorker
0c nt!PipRequestDeviceAction
0d nt!IopInitializeBootDrivers
0e nt!IoInitSystem
0f nt!Phase1Initialization
10 nt!PspSystemThreadStartup
11 nt!KiThreadStartup
0: kd> dv
AcpiObject = 0x00000000
Status = 0n-1073741772
Result = 0x8996866c
Context = 0x89968640
freeData = 0x00 ''
0: kd> dt ACPI_GET_REQUEST 0x89968640
+0x000 Flags : 0x20040802
+0x000 UFlags : __unnamed
+0x004 ObjectID : 0x4154535f
+0x008 ListEntry : _LIST_ENTRY [ 0xf743b940 - 0xf743b940 ]
+0x010 DeviceExtension : 0x899c0d58 _DEVICE_EXTENSION
+0x014 AcpiObject : 0x899affac _NSObj
+0x018 CallBackRoutine : (null)
+0x01c CallBackContext : (null)
+0x020 Buffer : 0xf789a22c -> 0x00000030 Void
+0x024 BufferSize : (null)
+0x028 Status : 0n0
+0x02c ResultData : _ObjData
0: kd> db 0x899affac
899affac 4c ff 9a 89 ac 40 9b 89-f0 f0 9a 89 24 00 9b 89 L....@......$...
899affbc 50 43 49 30 30 f3 9a 89-4c ff 9a 89 00 00 06 00 PCI00...L.......


} else if (request->Flags & GET_CONVERT_TO_DEVICE_PRESENCE) {

status = ACPIGetConvertToDevicePresence(
request->DeviceExtension,
Status,
Result,
request->Flags,
request->Buffer,
request->BufferSize
);


0: kd> kc
#
00 ACPI!ACPIGetConvertToDevicePresence
01 ACPI!ACPIGetWorkerForInteger
02 ACPI!ACPIGet
03 ACPI!ACPIDetectPdoDevices
04 ACPI!ACPIRootIrpQueryBusRelations
05 ACPI!ACPIRootIrpQueryDeviceRelations
06 ACPI!ACPIDispatchIrp
07 nt!IofCallDriver
08 nt!IopSynchronousCall
09 nt!IopQueryDeviceRelations
0a nt!PipEnumerateDevice
0b nt!PipProcessDevNodeTree
0c nt!PipDeviceActionWorker
0d nt!PipRequestDeviceAction
0e nt!IopInitializeBootDrivers
0f nt!IoInitSystem
10 nt!Phase1Initialization
11 nt!PspSystemThreadStartup
12 nt!KiThreadStartup
0: kd> dv
DeviceExtension = 0x899c0d58
Status = 0n-1073741772
Result = 0x8996866c
Flags = 0x20040802
Buffer = 0xf789a22c
BufferSize = 0x00000000
deviceStatus = 8
0: kd> ? 0n-1073741772
Evaluate expression: -1073741772 = c0000034


ULONG deviceStatus = STA_STATUS_DEFAULT;

#define GET_PROP_NSOBJ_INTERFACE 0x08000000
#define DEV_CAP_UNATTACHED_DOCK 0x00000004 00000000
#define DEV_PROP_NO_OBJECT 0x00080000 00000000

if (Status == STATUS_OBJECT_NAME_NOT_FOUND) {

//
// We do make exceptions in the case that this is a processor object
// and we didn't find a control method. In this case, we check the
// processor affinity mask to see if this processor exists. The reason
// that we do this is that older multi-proc capable systems with only
// a single processor will errorneously report both processors.
//

此时,我们可以查看控制方法返回的内容。
如果控制方法返回了STATUS_OBJECT_NAME_NOT_FOUND,那么我们就知道该控制方法不存在。
在这种情况下,我们就必须为设备使用默认状态

//
// Update the device status
//
ACPIInternalUpdateDeviceStatus( DeviceExtension, deviceStatus );

0: kd> kc
#
00 ACPI!ACPIInternalUpdateDeviceStatus
01 ACPI!ACPIGetConvertToDevicePresence
02 ACPI!ACPIGetWorkerForInteger
03 ACPI!ACPIGet
04 ACPI!ACPIDetectPdoDevices
05 ACPI!ACPIRootIrpQueryBusRelations
06 ACPI!ACPIRootIrpQueryDeviceRelations
07 ACPI!ACPIDispatchIrp
08 nt!IofCallDriver
09 nt!IopSynchronousCall
0a nt!IopQueryDeviceRelations
0b nt!PipEnumerateDevice
0c nt!PipProcessDevNodeTree
0d nt!PipDeviceActionWorker
0e nt!PipRequestDeviceAction
0f nt!IopInitializeBootDrivers
10 nt!IoInitSystem
11 nt!Phase1Initialization
12 nt!PspSystemThreadStartup
13 nt!KiThreadStartup
0: kd> dv
DeviceExtension = 0x899c0d58
DeviceStatus = 0xf
oldIrql = 0x00 ''
0: kd> dx -r1 ((ACPI!_DEVICE_EXTENSION *)0x899c0d58)
((ACPI!_DEVICE_EXTENSION *)0x899c0d58) : 0x899c0d58 [Type: _DEVICE_EXTENSION *]
[+0x000] Flags : 0x40200002010108 [Type: unsigned __int64]


0: kd> gu
eax=00000000 ebx=c0000034 ecx=00402000 edx=00000000 esi=899c0d58 edi=0000000f
eip=f7406da5 esp=f789a15c ebp=f789a170 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
0: kd> dx -r1 ((ACPI!_DEVICE_EXTENSION *)0x899c0d58)
((ACPI!_DEVICE_EXTENSION *)0x899c0d58) : 0x899c0d58 [Type: _DEVICE_EXTENSION *]
[+0x000] Flags : 0x40200002010108 [Type: unsigned __int64]


VOID
EXPORT
ACPIGetWorkerForInteger(
IN PNSOBJ AcpiObject,
IN NTSTATUS Status,
IN POBJDATA Result,
IN PVOID Context
)
{

//
// We are done, but we must check to see if we are the async or the
// sync case. If we are the sync case, then we have much less cleanup
// to perform
//
if ( !(request->Flags & GET_PROP_SKIP_CALLBACK) ) {

//
// Is there a callback routine to call?
//
if (request->CallBackRoutine != NULL) {

(request->CallBackRoutine)(
AcpiObject,
status,
NULL,
request->CallBackContext
);

}

#define GET_PROP_SKIP_CALLBACK 0x20000000

NTSTATUS
ACPIGet(
IN PVOID Target,
IN ULONG ObjectID,
IN ULONG Flags,
IN PVOID SimpleArgument,
IN ULONG SimpleArgumentSize,
IN PFNACB CallBackRoutine OPTIONAL,
IN PVOID CallBackContext OPTIONAL,
OUT PVOID *Buffer,
OUT ULONG *BufferSize OPTIONAL
)
{

//
// Done with the request
//
if (request != NULL) {

//
// Remove the request from the queue
//
KeAcquireSpinLock( &AcpiGetLock, &oldIrql );
RemoveEntryList( &(request->ListEntry) );
KeReleaseSpinLock( &AcpiGetLock, oldIrql );

//
// Free the storage
//
ExFreePool( request );

}

//
// Done
//
return status;

}
0: kd> p
eax=00000000 ebx=f743b620 ecx=04c90001 edx=04c80000 esi=899c0d58 edi=899c0e78
eip=f7407969 esp=f789a1c4 ebp=f789a1f4 iopl=0 nv up ei pl zr na pe cy
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000247
ACPI!ACPIGet+0x2b1:
f7407969 c9 leave
0: kd> dv status
status = 0n0

//
// If the device exists
//
if ( NT_SUCCESS(status) &&
!(deviceExtension->Flags & DEV_MASK_NOT_PRESENT) ) {

0: kd> p
eax=00000000 ebx=f743b620 ecx=04c90001 edx=04c80000 esi=899c0d58 edi=899c0e78
eip=f7400300 esp=f789a220 ebp=f789a250 iopl=0 nv up ei pl zr na pe cy
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000247
ACPI!ACPIDetectPdoDevices+0x122:
f7400300 85c0 test eax,eax
0: kd> bp f7400300

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

学长亲荐 9 个降AI率网站,千笔助你轻松降AIGC

AI降重工具,助你轻松应对论文挑战 在当前学术写作中,AI生成内容(AIGC)的普及让越来越多的学生面临“AI痕迹明显”“查重率偏高”的困扰。尤其对于本科生来说,如何在保持论文逻辑与语义的前提下,有效降低AI…

作者头像 李华
网站建设 2026/4/23 13:02:07

SSM银行管理系统275d1(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面

系统程序文件列表 系统项目功能:用户,柜员,账户信息,存款信息,取款信息,转账信息,贷款项目,我要贷款,理财类型,理财产品,线下理财,线上理财 SSM银行管理系统开题报告 一、课题研究背景与意义 1.1 研究背景 在数字化金融快速普及的当下,银行作为金融服…

作者头像 李华
网站建设 2026/4/23 12:38:44

飞控冗余模块技术详解

一、什么是飞控冗余模块?简单来说,飞控冗余模块是通过增加额外的硬件、软件或数据通路,在系统发生单一或部分故障时,仍能保证飞行控制系统持续、安全工作的设计。其核心目标是“故障-安全”,即系统在出现故障时&#x…

作者头像 李华
网站建设 2026/4/21 10:15:42

<span class=“js_title_inner“>AI那些趣事系列116:智能问数:让人人都能玩转数据的 AI 黑科技</span>

导读:本文是 “数据拾光者” 专栏的第一百一十六篇文章,这个系列聚焦自然语言处理和大模型相关实践。今天主要是关于智能问数产品技术调研和分享。欢迎转载,转载请注明出处以及链接,更多关于自然语言处理、推荐系统优质内容请关注…

作者头像 李华
网站建设 2026/4/23 11:14:31

GBase8a 三大功能组件、进程及日志介绍(V953版本)

1、GBase 8a MPP Cluster 三大功能组件:Gcluster 组件:负责 SQL 的解析、SQL 优化、分布式执行计划生成、执行调度。 Gcware 组件:用于各节点 GCluster 实例间共享信息,以及控制多副本数据操作时,提供可操作节点,并在多副本操作中&#xff0c…

作者头像 李华