news 2026/6/25 21:29:07

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/24 3:37:17

图片转Excel工具:OCR识别批量处理

软件介绍 今天要推荐这款“OCR表格识别工具”,它能把图片里的表格直接转成Excel文件,解决手动录入表格的麻烦,实用性很强。 使用前提 这软件得依赖paddleocr模型才能用。下载解压后,里面既有模型文件也有主程序,但…

作者头像 李华
网站建设 2026/6/6 21:17:56

大道至简,性能卓越:深度解析 LLaMA 模型的核心组件设计

好的,遵照您的要求,基于随机种子 1769907600059 所引发的思考脉络,我将为您撰写一篇关于 LLaMA 模型核心组件深度解析 的技术文章。本文将避免泛泛而谈 Transformer,而是深入到 LLaMA(以 7B/13B 版本为参考&#xff09…

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

2026年软件测试公众号爆款内容解析:专业视角下的热度密码

随着2026年AI技术和数据安全需求的爆发式增长,软件测试公众号内容热度呈现新趋势。从业者最关注的爆款文章聚焦三大核心类型,这些内容不仅解决日常痛点,还通过专业深度和实操性驱动高互动。热度并非偶然,而是源于对测试流程效率、…

作者头像 李华
网站建设 2026/6/18 12:08:29

CentOS 7 初始化脚本

环境说明 我在VMware中运行 我使用的镜像是【CentOS-7-x86_64-DVD-2009.iso】 我选择最小化安装,没有图形界面 我以 root 身份登录 我的系统信息如下 SSH 连接 使用【ifconfig】命令会失败,可以使用【ip a】命令查看IP地址 知道IP地址之后就可以 S…

作者头像 李华
网站建设 2026/6/16 8:06:33

AI专著写作省时秘籍:深入了解工具,轻松搞定百万字学术巨作

初次接触学术专著写作的难题与 AI 解决方案 对于初次接触学术专著写作的研究者来说,这一过程就像是在黑暗中摸索前进,充满了各种不确定性和挑战。选题往往让人感到困惑。研究者在“有价值”与“可操作”之间徘徊,有时会选一个过于广泛的题目…

作者头像 李华