news 2026/10/23 1:56:38

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/10/18 3:26:58

2026热点风暴:如何将黄金暴跌、NBA交易变测试实战指南?

‌一、当日热点回顾与公众号热度趋势分析‌ 2026年2月1日,全球热点集中于体育、财经与娱乐领域: ‌体育赛事高潮迭起‌:NBA交易窗口临近,湖人、勇士无缘亨特引发球迷热议;利物浦4-1逆转纽卡,切尔西让二追…

作者头像 李华
网站建设 2026/10/13 12:18:26

低查重AI教材编写攻略,掌握这些工具轻松搞定教材生成!

谁没有面对过教材框架编写的困惑呢? 坐在电脑前盯着空白的文档,思绪如潮水般涌来,却又不知从何下手——是先解释概念,还是先引用实例呢?章节划分是按照逻辑走,还是按课程的时间来安排?修改的大…

作者头像 李华
网站建设 2026/10/19 19:40:50

寒潮中的测试韧性:2026二月热点下的合规升级与协作实战

一、极端天气场景:稳定性测试的实战启示 2月初冷空气席卷中东部,多地交通系统面临严峻考验。这恰似高并发场景下的系统压力测试——湖北冻雨中的"除冰保畅应急班"通宵作业,正是对测试工程师的生动启示: 容灾设计验证&a…

作者头像 李华
网站建设 2026/10/20 15:56:05

震撼!低查重AI教材生成,让AI写教材成为高效创作新选择

AI写教材:变革传统,提升效率与质量 撰写教材需要大量资料,但传统的资料整合方式已无法满足快速变化的需求。过去,我们常常需要从不同渠道,如课标文件、学术论文和教学案例中寻找信息,这样一来,…

作者头像 李华
网站建设 2026/10/20 4:19:28

智慧医疗RAG系统构建数据准备与预处理

1. 解决"文档分块的简单粗暴化"问题 原始问题:直接使用LangChain的RecursiveCharacterTextSplitter,固定512字符分块。 避坑实践: 多策略分块器设计: class MedicalDocumentChunker:def __init__(self):# 针对不同文…

作者头像 李华