news 2026/10/5 10:01:14

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/10/3 6:49:33

GLM-TTS与Sanity Studio结合:结构化内容创作环境

GLM-TTS与Sanity Studio结合:结构化内容创作环境 在数字内容爆炸式增长的今天,创作者面临的不再是“有没有内容”,而是“如何高效地产出高质量、多模态的内容”。尤其在播客、有声书、虚拟主播和教育产品中,语音已不再只是文本的附…

作者头像 李华
网站建设 2026/10/3 6:49:21

GLM-TTS与Forest Admin结合:快速搭建后台管理系统

GLM-TTS与Forest Admin结合:快速搭建后台管理系统 在智能语音服务日益普及的今天,企业对个性化、高效率的语音合成能力提出了更高要求。无论是银行通知播报、有声书批量生成,还是为视障用户定制朗读助手,传统的TTS系统往往受限于固…

作者头像 李华
网站建设 2026/10/3 6:49:21

局域网内跨平台传文件,没有比LocalSend更方便的了

01 引言 随手点选照片、视频、文档,附近设备立即出现接收选项,没有网络也能实现高速传输——这不是魔法,而是LocalSend创造的日常便利。 当你需要将手机里的照片传给笔记本电脑,或从Windows电脑给手机发送文档时,是否也…

作者头像 李华
网站建设 2026/10/1 23:44:13

GLM-TTS与Storyblok集成:体验驱动的内容管理

GLM-TTS与Storyblok集成:体验驱动的内容管理 在今天的数字内容生态中,用户不再满足于“只读”的静态信息。他们希望听到声音、感受情绪、获得沉浸式的交互体验。尤其是在教育、媒体和电商领域,语音内容正从“附加功能”演变为“核心交付形式…

作者头像 李华
网站建设 2026/10/1 23:44:13

GLM-TTS能否支持实时直播配音?低延迟传输挑战

GLM-TTS 能否用于实时直播配音?低延迟挑战的深度解析 在虚拟主播、游戏解说和在线教育日益普及的今天,用户对“输入即发声”的语音合成体验提出了更高要求。传统文本到语音(TTS)系统往往需要等待完整文本输入后才开始生成音频&…

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

如何用GLM-TTS生成YouTube视频配音并规避版权风险

如何用GLM-TTS生成YouTube视频配音并规避版权风险 在内容为王的时代,一个YouTube频道的成败,往往不只取决于画面剪辑和脚本质量,更在于声音是否“抓耳”。许多创作者曾面临这样的困境:使用商业TTS服务,音色千篇一律&am…

作者头像 李华