news 2026/9/23 18:35:40

ACPI!PciConfigSpaceHandlerWorker函数中的simpleCompletion=ACPI!RestartCtxtCallback

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ACPI!PciConfigSpaceHandlerWorker函数中的simpleCompletion=ACPI!RestartCtxtCallback

ACPI!PciConfigSpaceHandlerWorker函数中的simpleCompletion=ACPI!RestartCtxtCallback

ACPI!RestartCtxtCallback真是ACPI里面重要的断点函数

当然还有ACPI!RestartContext

当然还有ACPI!RunContext和ACPI!RunContext+0x142

当然还有ACPI!AsyncCallBack


NTSTATUS
EXPORT
PciConfigSpaceHandlerWorker(
IN PNSOBJ AcpiObject,
IN NTSTATUS CompletionStatus,
IN POBJDATA Result,
IN PVOID Context
)
{

PciConfigSpaceHandlerWorkerExit:

if (state->RunCompletion) {

if (state->CompletionHandlerType ==
PCISUPP_COMPLETION_HANDLER_PFNAA) {

simpleCompletion = (PFNAA)state->CompletionHandler;

simpleCompletion(state->CompletionContext);

} else {

lessSimpleCompletion = (PFNACB)state->CompletionHandler;

lessSimpleCompletion(state->PciObj,
status,
NULL,
state->CompletionContext);
}


1: kd> dt PCI_CONFIG_STATE 0x89987378
ACPI!PCI_CONFIG_STATE
+0x000 AccessType : 1
+0x004 OpRegion : 0x899b0b50 _NSObj
+0x008 Address : 0xd8
+0x00c Size : 4
+0x010 Data : 0x8997dc28 -> 0x40e98102
+0x014 Context : 0
+0x018 CompletionHandler : 0xf7420914 Void
+0x01c CompletionContext : 0x8997c0ac Void
+0x020 PciObj : 0x899affac _NSObj
+0x024 ParentObj : (null)
+0x028 CompletionHandlerType : 0 #define PCISUPP_COMPLETION_HANDLER_PFNAA 0
+0x02c Flags : 0x100
+0x030 RunCompletion : 0n1
+0x034 Slot : _PCI_SLOT_NUMBER
+0x038 Bus : 0 ''
+0x039 IsPciDeviceResult : 0 ''
1: kd> u 0xf7420914
ACPI!RestartCtxtCallback [d:\srv03rtm\base\busdrv\acpi\driver\amlinew\sched.c @ 401]:
f7420914 55 push ebp
f7420915 8bec mov ebp,esp
f7420917 56 push esi
f7420918 8b7508 mov esi,dword ptr [ebp+8]
f742091b 57 push edi
f742091c 6a01 push 1
f742091e bf603f43f7 mov edi,offset ACPI!`string' (f7433f60)
f7420923 57 push edi


#define PCISUPP_COMPLETION_HANDLER_PFNAA 0
#define PCISUPP_COMPLETION_HANDLER_PFNACB 1

参考:state->CompletionHandlerType的赋值

NTSTATUS LOCAL WriteCookAccess(PCTXT pctxt, PWRCOOKACC pwca, NTSTATUS rc)
{

rc = pwca->prsa->pfnCookAccess(RSACCESS_READ, pwca->pnsBase,
(ULONG_PTR)pwca->dwAddr,
pwca->dwSize,
&pwca->dwDataTmp,
pwca->prsa->uipCookParam,
RestartCtxtCallback,
&pctxt->CtxtData);


NTSTATUS
EXPORT
PciConfigSpaceHandler (
ULONG AccessType,
PNSOBJ OpRegion,
ULONG Address,
ULONG Size,
PULONG Data,
ULONG Context,
PFNAA CompletionHandler,
PVOID CompletionContext
)
{

state->AccessType = AccessType;
state->OpRegion = OpRegion;
state->Address = Address;
state->Size = Size;
state->Data = Data;
state->Context = Context;
state->CompletionHandler = CompletionHandler;
state->CompletionContext = CompletionContext;
state->PciObj = OpRegion->pnsParent;
state->RunCompletion = INITIAL_RUN_COMPLETION;

1: kd> kc
#
00 ACPI!AMLIAsyncEvalObject
01 ACPI!ACPIGet
02 ACPI!GetPciAddressWorker
03 ACPI!GetPciAddress
04 ACPI!PciConfigSpaceHandlerWorker
05 ACPI!PciConfigSpaceHandler
06 ACPI!InternalOpRegionHandler
07 ACPI!WriteCookAccess
08 ACPI!RunContext
09 ACPI!InsertReadyQueue
0a ACPI!RestartCtxtPassive
0b ACPI!ACPIWorker
0c nt!PspSystemThreadStartup
0d nt!KiThreadStartup

参考结束:state->CompletionHandlerType


if (state->RunCompletion) {

if (state->CompletionHandlerType ==
PCISUPP_COMPLETION_HANDLER_PFNAA) {

simpleCompletion = (PFNAA)state->CompletionHandler;

simpleCompletion(state->CompletionContext);

}

VOID EXPORT RestartCtxtCallback(PCTXTDATA pctxtdata)
{
TRACENAME("RESTARTCTXTCALLBACK")
PCTXT pctxt = CONTAINING_RECORD(pctxtdata, CTXT, CtxtData);

ENTER(2, ("RestartCtxtCallback(pctxt=%x)\n", pctxt));

ASSERT(pctxt->dwSig == SIG_CTXT);
LOGSCHEDEVENT('RSCB', (ULONG_PTR)pctxt, 0, 0);
RestartContext(pctxt,
(BOOLEAN)((pctxt->dwfCtxt & CTXTF_ASYNC_EVAL) == 0));

EXIT(2, ("RestartCtxtCallback!\n"));
} //RestartCtxtCallback

1: kd> kc
#
00 ACPI!RestartCtxtCallback
01 ACPI!PciConfigSpaceHandlerWorker
02 ACPI!GetPciAddressWorker
03 ACPI!ACPIGetWorkerForInteger
04 ACPI!AsyncCallBack
05 ACPI!RunContext
06 ACPI!DispatchCtxtQueue
07 ACPI!StartTimeSlicePassive
08 ACPI!ACPIWorker
09 nt!PspSystemThreadStartup
0a nt!KiThreadStartup
1: kd> dv
pctxtdata = 0x8997c0ac

1: kd> dt CTXT 0x8997c0ac-ac
ACPI!CTXT
+0x000 dwSig : 0x54585443
+0x004 pbCtxtEnd : 0x8997e000 "TSER"
+0x008 listCtxt : _List
+0x010 listQueue : _List
+0x018 pplistCtxtQueue : (null)
+0x01c plistResources : 0x8997c198 _List
+0x020 dwfCtxt : 0x120
+0x024 pnsObj : 0x899b4938 _NSObj
+0x028 pnsScope : 0x899b40ac _NSObj
+0x02c powner : 0x8997c1ac _objowner
+0x030 pcall : 0x8997dd18 _call
+0x034 pnctxt : (null)
+0x038 dwSyncLevel : 0xf
+0x03c pbOp : 0x899b4122 ""
+0x040 Result : _ObjData
+0x054 pfnAsyncCallBack : 0xf7407364 void ACPI!ACPIGetWorkerForInteger+0
+0x058 pdataCallBack : 0x899c634c _ObjData
+0x05c pvContext : 0x899c6320 Void
+0x060 Timer : _KTIMER
+0x088 Dpc : _KDPC
+0x0a8 pheapCurrent : 0x8997c0bc _heap
+0x0ac CtxtData : _ctxtdata
+0x0bc LocalHeap : _heap
1: kd> dx -id 0,0,899a2278 -r1 (*((ACPI!_heap *)0x8997c0bc))
(*((ACPI!_heap *)0x8997c0bc)) [Type: _heap]
[+0x000] dwSig : 0x50414548 [Type: unsigned long]
[+0x004] pbHeapEnd : 0x8997dc08 : 0x57 [Type: unsigned char *]
[+0x008] pheapHead : 0x8997c0bc [Type: _heap *]
[+0x00c] pheapNext : 0x0 [Type: _heap *]
[+0x010] pbHeapTop : 0x8997c1f0 : 0x0 [Type: unsigned char *]
[+0x014] plistFreeHeap : 0x0 [Type: _List *]
[+0x018] Heap [Type: _heapobjhdr]
1: kd> db framehdr 0x8997dc08
Couldn't resolve error at 'framehdr 0x8997dc08'
1: kd> dt framehdr 0x8997dc08
ACPI!FRAMEHDR
+0x000 dwSig : 0x41435257
+0x004 dwLen : 0x30
+0x008 dwfFrame : 3
+0x00c pfnParse : 0xf7417c1d long ACPI!WriteCookAccess+0


1: kd> dt _WRCOOKACC 0x8997dc08
ACPI!_wrcookacc
+0x000 FrameHdr : _framehdr
+0x010 pnsBase : 0x899b0b50 _NSObj
+0x014 prsa : 0x89996d68 _rsaccess
+0x018 dwAddr : 0xd8
+0x01c dwSize : 4
+0x020 dwData : 0x40e98102
+0x024 dwDataMask : 0xffffffff
+0x028 dwDataTmp : 0
+0x02c fPreserve : 0 ''

1: kd> kc
#
00 ACPI!RestartContext
01 ACPI!RestartCtxtCallback
02 ACPI!PciConfigSpaceHandlerWorker

03 ACPI!GetPciAddressWorker
04 ACPI!ACPIGetWorkerForInteger
05 ACPI!AsyncCallBack
06 ACPI!RunContext
07 ACPI!DispatchCtxtQueue
08 ACPI!StartTimeSlicePassive
09 ACPI!ACPIWorker
0a nt!PspSystemThreadStartup
0b nt!KiThreadStartup
1: kd> dv
pctxt = 0x8997c000
fDelayExecute = 0x00 ''

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

三光吊舱激光模块技术要点解析

三光吊舱的激光模块是集成在光电吊舱中,与可见光、红外传感器协同工作的核心单元,主要用于精准测距、目标指示、激光照明与制导。其技术核心在于高精度的光轴共轴与校准、主动发射控制以及与系统其他模块的深度协同。核心技术要点解析1.三光共轴与实时校…

作者头像 李华
网站建设 2026/9/22 13:04:58

多Agent架构深度解析:从Open Deep Research源码学习大模型应用

本文深入分析了Open Deep Research项目的多Agent架构设计,展示了其三级分层嵌套结构:主图负责整体流程编排,监督者子图负责任务分解与委派,研究者子图负责具体执行。这种设计实现了职责分离和并行执行,通过LangGraph的…

作者头像 李华
网站建设 2026/9/20 20:48:20

大众点评数据采集终极指南:5分钟快速部署专业爬虫工具

大众点评数据采集终极指南:5分钟快速部署专业爬虫工具 【免费下载链接】dianping_spider 大众点评爬虫(全站可爬,解决动态字体加密,非OCR)。持续更新 项目地址: https://gitcode.com/gh_mirrors/di/dianping_spider …

作者头像 李华
网站建设 2026/9/20 20:48:48

【大数据毕设全套源码+文档】基于springboot高校电子图书馆的大数据平台规划与设计(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/9/22 22:29:23

本地部署数据分析软件 FineBI 并实现外部访问

FineBI 是一款基于 B/S 架构、功能强大的商业智能分析服务平台,支持多种数据连接方式且能够处理海量数据。拥有整合处理数据、制作表格、管理仪表板驾驶舱等功能。本文将详细介绍如何在本地安装 FineBI 以及结合路由侠内网穿透实现外网访问。 第一步,本…

作者头像 李华