1. ACPI命名空间对象创建机制深度解析
在Windows内核的ACPI驱动中,命名空间对象(NameSpace Object)的创建与管理是ACPI功能实现的核心基础。本文将深入分析ACPI!CreateNameSpaceObject函数的实现机制,以及它在AMLIInitialize初始化过程中的关键作用。
1.1 命名空间对象的基本结构
ACPI命名空间对象(_NSObj)是ACPI驱动中用于表示和管理ACPI命名空间节点的核心数据结构。通过WinDbg调试器,我们可以查看其完整结构:
c复制kd> dt _NSObj
ACPI!_NSObj
+0x000 list : _List
+0x008 pnsParent : Ptr64 _NSObj
+0x00c pnsFirstChild : Ptr64 _NSObj
+0x010 dwNameSeg : Uint4B
+0x014 hOwner : Ptr64 Void
+0x018 pnsOwnedNext : Ptr64 _NSObj
+0x01c ObjData : _ObjData
+0x030 Context : Ptr64 Void
+0x034 dwRefCount : Uint4B
关键字段解析:
list:双向链表节点,用于将对象链接到父对象的子对象链表中pnsParent:指向父命名空间对象的指针pnsFirstChild:指向第一个子命名空间对象的指针dwNameSeg:4字节的名称标识符(如_GPE、_SB等)ObjData:对象关联的数据结构,类型由dwDataType字段决定
1.2 CreateNameSpaceObject函数调用栈分析
从调试信息中可以看到完整的调用栈:
code复制00 ACPI!CreateNameSpaceObject
01 ACPI!AMLIInitialize
02 ACPI!ACPIInitializeAMLI
03 ACPI!ACPIInitialize
04 ACPI!ACPIInitStartACPI
05 ACPI!ACPIRootIrpStartDevice
06 ACPI!ACPIDispatchIrp
07 nt!IofCallDriver
08 nt!IopSynchronousCall
09 nt!IopStartDevice
0a nt!PipProcessStartPhase1
0b nt!PipProcessDevNodeTree
0c nt!PipDeviceActionWorker
0d nt!PipRequestDeviceAction
0e nt!IopInitializeBootDrivers
0f nt!IoInitSystem
10 nt!Phase1Initialization
11 nt!PspSystemThreadStartup
12 nt!KiThreadStartup
这个调用栈清晰地展示了从系统启动到ACPI命名空间初始化的完整路径。CreateNameSpaceObject是在AMLIInitialize过程中被调用的,用于构建ACPI的命名空间树。
2. CreateNameSpaceObject函数实现细节
2.1 函数原型与参数解析
CreateNameSpaceObject的函数原型如下:
c复制NTSTATUS LOCAL CreateNameSpa
