news 2026/6/15 15:16:51

ACPI!DisableLinkNodesAsyncWorker函数分析和节点的_DIS方法有关

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ACPI!DisableLinkNodesAsyncWorker函数分析和节点的_DIS方法有关

ACPI!DisableLinkNodesAsyncWorker函数分析和节点的_DIS方法有关


第一部分:

d:\srv03rtm\base\busdrv\acpi\driver\nt\irqarb.c


This module implements an arbiter for IRQs.

In a traditional machine, the BIOS sets up the
mapping of PCI interrupt sources (i.e. Bus 0, slot 4,
funtion 1, INT B maps to IRQ 10.) This mapping is
then forever fixed. On the other hand, an ACPI
machine can possibly change these mappings by
manipulating the "link nodes" in the AML namespace.
Since the ACPI driver is the agent of change, it is the
place to implement an arbiter.


此模块实现了用于处理中断请求(IRQs)的仲裁器。

在传统机器中,基本输入输出系统(BIOS)会设置PCI中断源的映射(即总线0,插槽4,功能1,INT B映射到IRQ 10)。
此映射随后将永久固定。另一方面,高级配置和电源接口(ACPI)机器可以通过操纵高级机器语言(AML)命名空间中的“链接节点”来更改这些映射。

由于ACPI驱动程序是变更的媒介,因此它是实现仲裁器的合适位置。

第二部分:

1: kd> kc
#
00 ACPI!AMLIAsyncEvalObject
01 ACPI!ACPIGet
02 ACPI!DisableLinkNodesAsyncWorker
03 ACPI!DisableLinkNodesAsync
04 ACPI!DisableLinkNodesAsyncWorker
05 ACPI!DisableLinkNodesAsyncWorker
06 ACPI!AsyncCallBack
07 ACPI!RunContext
08 ACPI!DispatchCtxtQueue
09 ACPI!StartTimeSlicePassive
0a ACPI!ACPIWorker
0b nt!PspSystemThreadStartup
0c nt!KiThreadStartup
1: kd> kv
# ChildEBP RetAddr Args to Child
00 f791abd8 f7407905 899b3738 8991180c 00000000 ACPI!AMLIAsyncEvalObject (FPO: [Non-Fpo]) (CONV: cdecl) [d:\srv03rtm\base\busdrv\acpi\driver\amlinew\amliapi.c @ 821]
01 f791ac34 f740a570 899b3738 4449485f 58080206 ACPI!ACPIGet+0x24d (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\busdrv\acpi\driver\nt\get.c @ 275]
02 f791ac70 f740a4ca 899b36f4 00000000 00000000 ACPI!DisableLinkNodesAsyncWorker+0x5e (FPO: [Non-Fpo]) (CONV: cdecl) [d:\srv03rtm\base\busdrv\acpi\driver\nt\irqarb.c @ 4943]
03 f791ac8c f740a650 899b36f4 f740a512 894611d8 ACPI!DisableLinkNodesAsync+0x4c (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\busdrv\acpi\driver\nt\irqarb.c @ 4900]
04 f791acb0 f740a674 899b3394 00000000 00000000 ACPI!DisableLinkNodesAsyncWorker+0x13e (FPO: [Non-Fpo]) (CONV: cdecl) [d:\srv03rtm\base\busdrv\acpi\driver\nt\irqarb.c @ 5048]
05 f791acd8 f741f89b 899b3510 00000000 00000000 ACPI!DisableLinkNodesAsyncWorker+0x162 (FPO: [Non-Fpo]) (CONV: cdecl) [d:\srv03rtm\base\busdrv\acpi\driver\nt\irqarb.c @ 5074]
06 f791ad10 f741d905 f740a512 00000000 f743a934 ACPI!AsyncCallBack+0xe7 (FPO: [Non-Fpo]) (CONV: cdecl) [d:\srv03rtm\base\busdrv\acpi\driver\amlinew\sync.c @ 81]
07 f791ad34 f742042d 00000000 f7433d3c f743a928 ACPI!RunContext+0x1f5 (FPO: [Non-Fpo]) (CONV: cdecl) [d:\srv03rtm\base\busdrv\acpi\driver\amlinew\ctxt.c @ 649]
08 f791ad4c f74204ec f743a950 f743b318 f743a9b8 ACPI!DispatchCtxtQueue+0xaf (FPO: [Non-Fpo]) (CONV: cdecl) [d:\srv03rtm\base\busdrv\acpi\driver\amlinew\sched.c @ 150]
09 f791ad64 f74133c5 f743a928 00000000 89981ca0 ACPI!StartTimeSlicePassive+0x57 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\busdrv\acpi\driver\amlinew\sched.c @ 107]
0a f791adac 80d391f0 00000000 00000000 00000000 ACPI!ACPIWorker+0xbf (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\busdrv\acpi\driver\nt\worker.c @ 302]
0b f791addc 80b00d52 f7413306 00000000 00000000 nt!PspSystemThreadStartup+0x2e (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\ps\create.c @ 2213]
0c 00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16 [d:\srv03rtm\base\ntos\ke\i386\threadbg.asm @ 81]
windbg> .open -a fffffffff740a674
1: kd> db 899b3510
899b3510 cc 34 9b 89 7c 35 9b 89-94 33 9b 89 00 00 00 00 .4..|5...3......
899b3520 5f 44 49 53 30 f3 9a 89-cc 34 9b 89 00 00 08 00 _DIS0....4......
899b3530 00 00 00 00 00 00 00 00-1c 00 00 00 54 35 9b 89 ............T5..
899b3540 00 00 00 00 00 00 00 00-48 4d 45 54 28 00 00 00 ........HMET(...
899b3550 00 f0 9a 89 00 00 00 00-00 00 00 00 00 00 00 00 ................
899b3560 00 00 00 00 00 7d 50 49-52 43 0a 80 50 49 52 43 .....}PIRC..PIRC
899b3570 48 4e 53 4f 44 00 00 00-00 f0 9a 89 10 35 9b 89 HNSOD........5..
899b3580 00 36 9b 89 94 33 9b 89-00 00 00 00 5f 43 52 53 .6...3......_CRS
1: kd> dt nsobj 899b3510
ACPI!NSOBJ
+0x000 list : _List
+0x008 pnsParent : 0x899b3394 _NSObj
+0x00c pnsFirstChild : (null)
+0x010 dwNameSeg : 0x5349445f
+0x014 hOwner : 0x899af330 Void
+0x018 pnsOwnedNext : 0x899b34cc _NSObj
+0x01c ObjData : _ObjData
+0x030 Context : (null)
+0x034 dwRefCount : 0
1: kd> db 0x899b3394
899b3394 34 30 9b 89 f4 36 9b 89-78 22 9b 89 d8 33 9b 89 40...6..x"...3..
899b33a4 4c 4e 4b 43 30 f3 9a 89-20 33 9b 89 00 00 06 00 LNKC0... 3......
899b33b4 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
899b33c4 50 2a 98 89 00 00 00 00-48 4e 53 4f 44 00 00 00 P*......HNSOD...
899b33d4 00 f0 9a 89 80 36 9b 89-1c 34 9b 89 94 33 9b 89 .....6...4...3..
899b33e4 00 00 00 00 5f 48 49 44-30 f3 9a 89 94 33 9b 89 ...._HID0....3..
899b33f4 00 00 01 00 00 00 00 00-41 d0 0c 0f 00 00 00 00 ........A.......
899b3404 00 00 00 00 00 00 00 00-00 00 00 00 48 4e 53 4f ............HNSO
1: kd> db 899b3738
899b3738 e0 39 9b 89 7c 37 9b 89-f4 36 9b 89 00 00 00 00 .9..|7...6......
899b3748 5f 48 49 44 30 f3 9a 89-f4 36 9b 89 00 00 01 00 _HID0....6......
899b3758 00 00 00 00 41 d0 0c 0f-00 00 00 00 00 00 00 00 ....A...........
899b3768 00 00 00 00 00 00 00 00-48 4e 53 4f 44 00 00 00 ........HNSOD...
899b3778 00 f0 9a 89 38 37 9b 89-d4 37 9b 89 f4 36 9b 89 ....87...7...6..
899b3788 00 00 00 00 5f 55 49 44-30 f3 9a 89 38 37 9b 89 ...._UID0...87..
899b3798 00 00 01 00 00 00 00 00-04 00 00 00 00 00 00 00 ................
899b37a8 00 00 00 00 00 00 00 00-00 00 00 00 48 42 55 46 ............HBUF
1: kd> dt nsobj 899b3738
ACPI!NSOBJ
+0x000 list : _List
+0x008 pnsParent : 0x899b36f4 _NSObj
+0x00c pnsFirstChild : (null)
+0x010 dwNameSeg : 0x4449485f
+0x014 hOwner : 0x899af330 Void
+0x018 pnsOwnedNext : 0x899b36f4 _NSObj
+0x01c ObjData : _ObjData
+0x030 Context : (null)
+0x034 dwRefCount : 0
1: kd> db 0x899b36f4
899b36f4 94 33 9b 89 b0 3a 9b 89-78 22 9b 89 38 37 9b 89 .3...:..x"..87..
899b3704 4c 4e 4b 44 30 f3 9a 89-80 36 9b 89 00 00 06 00 LNKD0....6......


第三部分:

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


switch (NSGETOBJTYPE(sib)) {
case OBJTYPE_DEVICE:

//
// This name child of Root is also a device.
// Recurse.
//

status = DisableLinkNodesAsync(sib,
DisableLinkNodesAsyncWorker,
(PVOID)context);


第四部分:

typedef struct {
DISABLE_LINK_NODES_STATE State;
PNSOBJ RootDevice;
PUCHAR Hid;
PNSOBJ Dis;
PNSOBJ Sibling;
PNSOBJ NextSibling;
LONG RunCompletionHandler;
PFNACB CompletionHandler;
PVOID CompletionContext;
} DISABLE_LINK_NODES_CONTEXT, *PDISABLE_LINK_NODES_CONTEXT;

NTSTATUS
DisableLinkNodesAsync(
IN PNSOBJ Root,
IN PFNACB CompletionHandler,
IN PVOID CompletionContext
)
{
PDISABLE_LINK_NODES_CONTEXT context;
NTSTATUS status;

context = ExAllocatePoolWithTag(NonPagedPool,
sizeof(DISABLE_LINK_NODES_CONTEXT),
ACPI_ARBITER_POOLTAG);

if (!context) {
return STATUS_INSUFFICIENT_RESOURCES;
}

RtlZeroMemory(context, sizeof(DISABLE_LINK_NODES_CONTEXT));

context->State = DisableStateInitial;
context->RootDevice = Root;
context->CompletionHandler = CompletionHandler;
context->CompletionContext = CompletionContext;
context->RunCompletionHandler = INITIAL_RUN_COMPLETION;

return DisableLinkNodesAsyncWorker(Root,
STATUS_SUCCESS,
NULL,
(PVOID)context
);
}


第五部分:

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


DisableLinkNodeStartState:

switch (context->State) {
case DisableStateInitial:

//
// Get the _HID of this device to see if
// it is a link node.
//

context->State = DisableStateGotHid;
status = ACPIGetNSPnpIDAsync(
context->RootDevice,
DisableLinkNodesAsyncWorker,
context,
&context->Hid,
NULL);

第六部分:

Method (_DIS, 0, NotSerialized) // _DIS: Disable Device
{
Or (PIRC, 0x80, PIRC)
}

OperationRegion (PIRX, PCI_Config, 0x60, 0x04)
Field (PIRX, DWordAcc, NoLock, Preserve)
{
AccessAs (ByteAcc, 0x00),
PIRA, 8,
PIRB, 8,
PIRC, 8,
PIRD, 8
}

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

‌2026年软件测试公众号内容热度解析:专业视角下的趋势与策略

随着数字化转型加速,软件测试从业者正面临AI驱动、安全合规等新挑战。2026年初,公众号内容热度聚焦于解决实际痛点的主题,本文从专业角度分析三大热门领域:AI与自动化测试工具、DevSecOps集成实践、性能与安全测试优化。热度数据源…

作者头像 李华
网站建设 2026/6/15 14:01:49

阿尔珐公司员工管理系统毕业论文+PPT(附源代码+演示视频)

文章目录 一、项目简介1.1 运行视频1.2 🚀 项目技术栈1.3 ✅ 环境要求说明1.4 包含的文件列表 前台运行截图后台运行截图项目部署源码下载 一、项目简介 项目基于SpringBoot框架,前后端分离架构,后端为SpringBoot前端Vue。随着信息技术的不断…

作者头像 李华
网站建设 2026/6/15 13:10:39

当物价水平持续、普遍上涨时,加息是抑制通胀的主要武器。

其核心逻辑,不是直接控制价格,而是通过提高整个经济体的“资金成本”来抑制“需求”,从而使供需恢复平衡,让物价降温。 下图清晰地展示了这一核心传导机制: #mermaid-svg-P91jmjSC5RdzlsJ7{font-family:"trebuch…

作者头像 李华
网站建设 2026/6/15 14:52:12

ue metahuman 绑定资产 鞋子,衣服

1. 鞋子要支持 MetaHuman Skeleton 🏷 关键点:MetaHuman 使用的是一套特定的骨骼层级(Skeletal Rig),想让鞋子“跟着人物走路/动起来”,鞋子模型 必须被绑定到 MetaHuman 的腿部骨骼上 才行。一般来说&…

作者头像 李华
网站建设 2026/6/15 13:46:12

AI教材编写全流程解析,低查重输出优质教材的秘诀在这里

在教材编写过程中,许多编者会感到遗憾:尽管他们花费大量心血在正文内容上,却常常由于缺少配套资源而影响了教学的整体效果。后续练习需要设计成不同难度的题目,但实在缺乏创新的想法;而想制作直观的教学课件&#xff0…

作者头像 李华
网站建设 2026/6/13 2:32:37

社会网络仿真软件:Pajek_(12).模块化与社区检测

模块化与社区检测 模块化的基本概念 模块化(Modularity)是社会网络分析中的一个重要概念,用于评估网络中节点的聚类程度。模块化值越高,表示网络中节点的聚类结构越明显,即节点更倾向于与其所属的社区内部的其他节点…

作者头像 李华