当前位置: 首页 > news >正文

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
}

http://www.jsqmd.com/news/328671/

相关文章:

  • 大道至简,性能卓越:深度解析 LLaMA 模型的核心组件设计
  • Android平台开机启动shell脚本,快速落地实践
  • 信号处理仿真:语音信号处理_(18).语音信号处理的Python实现
  • 免费办公批处理:含图片压缩重命名格式转换
  • 互联网大厂Java面试实战:核心技术与业务场景深度解析
  • 推荐PDF转Excel工具,转换效果鸡佳
  • 图片转Excel工具:OCR识别批量处理
  • 如何实现的就是Deep Agent 任务规划(Planner)
  • 半桥LLC仿真模型:MATLAB/Simulink实战之旅
  • 2026年北京商用清洁机器人品牌排名,哪家性价比高值得选购
  • 别再瞎找了!AI论文工具 千笔写作工具 VS 学术猹,本科生专属首选!
  • 导师严选10个降AIGC网站 千笔·降AIGC助手解决AI率过高痛点
  • 2026年安徽江苏等地充电桩制造商资质全排名,推荐靠谱品牌
  • AI简历项目(概括)
  • 真的太省时间了!AI论文写作软件 千笔 VS 云笔AI,研究生必备神器!
  • 2000-2024年上市公司客户、供应商集中度
  • 免费抽奖软件支持内定名单+防重复中奖
  • 2026晶抗生物评测:品质卓越,助力科研新突破,人试剂盒/晶抗生物/鱼试剂盒/小鼠试剂盒,晶抗生物公司口碑推荐
  • Java计算机毕设之基于Java Web的毕业设计选题管理系统的设计与实现基于java+springboot的Web的毕业设计选题系统(完整前后端代码+说明文档+LW,调试定制等)
  • 实测对比后 9个AI论文网站测评:专科生毕业论文写作必备工具推荐
  • 26-01
  • 【课程设计/毕业设计】基于Java Web的毕业设计选题管理系统的设计与实现基于Java的毕业设计管理系统的设计与实现【附源码、数据库、万字文档】
  • AI短剧生成初探
  • 深入解析:CTFHub XSS通关1:反射型
  • 【课程设计/毕业设计】基于springboot+bs架构的浙江艾艺塑业设计公司网站设计与实现【附源码、数据库、万字文档】
  • 2026年东莞口碑好的服务不错的吊装搬迁公司有哪些
  • 2026年商用清洁机器人品牌排名出炉,性价比高的Top10
  • 2026年东莞搬家公司推荐,大众搬家拆装家具要收费吗
  • 计算机Java毕设实战-基于Java Web的毕业设计选题管理系统的设计与实现基于SpringBoot+Vue的毕业设计选题管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 讲讲充电桩安装专业组织哪家靠谱,用户评价来参考