news 2026/4/18 3:53:12

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/18 3:49:27

这个用MATLAB搞的人脸识别项目有点意思,直接拿PCA算法开刀不说,还做了个能看效果的GUI界面。咱们先看核心代码,再聊实现细节

基于主成分分析(PCA)的人脸识别 (完整Matlab代码) (有GUI界面) 本设计会将彩色图片直接转化为黑白图像,自带数据库,图片重建效果好很多!自己的图片可能会差一些,效果如下图所示&…

作者头像 李华
网站建设 2026/4/18 3:51:36

GLM-TTS与ButterCMS集成:轻量级内容管理方案

GLM-TTS与ButterCMS集成:轻量级内容管理方案 在播客订阅量年均增长超过30%的今天,越来越多的内容平台开始探索“视觉听觉”双通道分发模式。然而,传统语音合成系统往往依赖昂贵的定制化模型训练、复杂的部署流程和高昂的运维成本,…

作者头像 李华
网站建设 2026/4/17 5:08:49

仅需4步!用PHP轻松实现WebSocket消息自动加密与解密(附源码下载)

第一章:PHP WebSocket 消息加密概述在构建现代实时Web应用时,PHP结合WebSocket技术能够实现服务器与客户端之间的双向通信。然而,随着数据交互频率的增加,消息的安全性成为不可忽视的问题。未加密的WebSocket通信(ws:/…

作者头像 李华
网站建设 2026/3/31 20:33:42

TS210A1调光器

TS210A1 调光器 是一种用于控制交流负载亮度的工业或舞台用调光设备,通过调节输出电压或相位角来控制灯具或其他电器设备的亮度。它通常用于建筑照明、舞台灯光或工业照明系统中。核心功能调光控制调节交流电源输出,使灯具亮度连续可调可控制多种类型负载…

作者头像 李华
网站建设 2026/3/13 9:42:46

225110302控制器模块

225110302 控制器模块 是一款用于工业自动化和设备控制系统的核心控制单元,主要负责信号处理、逻辑运算以及对各类输入/输出模块和执行机构的统一管理,常见于连续运行、对稳定性要求较高的工业场合。核心功能控制与运算接收来自传感器、I/O 模块的输入信…

作者头像 李华
网站建设 2026/4/15 9:56:32

从石油到代码:阿联酋如何用RWA监管框架改写全球金融规则?

引言:数字金融的"中东突围战"当全球加密货币市场在2025年因监管不确定性陷入震荡时,阿联酋却以"双轨监管沙盒创新"的组合拳,在数字资产生态领域异军突起。从迪拜国际金融中心(DIFC)的《数字资产法…

作者头像 李华