news 2026/4/15 9:15:24

ACPI!ACPIBuildDeviceExtension函数分析之建立了第一个子设备扩展

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ACPI!ACPIBuildDeviceExtension函数分析之建立了第一个子设备扩展

ACPI!ACPIBuildDeviceExtension函数分析之建立了第一个子设备扩展

0: kd> dv
CurrentObject = 0x899affac
ParentDeviceExtension = 0x89981a18
ReturnExtension = 0xf789a0d4
0: kd> dx -id 0,0,899a2278 -r1 ((ACPI!_NSObj *)0x899affac)
((ACPI!_NSObj *)0x899affac) : 0x899affac [Type: _NSObj *]
[+0x000] list [Type: _List]
[+0x008] pnsParent : 0x899af0f0 [Type: _NSObj *]
[+0x00c] pnsFirstChild : 0x0 [Type: _NSObj *]
[+0x010] dwNameSeg : 0x30494350 [Type: unsigned long]
[+0x014] hOwner : 0x899af330 [Type: void *]
[+0x018] pnsOwnedNext : 0x899aff4c [Type: _NSObj *]
[+0x01c] ObjData [Type: _ObjData]
[+0x030] Context : 0x0 [Type: void *]
[+0x034] dwRefCount : 0x0 [Type: unsigned long]

//
// Create a new extension for the object
//
deviceExtension = ExAllocateFromNPagedLookasideList( esi=899c0d58
&DeviceExtensionLookAsideList
);

0: kd> p
eax=899c0d58 ebx=89981a18 ecx=89bfe0e0 edx=00000000 esi=899c0d58 edi=899affac
eip=f73fc8e3 esp=f789a0a8 ebp=f789a0b4 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!ACPIBuildDeviceExtension+0x7b:
f73fc8e3 85f6 test esi,esi
//
// Lets begin with a clean slate
//
RtlZeroMemory( deviceExtension, sizeof(DEVICE_EXTENSION) );

//
// Initialize the reference count mechanism. We only have a NS object
// so the value should be 1
//
deviceExtension->ReferenceCount++ ;

//
// The initial outstanding IRP count will be set to one. Only during a
// remove IRP will this drop to zero, and then it will immediately pop
// back up to one.
//
deviceExtension->OutstandingIrpCount++;

//
// Initialize the link fields
//
deviceExtension->AcpiObject = CurrentObject; 关键代码1:

//
// Initialize the data fields
//
deviceExtension->Signature = ACPI_SIGNATURE;
deviceExtension->Flags = DEV_TYPE_NOT_FOUND | DEV_TYPE_NOT_PRESENT;
deviceExtension->DispatchTable = NULL;
deviceExtension->DeviceState = Stopped;
*ReturnExtension = deviceExtension;


0: kd> dt acpi!_DEVICE_EXTENSION 899c0d58
+0x000 Flags : 0xa
+0x000 UFlags : __unnamed
+0x008 Signature : 0x5f534750
+0x00c DebugFlags : 0
+0x010 DispatchTable : (null)
+0x014 WorkContext : WORK_QUEUE_CONTEXT
+0x014 Fdo : _FDO_DEVICE_EXTENSION
+0x014 Filter : _FILTER_DEVICE_EXTENSION
+0x014 Pdo : _PDO_DEVICE_EXTENSION
+0x058 WorkQueue : EXTENSION_WORKER
+0x058 Button : BUTTON_EXTENSION
+0x058 Thermal : THERMAL_EXTENSION
+0x058 LinkNode : LINK_NODE_EXTENSION
+0x058 Dock : DOCK_EXTENSION
+0x058 Processor : _PROCESSOR_DEVICE_EXTENSION
+0x088 DeviceState : 0 ( Stopped )
+0x08c PreviousState : 0 ( Stopped )
+0x090 PowerInfo : _ACPI_POWER_INFO
+0x10c DeviceID : (null)
+0x10c Address : 0
+0x110 InstanceID : (null)
+0x114 ResourceList : (null)
+0x118 PnpResourceList : (null)
+0x11c OutstandingIrpCount : 0n1
+0x120 ReferenceCount : 0n1
+0x124 HibernatePathCount : 0n0
+0x128 RemoveEvent : (null)
+0x12c AcpiObject : 0x899affac _NSObj
+0x130 DeviceObject : (null)
+0x134 TargetDeviceObject : (null)
+0x138 PhysicalDeviceObject : (null)
+0x13c ParentExtension : (null)
+0x140 ChildDeviceList : _LIST_ENTRY [ 0x0 - 0x0 ]
+0x148 SiblingDeviceList : _LIST_ENTRY [ 0x0 - 0x0 ]
+0x150 EjectDeviceHead : _LIST_ENTRY [ 0x0 - 0x0 ]
+0x158 EjectDeviceList : _LIST_ENTRY [ 0x0 - 0x0 ]


//
// Initialize the list entries
//
InitializeListHead( &(deviceExtension->ChildDeviceList) );
InitializeListHead( &(deviceExtension->EjectDeviceHead) );
InitializeListHead( &(deviceExtension->EjectDeviceList) );
InitializeListHead( &(powerInfo->WakeSupportList) );
InitializeListHead( &(powerInfo->PowerRequestListEntry) );

//
// Make sure that the deviceExtension has pointers to its parent
// extension. Note, that this should cause the ref count on the
// parent to increase
//
deviceExtension->ParentExtension = ParentDeviceExtension; 关键代码2:


0: kd> dt acpi!_DEVICE_EXTENSION 899c0d58
+0x000 Flags : 0xa
+0x000 UFlags : __unnamed
+0x008 Signature : 0x5f534750
+0x00c DebugFlags : 0
+0x010 DispatchTable : (null)
+0x014 WorkContext : WORK_QUEUE_CONTEXT
+0x014 Fdo : _FDO_DEVICE_EXTENSION
+0x014 Filter : _FILTER_DEVICE_EXTENSION
+0x014 Pdo : _PDO_DEVICE_EXTENSION
+0x058 WorkQueue : EXTENSION_WORKER
+0x058 Button : BUTTON_EXTENSION
+0x058 Thermal : THERMAL_EXTENSION
+0x058 LinkNode : LINK_NODE_EXTENSION
+0x058 Dock : DOCK_EXTENSION
+0x058 Processor : _PROCESSOR_DEVICE_EXTENSION
+0x088 DeviceState : 0 ( Stopped )
+0x08c PreviousState : 0 ( Stopped )
+0x090 PowerInfo : _ACPI_POWER_INFO
+0x10c DeviceID : (null)
+0x10c Address : 0
+0x110 InstanceID : (null)
+0x114 ResourceList : (null)
+0x118 PnpResourceList : (null)
+0x11c OutstandingIrpCount : 0n1
+0x120 ReferenceCount : 0n1
+0x124 HibernatePathCount : 0n0
+0x128 RemoveEvent : (null)
+0x12c AcpiObject : 0x899affac _NSObj
+0x130 DeviceObject : (null)
+0x134 TargetDeviceObject : (null)
+0x138 PhysicalDeviceObject : (null)
+0x13c ParentExtension : 0x89981a18 _DEVICE_EXTENSION
+0x140 ChildDeviceList : _LIST_ENTRY [ 0x899c0e98 - 0x899c0e98 ]
+0x148 SiblingDeviceList : _LIST_ENTRY [ 0x89981b58 - 0x89981b58 ]
+0x150 EjectDeviceHead : _LIST_ENTRY [ 0x899c0ea8 - 0x899c0ea8 ]
+0x158 EjectDeviceList : _LIST_ENTRY [ 0x899c0eb0 - 0x899c0eb0 ]

if (ParentDeviceExtension) {

InterlockedIncrement( &(ParentDeviceExtension->ReferenceCount) );

//
// Add the deviceExtension into the deviceExtension tree
//
InsertTailList(
&(ParentDeviceExtension->ChildDeviceList),
&(deviceExtension->SiblingDeviceList)
); 关键代码3:
}


0: kd> dt ACPI!_DEVICE_EXTENSION 0x89981a18
+0x000 Flags : 0x0001e000`00200010
+0x000 UFlags : __unnamed
+0x008 Signature : 0x5f534750
+0x00c DebugFlags : 0
+0x010 DispatchTable : 0xf743826c IRP_DISPATCH_TABLE
+0x014 WorkContext : WORK_QUEUE_CONTEXT
+0x014 Fdo : _FDO_DEVICE_EXTENSION
+0x014 Filter : _FILTER_DEVICE_EXTENSION
+0x014 Pdo : _PDO_DEVICE_EXTENSION
+0x058 WorkQueue : EXTENSION_WORKER
+0x058 Button : BUTTON_EXTENSION
+0x058 Thermal : THERMAL_EXTENSION
+0x058 LinkNode : LINK_NODE_EXTENSION
+0x058 Dock : DOCK_EXTENSION
+0x058 Processor : _PROCESSOR_DEVICE_EXTENSION
+0x088 DeviceState : 0 ( Stopped )
+0x08c PreviousState : 0 ( Stopped )
+0x090 PowerInfo : _ACPI_POWER_INFO
+0x10c DeviceID : 0x899bfea0 "ACPI\PNP0C08"
+0x10c Address : 0x899bfea0
+0x110 InstanceID : 0x899c53e8 "0x5F534750"
+0x114 ResourceList : 0x899bfeb8 _CM_RESOURCE_LIST
+0x118 PnpResourceList : (null)
+0x11c OutstandingIrpCount : 0n2
+0x120 ReferenceCount : 0n3
+0x124 HibernatePathCount : 0n0
+0x128 RemoveEvent : (null)
+0x12c AcpiObject : (null)
+0x130 DeviceObject : 0x89981b98 _DEVICE_OBJECT
+0x134 TargetDeviceObject : 0x899c1de0 _DEVICE_OBJECT
+0x138 PhysicalDeviceObject : 0x899c1de0 _DEVICE_OBJECT
+0x13c ParentExtension : (null)
+0x140 ChildDeviceList : _LIST_ENTRY [ 0x899c0ea0 - 0x899c0ea0 ]
+0x148 SiblingDeviceList : _LIST_ENTRY [ 0x89981b60 - 0x89981b60 ]
+0x150 EjectDeviceHead : _LIST_ENTRY [ 0x89981b68 - 0x89981b68 ]
+0x158 EjectDeviceList : _LIST_ENTRY [ 0x89981b70 - 0x89981b70 ]
0: kd> dx -id 0,0,899a2278 -r1 (*((ACPI!_LIST_ENTRY *)0x89981b58))
(*((ACPI!_LIST_ENTRY *)0x89981b58)) [Type: _LIST_ENTRY]
[+0x000] Flink : 0x899c0ea0 [Type: _LIST_ENTRY *]
[+0x004] Blink : 0x899c0ea0 [Type: _LIST_ENTRY *]


//
// And make sure that the Name Space Object points to the extension
//
if (CurrentObject != NULL ) {

CurrentObject->Context = deviceExtension; 关键代码4:
}


0: kd> dx -id 0,0,899a2278 -r1 ((ACPI!_NSObj *)0x899affac)
((ACPI!_NSObj *)0x899affac) : 0x899affac [Type: _NSObj *]
[+0x000] list [Type: _List]
[+0x008] pnsParent : 0x899af0f0 [Type: _NSObj *]
[+0x00c] pnsFirstChild : 0x0 [Type: _NSObj *]
[+0x010] dwNameSeg : 0x30494350 [Type: unsigned long]
[+0x014] hOwner : 0x899af330 [Type: void *]
[+0x018] pnsOwnedNext : 0x899aff4c [Type: _NSObj *]
[+0x01c] ObjData [Type: _ObjData]
[+0x030] Context : 0x899c0d58 [Type: void *] [+0x030] Context : 0x899c0d58
[+0x034] dwRefCount : 0x0 [Type: unsigned long]


0: kd> kc
#
00 ACPI!ACPIBuildDeviceExtension
01 ACPI!OSNotifyCreateDevice
02 ACPI!OSNotifyCreate
03 ACPI!Device
04 ACPI!ParseTerm
05 ACPI!RunContext
06 ACPI!InsertReadyQueue
07 ACPI!RestartContext
08 ACPI!SyncLoadDDB
09 ACPI!AMLILoadDDB
0a ACPI!ACPIInitializeDDB
0b ACPI!ACPIInitializeDDBs
0c ACPI!ACPIInitialize
0d ACPI!ACPIInitStartACPI
0e ACPI!ACPIRootIrpStartDevice
0f ACPI!ACPIDispatchIrp
10 nt!IofCallDriver
11 nt!IopSynchronousCall
12 nt!IopStartDevice
13 nt!PipProcessStartPhase1
14 nt!PipProcessDevNodeTree
15 nt!PipDeviceActionWorker
16 nt!PipRequestDeviceAction
17 nt!IopInitializeBootDrivers
18 nt!IoInitSystem
19 nt!Phase1Initialization
1a nt!PspSystemThreadStartup
1b nt!KiThreadStartup

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

宏智树AI,来了:这一次,让你的研究自己“说话”

你是否曾对着一片空白的文档,感觉那些盘旋在脑海里的绝妙灵感,正一点点变得干涸? 你是否曾在数据的迷宫里跋涉,明知答案就在其中,却不知如何让数字编织成令人信服的故事? 你是否曾担心,工具的…

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

lora-scripts支持哪些主流大模型?全面兼容性测试报告

lora-scripts支持哪些主流大模型?全面兼容性测试报告 在生成式AI迅速普及的今天,越来越多个人开发者和中小团队希望基于大模型定制专属能力——无论是让Stable Diffusion学会某种艺术风格,还是让LLaMA掌握医疗术语。但全参数微调动辄需要多张…

作者头像 李华
网站建设 2026/4/12 7:02:15

Cortex-M处理器上的CMSIS HAL配置指南

从寄存器到抽象:深入理解 Cortex-M 上的 CMSIS 硬件配置之道你有没有遇到过这样的场景?在一个项目中用熟了 STM32 的 GPIO 配置方式,换到 NXP 或者 GD 的 Cortex-M 芯片时,突然发现头文件变了、寄存器命名乱了、连中断服务函数的名…

作者头像 李华
网站建设 2026/4/13 14:47:49

利用jScope提升调试效率:STM32CubeIDE深度剖析

用 jScope 打造“会说话”的嵌入式系统:STM32 调试效率跃迁实战你有没有过这样的经历?PID 控制调了三天,电机还是抖个不停;ADC 数据跳变诡异,串口打印出来的数字像在猜谜;PWM 占空比明明该平滑变化&#xf…

作者头像 李华
网站建设 2026/4/14 22:17:22

工业级C++系统优化实录:大规模服务中静态内核调优的10个关键步骤

第一章:C 内核配置静态优化概述在现代高性能计算和嵌入式系统开发中,C 内核的静态优化技术成为提升程序执行效率的关键手段。通过对编译期可确定的信息进行分析与重构,静态优化能够在不依赖运行时环境的前提下,显著减少指令开销、…

作者头像 李华
网站建设 2026/4/15 4:25:57

Mathtype公式识别训练新思路:基于lora-scripts的小样本微调方案

Mathtype公式识别训练新思路:基于lora-scripts的小样本微调方案 在教育科技与科研数字化加速融合的今天,一个看似不起眼却长期困扰开发者的问题浮出水面:如何让AI“看懂”那些排版复杂、结构嵌套的数学公式?尤其是来自Word文档中M…

作者头像 李华