news 2026/4/28 12:57:48

ACPI!ParseTerm函数中调用ACPI!OpRegion函数的ACPI!_OpRegionObj->bRegionSpace = REGSPACE_PCICFG的情况--重要

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ACPI!ParseTerm函数中调用ACPI!OpRegion函数的ACPI!_OpRegionObj->bRegionSpace = REGSPACE_PCICFG的情况--重要

ACPI!ParseTerm函数中调用ACPI!OpRegion函数的ACPI!_OpRegionObj->bRegionSpace = REGSPACE_PCICFG的情况--重要

0: kd> kc
#
00 ACPI!OpRegion
01 ACPI!ParseTerm
02 ACPI!RunContext
03 ACPI!InsertReadyQueue
04 ACPI!RestartContext
05 ACPI!SyncLoadDDB
06 ACPI!AMLILoadDDB
07 ACPI!ACPIInitializeDDB
08 ACPI!ACPIInitializeDDBs
09 ACPI!ACPIInitialize
0a ACPI!ACPIInitStartACPI
0b ACPI!ACPIRootIrpStartDevice
0c ACPI!ACPIDispatchIrp
0d nt!IofCallDriver
0e nt!IopSynchronousCall
0f nt!IopStartDevice
10 nt!PipProcessStartPhase1
11 nt!PipProcessDevNodeTree
12 nt!PipDeviceActionWorker
13 nt!PipRequestDeviceAction
14 nt!IopInitializeBootDrivers
15 nt!IoInitSystem
16 nt!Phase1Initialization
17 nt!PspSystemThreadStartup
18 nt!KiThreadStartup


NTSTATUS LOCAL OpRegion(PCTXT pctxt, PTERM pterm)
{


0: kd> p
Breakpoint 5 hit
eax=899b0134 ebx=8997de40 ecx=f743960a edx=00000000 esi=8997c000 edi=8997de20
eip=f741dc18 esp=f789a0e0 ebp=f789a114 iopl=0 nv up ei pl nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000202
ACPI!CreateNameSpaceObject:
f741dc18 55 push ebp
0: kd> dv
pheap = 0x899af000
pszName = 0x899af540 "REGS"
pnsScope = 0x899affac
powner = 0x899af330
ppns = 0x8997de40
dwfNS = 0
pns = 0x00000008


0: kd> gu
eax=00000000 ebx=8997de40 ecx=899b0190 edx=00000000 esi=8997c000 edi=8997de20
eip=f7421967 esp=f789a0e4 ebp=f789a114 iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
ACPI!OpRegion+0x59:
f7421967 83c418 add esp,18h
0: kd> dv
pctxt = 0x8997c000
pterm = 0x8997de20
rc = 0n898
XlatedAddr = {38508042513}
0: kd> dx -id 0,0,899a2278 -r1 ((ACPI!_term *)0x8997de20)
((ACPI!_term *)0x8997de20) : 0x8997de20 [Type: _term *]
[+0x000] FrameHdr [Type: _framehdr]
[+0x010] pbOpTerm : 0xf74c7821 : 0x5b [Type: unsigned char *]
[+0x014] pbOpEnd : 0x0 [Type: unsigned char *]
[+0x018] pbScopeEnd : 0xf74c92a2 : 0x14 [Type: unsigned char *]
[+0x01c] pamlterm : 0xf7438eb0 [Type: _amlterm *]
[+0x020] pnsObj : 0x899b0190[Type: _NSObj *]
[+0x024] iArg : 4 [Type: int]
[+0x028] icArgs : 4 [Type: int]
[+0x02c] pdataArgs : 0x899b0134 [Type: _ObjData *]
[+0x030] pdataResult : 0x8997c040 [Type: _ObjData *]
0: kd> dx -id 0,0,899a2278 -r1 ((ACPI!_NSObj *)0x899b0190)
((ACPI!_NSObj *)0x899b0190) : 0x899b0190 [Type: _NSObj *]
[+0x000] list [Type: _List]
[+0x008] pnsParent : 0x899affac [Type: _NSObj *]
[+0x00c] pnsFirstChild : 0x0 [Type: _NSObj *]
[+0x010] dwNameSeg : 0x53474552 [Type: unsigned long]
[+0x014] hOwner : 0x899af330 [Type: void *]
[+0x018] pnsOwnedNext : 0x899b00f0 [Type: _NSObj *]
[+0x01c] ObjData [Type: _ObjData]
[+0x030] Context : 0x0 [Type: void *]
[+0x034] dwRefCount : 0x0 [Type: unsigned long]

pterm->pnsObj->ObjData.dwDataType = OBJTYPE_OPREGION;
pterm->pnsObj->ObjData.dwDataLen = sizeof(OPREGIONOBJ);


0: kd> dt _NSObj 0x899b0190
ACPI!_NSObj
+0x000 list : _List
+0x008 pnsParent : 0x899affac _NSObj
+0x00c pnsFirstChild : (null)
+0x010 dwNameSeg : 0x53474552
+0x014 hOwner : 0x899af330 Void
+0x018 pnsOwnedNext : 0x899b00f0 _NSObj
+0x01c ObjData : _ObjData
+0x030 Context : (null)
+0x034 dwRefCount : 0
0: kd> dx -id 0,0,899a2278 -r1 (*((ACPI!_ObjData *)0x899b01ac))
(*((ACPI!_ObjData *)0x899b01ac)) [Type: _ObjData]
[+0x000] dwfData : 0x0 [Type: unsigned short]
[+0x002] dwDataType : 0xa[Type: unsigned short] OBJTYPE_OPREGION,
[+0x004] dwRefCount : 0x0 [Type: unsigned long]
[+0x004] pdataBase : 0x0 [Type: _ObjData *]
[+0x008] dwDataValue : 0x0 [Type: unsigned long]
[+0x008] uipDataValue : 0x0 [Type: unsigned long]
[+0x008] pnsAlias : 0x0 [Type: _NSObj *]
[+0x008] pdataAlias : 0x0 [Type: _ObjData *]
[+0x008] powner : 0x0 [Type: void *]
[+0x00c] dwDataLen : 0x18[Type: unsigned long]
[+0x010] pbDataBuff : 0x899afff0 : 0x0 [Type: unsigned char *]


//dwDataType values
typedef enum _OBJTYPES {
OBJTYPE_UNKNOWN = 0,
OBJTYPE_INTDATA,
OBJTYPE_STRDATA, 2
OBJTYPE_BUFFDATA,
OBJTYPE_PKGDATA,
OBJTYPE_FIELDUNIT,
OBJTYPE_DEVICE, 6
OBJTYPE_EVENT,
OBJTYPE_METHOD, 8
OBJTYPE_MUTEX,
OBJTYPE_OPREGION, a

0: kd> dt _OPREGIONOBJ -v
ACPI!_OpRegionObj
struct _OpRegionObj, 7 elements,0x18 bytes
+0x000 uipOffset : Uint4B
+0x004 dwLen : Uint4B
+0x008 bRegionSpace : UChar
+0x009 reserved : [3] UChar
+0x00c RegionBusy : Int4B
+0x010 listLock : Uint4B
+0x014 plistWaiters : Ptr32 to struct _List, 2 elements, 0x8 bytes

else
{
POPREGIONOBJ pop;

MEMZERO(pterm->pnsObj->ObjData.pbDataBuff,
pterm->pnsObj->ObjData.dwDataLen);
pop = (POPREGIONOBJ)pterm->pnsObj->ObjData.pbDataBuff;
pop->bRegionSpace = (UCHAR)pterm->pdataArgs[1].uipDataValue; 关键地方1:
pop->uipOffset = pterm->pdataArgs[2].uipDataValue; 关键地方2:
pop->dwLen = (ULONG)pterm->pdataArgs[3].uipDataValue; 关键地方3:

KeInitializeSpinLock(&pop->listLock);
if (pop->bRegionSpace == REGSPACE_MEM)
{


/*** Operation region space
*/

#define REGSPACE_MEM 0 //SystemMemory
#define REGSPACE_IO 1 //SystemIO
#define REGSPACE_PCICFG 2 //PCI_Config
#define REGSPACE_EC 3 //EmbeddedControl
#define REGSPACE_SMB 4 //SMBus
#define REGSPACE_CMOSCFG 5 //Cmos_Config
#define REGSPACE_PCIBARTARGET 6 //PCIBARTarget


0: kd> dv
pctxt = 0x8997c000
pterm = 0x8997de20
rc = 0n0
XlatedAddr = {38508042513}
0: kd> dx -id 0,0,899a2278 -r1 ((ACPI!_term *)0x8997de20)
((ACPI!_term *)0x8997de20) : 0x8997de20 [Type: _term *]
[+0x000] FrameHdr [Type: _framehdr]
[+0x010] pbOpTerm : 0xf74c7821 : 0x5b [Type: unsigned char *]
[+0x014] pbOpEnd : 0x0 [Type: unsigned char *]
[+0x018] pbScopeEnd : 0xf74c92a2 : 0x14 [Type: unsigned char *]
[+0x01c] pamlterm : 0xf7438eb0 [Type: _amlterm *]
[+0x020] pnsObj : 0x899b0190 [Type: _NSObj *]
[+0x024] iArg : 4 [Type: int]
[+0x028] icArgs : 4 [Type: int]
[+0x02c] pdataArgs : 0x899b0134 [Type: _ObjData *]
[+0x030] pdataResult : 0x8997c040 [Type: _ObjData *]
0: kd> dx -id 0,0,899a2278 -r1 ((ACPI!_ObjData *)0x899b0134)
((ACPI!_ObjData *)0x899b0134) : 0x899b0134 [Type: _ObjData *]
[+0x000] dwfData : 0x0 [Type: unsigned short]
[+0x002] dwDataType : 0x2 [Type: unsigned short]
[+0x004] dwRefCount : 0x0 [Type: unsigned long]
[+0x004] pdataBase : 0x0 [Type: _ObjData *]
[+0x008] dwDataValue : 0x0 [Type: unsigned long]
[+0x008] uipDataValue : 0x0 [Type: unsigned long]
[+0x008] pnsAlias : 0x0 [Type: _NSObj *]
[+0x008] pdataAlias : 0x0 [Type: _ObjData *]
[+0x008] powner : 0x0 [Type: void *]
[+0x00c] dwDataLen : 0x5 [Type: unsigned long]
[+0x010] pbDataBuff : 0x899af540 : 0x52 [Type: unsigned char *]
0: kd> dt ACPI!_ObjData 0x899b0134+14 pdataArgs[1]
+0x000 dwfData : 0
+0x002 dwDataType : 1
+0x004 dwRefCount : 0
+0x004 pdataBase : (null)
+0x008 dwDataValue : 2
+0x008 uipDataValue : 2 关键地方1:+0x008 uipDataValue : 2
+0x008 pnsAlias : 0x00000002 _NSObj
+0x008 pdataAlias : 0x00000002 _ObjData
+0x008 powner : 0x00000002 Void
+0x00c dwDataLen : 0
+0x010 pbDataBuff : (null)

#define REGSPACE_PCICFG 2 //PCI_Config


0: kd> dt ACPI!_ObjData 0x899b0134+14*2
+0x000 dwfData : 0
+0x002 dwDataType : 1
+0x004 dwRefCount : 0
+0x004 pdataBase : (null)
+0x008 dwDataValue : 0x50
+0x008 uipDataValue : 0x50 关键地方2:+0x008 uipDataValue : 0x50
+0x008 pnsAlias : 0x00000050 _NSObj
+0x008 pdataAlias : 0x00000050 _ObjData
+0x008 powner : 0x00000050 Void
+0x00c dwDataLen : 0
+0x010 pbDataBuff : (null)
0: kd> dt ACPI!_ObjData 0x899b0134+14*3
+0x000 dwfData : 0
+0x002 dwDataType : 1
+0x004 dwRefCount : 0
+0x004 pdataBase : (null)
+0x008 dwDataValue : 0x30 关键地方3:+0x008 uipDataValue : 0x30
+0x008 uipDataValue : 0x30
+0x008 pnsAlias : 0x00000030 _NSObj
+0x008 pdataAlias : 0x00000030 _ObjData
+0x008 powner : 0x00000030 Void
+0x00c dwDataLen : 0
+0x010 pbDataBuff : (null)

0: kd> dt _opregionobj 0x899afff0
ACPI!_OpRegionObj
+0x000 uipOffset : 0x50
+0x004 dwLen : 0x30
+0x008 bRegionSpace : 0x2 ''

+0x009 reserved : [3] ""
+0x00c RegionBusy : 0n0
+0x010 listLock : 0
+0x014 plistWaiters : (null)


if (pop->bRegionSpace ==REGSPACE_MEM)
{
if(gInitTime)
{
ValidateMemoryOpregionRange(pop->uipOffset, pop->dwLen);
}

rc = MapUnmapPhysMem(pctxt, pop->uipOffset, pop->dwLen,
&pop->uipOffset);
}
else if (pop->bRegionSpace ==REGSPACE_IO)
{
PHYSICAL_ADDRESS phyaddr = {0, 0}, XlatedAddr;
ULONG dwAddrSpace;

phyaddr.LowPart = (ULONG)pop->uipOffset;
dwAddrSpace = 1;
if (HalTranslateBusAddress(Internal, 0, phyaddr, &dwAddrSpace,
&XlatedAddr))
{
pop->uipOffset = (ULONG_PTR)XlatedAddr.LowPart;
}
else
{
rc = AMLI_LOGERR(AMLIERR_FAILED_ADDR_XLATE,
("OpRegion: failed to translate IO address %x",
pop->uipOffset));
}

}
else if (pop->bRegionSpace ==REGSPACE_PCIBARTARGET)
{
if (ghCreate.pfnHandler != NULL)
{
((PFNOO)ghCreate.pfnHandler)(OBJTYPE_OPREGION, pterm->pnsObj);
}
}
都不符合条件,返回了。!!!比较简单。


pop->bRegionSpace = REGSPACE_PCICFG的情况比较简单。

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

【独家披露】金融行业数据清洗标准流程:基于R与GPT的自动化方案

第一章:金融行业数据清洗的挑战与自动化演进金融行业的数据系统每天处理海量交易记录、客户信息和市场行情,这些数据来源多样、格式不一,导致数据清洗成为保障分析准确性的关键环节。传统依赖人工规则和脚本的方式已难以应对日益增长的数据复…

作者头像 李华
网站建设 2026/4/27 11:55:22

论文进阶指南:解锁英文文献库,并让文献真正为你“所用”

当你终于确定了论文方向,打开知网、万方,准备大干一场时,是否曾有过这样的瞬间:面对海量的中文文献,却总觉得缺了那几篇关键的、前沿的国际研究来支撑你的论点?你想查阅那些发表在《Nature》、《Science》或…

作者头像 李华
网站建设 2026/4/27 4:47:14

DTS-BLY-5S (LDV) 分布式光纤测温主机:20km 全域感知 + FPGA 硬核架构,重新定义工业安全监测标准

在管线传输、新能源、核电、隧道等关键工业领域,温度监测的 “距离、精度、稳定性” 直接决定安全防线的坚固程度。传统分布式光纤测温(DTS)系统普遍存在 “远距离精度衰减、复杂环境抗干扰弱、维护成本高” 等痛点,难以匹配现代化…

作者头像 李华
网站建设 2026/4/25 10:40:05

如何实现PHP与Redis的高效缓存同步?99%的人都忽略了这3点

第一章:PHP与Redis缓存同步的核心挑战在高并发Web应用中,PHP常借助Redis作为缓存层以提升数据读取性能。然而,实现PHP与Redis之间的数据同步并非简单任务,其核心挑战在于如何保障数据一致性、处理缓存失效策略以及应对并发竞争条件…

作者头像 李华
网站建设 2026/4/25 10:40:47

GLM-TTS与Obsidian插件联动:将笔记转为语音回顾

GLM-TTS与Obsidian插件联动:将笔记转为语音回顾 在知识爆炸的时代,我们每天都在写笔记、读文献、整理思路。但你有没有想过,这些密密麻麻的文字,其实可以“自己讲出来”? 想象一下:通勤路上戴上耳机&#x…

作者头像 李华