news 2026/6/25 15:12:26

ACPI!ACPIBuildProcessDevicePhaseAdrOrHid函数中的acpi!ACPIGet--ACPI中心函数完全调试分析--特别重要

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ACPI!ACPIBuildProcessDevicePhaseAdrOrHid函数中的acpi!ACPIGet--ACPI中心函数完全调试分析--特别重要

ACPI!ACPIBuildProcessDevicePhaseAdrOrHid函数中的acpi!ACPIGet--ACPI中心函数完全调试分析--特别重要


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 ];
        if (buildFunction != NULL) {

            //
            // Just to help us along, if we are going to the failure
            // path, then we should not update the Current Work Done field.
            // This gives us an easy means of find which step failed
            //
            if (workDone != WORK_DONE_FAILURE) {

                //
                // Mark the node as being in the state 'workDone'
                //
                buildRequest->CurrentWorkDone = workDone;

            }

            //
            // Mark the request as pending
            //
            workDone = InterlockedCompareExchange(
                &(buildRequest->WorkDone),
                WORK_DONE_PENDING,
                workDone
                );

            //
            // Call the function
            //
            status = (buildFunction)( buildRequest );


1: kd> g
Breakpoint 53 hit
eax=00000003 ebx=00000003 ecx=89df81a8 edx=00000001 esi=89df8198 edi=80b019f4
eip=f73fb118 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!ACPIBuildProcessDevicePhaseAdrOrHid:
f73fb118 55              push    ebp
1: kd> kc
 #
00 ACPI!ACPIBuildProcessDevicePhaseAdrOrHid
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> kv
 # ChildEBP RetAddr  Args to Child              
00 f78aef60 f73fb914 89df8198 00000000 80afae90 ACPI!ACPIBuildProcessDevicePhaseAdrOrHid (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\busdrv\acpi\driver\nt\buildsrc.c @ 2844]
01 f78aef84 f73fc692 f743b888 f7438008 f7737980 ACPI!ACPIBuildProcessGenericList+0x50 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\busdrv\acpi\driver\nt\buildsrc.c @ 4847]
02 f78aef9c 80a41432 f743b840 00000000 00000000 ACPI!ACPIBuildDeviceDpc+0xe0 (FPO: [4,0,0]) (CONV: stdcall) [d:\srv03rtm\base\busdrv\acpi\driver\nt\buildsrc.c @ 659]
03 f78aeff4 80b00756 f791ac14 00000000 00000000 nt!KiRetireDpcList+0xd6 (FPO: [Non-Fpo]) (CONV: fastcall) [d:\srv03rtm\base\ntos\ke\dpcsup.c @ 1076]
04 f78aeff8 f791ac14 00000000 00000000 00000000 nt!KiDispatchInterrupt+0x36 (FPO: [Uses EBP] [0,0,1]) [d:\srv03rtm\base\ntos\ke\i386\ctxswap.asm @ 226]
WARNING: Frame IP not in any known module. Following frames may be wrong.
05 80b00756 00000000 00000009 bb837775 00000128 0xf791ac14
1: kd> dv
   BuildRequest = 0x89df8198
       nsObject = 0x89df8198


1: kd> dx -id 0,0,ffffffff89dd5240 -r1 ((ACPI!_ACPI_BUILD_REQUEST *)0x89df8198)
((ACPI!_ACPI_BUILD_REQUEST *)0x89df8198)                 : 0x89df8198 [Type: _ACPI_BUILD_REQUEST *]
    [+0x000] ListEntry        [Type: _LIST_ENTRY]
    [+0x008] Signature        : 0x5f534750 [Type: unsigned long]
    [+0x00c] Flags            : 0x1 [Type: unsigned long]
    [+0x00c] UFlags           [Type: __unnamed]
    [+0x010] WorkDone         : 0x1 [Type: unsigned long]
    [+0x014] CurrentWorkDone  : 0x3 [Type: unsigned long]
    [+0x018] NextWorkDone     : 0x0 [Type: unsigned long]
    [+0x01c] BuildContext     : 0x89db4970 [Type: void *]
    [+0x020] Status           : 0 [Type: long]
    [+0x024] CurrentObject    : 0x0 [Type: _NSObj *]
    [+0x028] CallBack         : 0x0 [Type: void (*)(void *,void *,long)]
    [+0x02c] CallBackContext  : 0x0 [Type: void *]
    [+0x030] DeviceRequest    [Type: __unnamed]
    [+0x030] RunRequest       [Type: __unnamed]
    [+0x030] SynchronizeRequest [Type: __unnamed]
    [+0x044] Integer          : 0x0 [Type: unsigned long]
    [+0x044] String           : 0x0 [Type: unsigned char *]
    [+0x044] TargetListEntry  : 0x0 [Type: _LIST_ENTRY *]


1: kd> dt acpi!_DEVICE_EXTENSION 0x89db4970
   +0x000 Flags            : 0x00400000`00000008
   +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   : 0n82
   +0x124 HibernatePathCount : 0n0
   +0x128 RemoveEvent      : (null)
   +0x12c AcpiObject       : 0x89da3fac _NSObj
   +0x130 DeviceObject     : (null)
   +0x134 TargetDeviceObject : (null)
   +0x138 PhysicalDeviceObject : (null)
   +0x13c ParentExtension  : 0x89db4ea0 _DEVICE_EXTENSION
   +0x140 ChildDeviceList  : _LIST_ENTRY [ 0x89db4950 - 0x89d41bd0 ]
   +0x148 SiblingDeviceList : _LIST_ENTRY [ 0x89da2d00 - 0x89db4fe0 ]
   +0x150 EjectDeviceHead  : _LIST_ENTRY [ 0x89db4ac0 - 0x89db4ac0 ]
   +0x158 EjectDeviceList  : _LIST_ENTRY [ 0x89db4ac8 - 0x89db4ac8 ]


1: kd> dt _nsobj 0x89da3fac
ACPI!_NSObj
   +0x000 list             : _List
   +0x008 pnsParent        : 0x89da30f0 _NSObj
   +0x00c pnsFirstChild    : 0x89da4024 _NSObj
   +0x010 dwNameSeg        : 0x30494350
   +0x014 hOwner           : 0x89da3330 Void
   +0x018 pnsOwnedNext     : 0x89da3f4c _NSObj
   +0x01c ObjData          : _ObjData
   +0x030 Context          : 0x89db4970 Void
   +0x034 dwRefCount       : 0
1: kd> db 0x89da3fac
89da3fac  4c 3f da 89 ac 80 da 89-f0 30 da 89 24 40 da 89  L?.......0..$@..
89da3fbc  50 43 49 30 30 33 da 89-4c 3f da 89 00 00 06 00  PCI003..L?......

1: kd> dx -id 0,0,ffffffff89dd5240 -r1 ((ACPI!_NSObj *)0x89da30f0)
((ACPI!_NSObj *)0x89da30f0)                 : 0x89da30f0 [Type: _NSObj *]
    [+0x000] list             [Type: _List]
    [+0x008] pnsParent        : 0x89da3024 [Type: _NSObj *]
    [+0x00c] pnsFirstChild    : 0x89da3474 [Type: _NSObj *]
    [+0x010] dwNameSeg        : 0x5f42535f [Type: unsigned long]
    [+0x014] hOwner           : 0x0 [Type: void *]
    [+0x018] pnsOwnedNext     : 0x0 [Type: _NSObj *]
    [+0x01c] ObjData          [Type: _ObjData]
    [+0x030] Context          : 0x89db4ea0 [Type: void *]
    [+0x034] dwRefCount       : 0x0 [Type: unsigned long]
1: kd> db 0x89da30f0
89da30f0  ac 30 da 89 34 31 da 89-24 30 da 89 74 34 da 89  .0..41..$0..t4..
89da3100  5f 53 42 5f 00 00 00 00-00 00 00 00 00 00 00 00  _SB_............


1: kd> dx -id 0,0,ffffffff89dd5240 -r1 ((ACPI!_NSObj *)0x89da3024)
((ACPI!_NSObj *)0x89da3024)                 : 0x89da3024 [Type: _NSObj *]
    [+0x000] list             [Type: _List]
    [+0x008] pnsParent        : 0x0 [Type: _NSObj *]
    [+0x00c] pnsFirstChild    : 0x89da3068 [Type: _NSObj *]
    [+0x010] dwNameSeg        : 0x5f5f5f5c [Type: unsigned long]
    [+0x014] hOwner           : 0x0 [Type: void *]
    [+0x018] pnsOwnedNext     : 0x0 [Type: _NSObj *]
    [+0x01c] ObjData          [Type: _ObjData]
    [+0x030] Context          : 0x0 [Type: void *]
    [+0x034] dwRefCount       : 0x0 [Type: unsigned long]
1: kd> db 0x89da3024
89da3024  00 00 00 00 00 00 00 00-00 00 00 00 68 30 da 89  ............h0..
89da3034  5c 5f 5f 5f 00 00 00 00-00 00 00 00 00 00 00 00  \___............

\___
_SB_
PCI0

    //
    // We need to name this node, so lets determine if there is an _HID
    // or an _ADR is present
    //
    nsObject = ACPIAmliGetNamedChild(
        deviceExtension->AcpiObject,
        PACKED_HID
        );
    if (nsObject == NULL) {

1: kd> dt _nsobj 0x89da3fac
ACPI!_NSObj
   +0x000 list             : _List
   +0x008 pnsParent        : 0x89da30f0 _NSObj
   +0x00c pnsFirstChild    : 0x89da4024 _NSObj
   +0x010 dwNameSeg        : 0x30494350
   +0x014 hOwner           : 0x89da3330 Void
   +0x018 pnsOwnedNext     : 0x89da3f4c _NSObj
   +0x01c ObjData          : _ObjData
   +0x030 Context          : 0x89db4970 Void
   +0x034 dwRefCount       : 0

1: kd> dx -id 0,0,ffffffff89dd5240 -r1 ((ACPI!_NSObj *)0x89da4024)
((ACPI!_NSObj *)0x89da4024)                 : 0x89da4024 [Type: _NSObj *]
    [+0x000] list             [Type: _List]
    [+0x008] pnsParent        : 0x89da3fac [Type: _NSObj *]
    [+0x00c] pnsFirstChild    : 0x0 [Type: _NSObj *]
    [+0x010] dwNameSeg        : 0x4449485f [Type: unsigned long]
    [+0x014] hOwner           : 0x89da3330 [Type: void *]
    [+0x018] pnsOwnedNext     : 0x89da3fac [Type: _NSObj *]
    [+0x01c] ObjData          [Type: _ObjData]
    [+0x030] Context          : 0x0 [Type: void *]
    [+0x034] dwRefCount       : 0x0 [Type: unsigned long]
1: kd> db 0x89da4024
89da4024  64 d0 d4 89 68 40 da 89-ac 3f da 89 00 00 00 00  d...h@...?......
89da4034  5f 48 49 44 30 33 da 89-ac 3f da 89 00 00 01 00  _HID03...?......
89da4044  00 00 00 00 41 d0 0a 03-00 00 00 00 00 00 00 00  ....A...........
89da4054  00 00 00 00 00 00 00 00-48 4e 53 4f 44 00 00 00  ........HNSOD...
89da4064  00 30 da 89 24 40 da 89-ac 40 da 89 ac 3f da 89  .0..$@...@...?..
89da4074  00 00 00 00 5f 43 49 44-30 33 da 89 24 40 da 89  ...._CID03..$@..
89da4084  00 00 01 00 00 00 00 00-41 d0 0a 08 00 00 00 00  ........A.......
89da4094  00 00 00 00 00 00 00 00-00 00 00 00 48 4e 53 4f  ............HNSO


    nsObject = ACPIAmliGetNamedChild(            eax=89da4024
        deviceExtension->AcpiObject,
        PACKED_HID
        );
    if (nsObject == NULL) {

1: kd> p
eax=89da4024 ebx=00000003 ecx=4449485f edx=00000001 esi=89df8198 edi=89db4970
eip=f73fb134 esp=f78aef54 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!ACPIBuildProcessDevicePhaseAdrOrHid+0x1c:
f73fb134 33db            xor     ebx,ebx

    } else {

        //
        // Remember which name space object we are evaluating
        //
        BuildRequest->CurrentObject = nsObject;

        //
        // When we go down this path, we actually want to build the UID before
        // the HID because that makes deciding wether to run the CID much easier
        //
        nsObject = ACPIAmliGetNamedChild(            eax=00000000
            deviceExtension->AcpiObject,
            PACKED_UID
            );

1: kd>

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

风控不是算账,是“盯人”——聊聊 CEP 在风控与监控里的那些真本事

风控不是算账,是“盯人”——聊聊 CEP 在风控与监控里的那些真本事 大家好,我是 Echo_Wish。 这些年做大数据、做风控、做监控系统,越做越有一个强烈的感受:很多系统不是“算得不够准”,而是“看得不够快、不够懂事”。…

作者头像 李华
网站建设 2026/6/21 12:54:24

Agentic AI合规经验:提示工程架构师如何打造个人品牌?

Agentic AI合规时代,提示工程架构师如何用“技术+信任”打造个人品牌? 摘要/引言:当AI从“工具”变成“智能体”,提示工程师的品牌焦虑该怎么解? 凌晨3点,小张盯着电脑屏幕上的Agentic AI合规审计报告,揉了揉发涩的眼睛。作为某互联网公司的提示工程架构师,他上周刚上…

作者头像 李华
网站建设 2026/6/18 10:38:53

Availability(可用性)与高可用架构 内容的结构化知识点汇总

一、什么是 Availability(可用性) Availability 系统在一年中可正常提供服务的时间比例 常见两种表达方式:百分比(99.9%)N 个 9(three nines)可用性年宕机时间说法99%~3.65 天two nines99.9%~8…

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

Geek Uninstaller介绍(轻量高效的软件卸载专家)注册表清理注册表、卸载软件、应用卸载应用、文件卸载文件

https://geekuninstaller.com/download 文章目录Geek Uninstaller:轻量高效的软件卸载专家什么是Geek Uninstaller?核心功能与特点1. 彻底卸载2. 强制删除功能3. 注册表清理4. 绿色便携5. 轻量高效6. 简洁直观的界面使用方法免费版vs专业版与其他卸载软件…

作者头像 李华
网站建设 2026/6/20 0:41:57

python 调用C++动态库还会存在GIL问题吗

你想知道Python调用C动态库时是否还会受GIL(全局解释器锁)的影响,答案是分场景讨论,并非完全受GIL限制,核心取决于C动态库的执行逻辑是否「释放了GIL」,下面详细拆解具体情况、原理及解决方案: …

作者头像 李华