news 2026/5/25 12:27:31

ACPI!ParseArg函数分析之N型和O型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ACPI!ParseArg函数分析之N型和O型

ACPI!ParseArg函数分析之N型和O型

0: kd> x acpi!ParseArg
f7427378 ACPI!ParseArg (struct _ctxt *, char, struct _ObjData *)

0: kd> kc
#
00 ACPI!ParseArg
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
0: kd> dv
pctxt = 0x8997c000
chArgType = 0n78 'N'
pdataArg = 0x899b2200

0: kd> dx -id 0,0,899a2278 -r1 ((ACPI!_amlterm *)0xf7438cf0)
((ACPI!_amlterm *)0xf7438cf0) : 0xf7438cf0 [Type: _amlterm *]
[+0x000] pszTermName : 0xf742c76c : "Name" [Type: char *]
[+0x004] dwOpcode : 0x8 [Type: unsigned long]
[+0x008] pszArgTypes : 0xf742c768 : "NO" [Type: char *]
[+0x00c] dwTermClass : 0x1 [Type: unsigned long]
[+0x010] dwfOpcode : 0x0 [Type: unsigned long]
[+0x014] pfnCallBack : 0x0 [Type: long (__cdecl*)(unsigned long,unsigned long,_NSObj *,unsigned long)]
[+0x018] dwCBData : 0x0 [Type: unsigned long]
[+0x01c] pfnOpcode : 0xf74259e3 [Type: long (__cdecl*)()]

第一个参数类型是:N,第二个参数类型O。

0: kd> dx -id 0,0,899a2278 -r1 ((ACPI!_ctxt *)0x8997c000)
((ACPI!_ctxt *)0x8997c000) : 0x8997c000 [Type: _ctxt *]
[+0x000] dwSig : 0x54585443 [Type: unsigned long]
[+0x004] pbCtxtEnd : 0x8997e000 : 0x54 [Type: unsigned char *]
[+0x008] listCtxt [Type: _List]
[+0x010] listQueue [Type: _List]
[+0x018] pplistCtxtQueue : 0x0 [Type: _List * *]
[+0x01c] plistResources : 0x0 [Type: _List *]
[+0x020] dwfCtxt : 0x10 [Type: unsigned long]
[+0x024] pnsObj : 0x0 [Type: _NSObj *]
[+0x028] pnsScope : 0x899b21bc [Type: _NSObj *]
[+0x02c] powner : 0x899af330 [Type: _objowner *]
[+0x030] pcall : 0x8997df34 [Type: _call *]
[+0x034] pnctxt : 0x0 [Type: _nestedctxt *]
[+0x038] dwSyncLevel : 0x0 [Type: unsigned long]
[+0x03c] pbOp : 0xf74c8cb2 : 0x5f [Type: unsigned char *]


#define ARGTYPE_NAME 'N' //name argument
#define ARGTYPE_DATAOBJ 'O' //data argument
#define ARGTYPE_DWORD 'D' //numeric dword argument
#define ARGTYPE_WORD 'W' //numeric word argument
#define ARGTYPE_BYTE 'B' //numeric byte argument
#define ARGTYPE_SNAME 'S' //supername argument
#define ARGTYPE_SNAME2 's' //supername argument
// object can be non-existing
#define ARGTYPE_OPCODE 'C' //opcode argument

switch (chArgType)
{
case ARGTYPE_NAME:
rc = ParseObjName(&pctxt->pbOp, pdataArg, FALSE);
break;


case ARGTYPE_OPCODE:
rc = ParseOpcode(pctxt, NULL, pdataArg);
break;

NTSTATUS LOCAL ParseObjName(PUCHAR *ppbOp, POBJDATA pdata, BOOLEAN fErrOK)
{
TRACENAME("PARSEOBJNAME")
NTSTATUS rc = STATUS_SUCCESS;
PAMLTERM pamlterm = OpcodeTable[**ppbOp];
char szNameBuff[MAX_NAME_LEN+1];

ENTER(2, ("ParseObjName(pbOp=%x,pdata=%x,fErrOK=%x)\n",
*ppbOp, pdata, fErrOK));

ASSERT(pdata != NULL);

if ((pamlterm == NULL) || !(pamlterm->dwfOpcode & OF_NAME_OBJECT))
{
if (fErrOK)
{
rc = AMLIERR_INVALID_OPCODE;
}
else
{
rc = AMLI_LOGERR(AMLIERR_INVALID_OPCODE,
("ParseObjName: invalid opcode 0x%02x at 0x%08x",
**ppbOp, *ppbOp));
}
}
else if ((rc = ParseName(ppbOp, szNameBuff, sizeof(szNameBuff))) ==
STATUS_SUCCESS)
{
pdata->dwDataType = OBJTYPE_STRDATA;
pdata->dwDataLen = STRLEN(szNameBuff) + 1;
if ((pdata->pbDataBuff = (PUCHAR)NEWSDOBJ(gpheapGlobal,
pdata->dwDataLen)) == NULL)
{
rc = AMLI_LOGERR(AMLIERR_OUT_OF_MEM,
("ParseObjName: failed to allocate name buffer - %s",
szNameBuff));
}
else
{
MEMCPY(pdata->pbDataBuff, szNameBuff, pdata->dwDataLen);
}
}

EXIT(2, ("ParseObjName=%x (Name=%s)\n", rc, szNameBuff));
return rc;
} //ParseObjName


NTSTATUS LOCAL ParseName(PUCHAR *ppbOp, PSZ pszBuff, ULONG dwLen)
{
TRACENAME("PARSENAME")
NTSTATUS rc = STATUS_SUCCESS;

ENTER(2, ("ParseName(pbOp=%x,pszBuff=%x,Len=%d)\n",
*ppbOp, pszBuff, dwLen));

if (**ppbOp == OP_ROOT_PREFIX)
{
if (dwLen > 1)
{
STRCPY(pszBuff, "\\");
(*ppbOp)++;
rc = ParseNameTail(ppbOp, pszBuff, dwLen);
}
else
{
rc = AMLI_LOGERR(AMLIERR_NAME_TOO_LONG,
("ParseName: name too long - \"%s\"", pszBuff));
}
}
else if (**ppbOp == OP_PARENT_PREFIX)
{
if (dwLen > 1)
{
int i;

STRCPY(pszBuff, "^");
for ((*ppbOp)++, i = 1;
(i < (int)dwLen) && (**ppbOp == OP_PARENT_PREFIX);
(*ppbOp)++, i++)
{
pszBuff[i] = '^';
}
pszBuff[i] = '\0';

if (**ppbOp == OP_PARENT_PREFIX)
{
rc = AMLI_LOGERR(AMLIERR_NAME_TOO_LONG,
("ParseName: name too long - \"%s\"",
pszBuff));
}
else
{
rc = ParseNameTail(ppbOp, pszBuff, dwLen);
}
}
else
{
rc = AMLI_LOGERR(AMLIERR_NAME_TOO_LONG,
("ParseName: name too long - \"%s\"", pszBuff));
}
}
else if (dwLen > 0)
{
pszBuff[0] = '\0';
rc = ParseNameTail(ppbOp, pszBuff, dwLen);
}
else
{
rc = AMLI_LOGERR(AMLIERR_NAME_TOO_LONG,
("ParseName: name too long - \"%s\"", pszBuff));
}

#ifdef DEBUGGER
if ((rc == STATUS_SUCCESS) &&
(gDebugger.dwfDebugger &
(DBGF_AMLTRACE_ON | DBGF_STEP_MODES)))
{
PRINTF("%s", pszBuff);
}
#endif

EXIT(2, ("ParseName=%x (Name=%s)\n", rc, pszBuff));
return rc;
} //ParseName

0: kd> kc
#
00 ACPI!ParseObjName
01 ACPI!ParseArg
02 ACPI!ParseTerm
03 ACPI!RunContext
04 ACPI!InsertReadyQueue
05 ACPI!RestartContext
06 ACPI!SyncLoadDDB
07 ACPI!AMLILoadDDB
08 ACPI!ACPIInitializeDDB
09 ACPI!ACPIInitializeDDBs
0a ACPI!ACPIInitialize
0b ACPI!ACPIInitStartACPI
0c ACPI!ACPIRootIrpStartDevice
0d ACPI!ACPIDispatchIrp
0e nt!IofCallDriver
0f nt!IopSynchronousCall
10 nt!IopStartDevice
11 nt!PipProcessStartPhase1
12 nt!PipProcessDevNodeTree
13 nt!PipDeviceActionWorker
14 nt!PipRequestDeviceAction
15 nt!IopInitializeBootDrivers
16 nt!IoInitSystem
17 nt!Phase1Initialization
18 nt!PspSystemThreadStartup
19 nt!KiThreadStartup
0: kd> dv
ppbOp = 0x8997c03c
pdata = 0x899b2200
fErrOK = 0x00 ''
szNameBuff = char [256] "d???"
0: kd> dd 0x8997c03c
8997c03c f74c8cb2 00000000 00000000 00000000
8997c04c 00000000 00000000 f741eeb5 00000000
8997c05c f789a1bc 000a0008 00000000 8997c068
8997c06c 8997c068 00000000 00000000 00000000
8997c07c 00000000 00000000 00000000 01000013
8997c08c 00000000 00000000 f741eff5 8997c000
8997c09c 00000000 00000000 00000000 899af000
8997c0ac 00000000 00000000 00000000 00000000
0: kd> db f74c8cb2
f74c8cb2 5f 41 44 52 0c 00 00 01-00 5b 82 46 58 49 53 41 _ADR.....[.FXISA
f74c8cc2 5f 08 5f 41 44 52 0c 00-00 07 00 5b 82 4a 14 4d _._ADR.....[.J.M
f74c8cd2 42 52 44 08 5f 48 49 44-0c 41 d0 0c 02 08 5f 55 BRD._HID.A...._U


PAMLTERM pamlterm = OpcodeTable[**ppbOp];

0: kd> ?5f
Evaluate expression: 95 = 0000005f

0: kd> dx -id 0,0,899a2278 -r1 ((ACPI!_amlterm *)0xf74395f0)
((ACPI!_amlterm *)0xf74395f0) : 0xf74395f0 [Type: _amlterm *]
[+0x000] pszTermName : 0x0 [Type: char *]
[+0x004] dwOpcode : 0xffffffff [Type: unsigned long]
[+0x008] pszArgTypes : 0x0 [Type: char *]
[+0x00c] dwTermClass : 0x5 [Type: unsigned long]
[+0x010] dwfOpcode : 0x20 [Type: unsigned long]
[+0x014] pfnCallBack : 0x0 [Type: long (__cdecl*)(unsigned long,unsigned long,_NSObj *,unsigned long)]
[+0x018] dwCBData : 0x0 [Type: unsigned long]
[+0x01c] pfnOpcode : 0x0 [Type: long (__cdecl*)()]


#define OF_NAME_OBJECT 0x00000020


0: kd> t
eax=f7899fec ebx=f74395f0 ecx=899b2200 edx=00000028 esi=899b2200 edi=8997c03c
eip=f742675c esp=f7899fd0 ebp=f789a0f0 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!ParseName:
f742675c 55 push ebp
0: kd> dv
ppbOp = 0x8997c03c
pszBuff = 0xf7899fec "d???"
dwLen = 0x100

#define OP_EXT_PREFIX 0x5b // '['
#define OP_ROOT_PREFIX 0x5c // '\'
#define OP_PARENT_PREFIX 0x5e // '^'

else if (dwLen > 0)
{
pszBuff[0] = '\0';
rc = ParseNameTail(ppbOp, pszBuff, dwLen);
}


0: kd> t
eax=f74c8c5f ebx=00000100 ecx=899b2200 edx=00000028 esi=8997c03c edi=f7899fec
eip=f7426495 esp=f7899fb0 ebp=f7899fcc iopl=0 nv up ei pl nz na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000206
ACPI!ParseNameTail:
f7426495 55 push ebp
0: kd> dv
ppbOp = 0x8997c03c
pszBuff = 0xf7899fec ""
dwLen = 0x100


else
icNameSegs = 1;

while ((icNameSegs > 0) && (iLen + sizeof(NAMESEG) < dwLen))


#define STRCPYN strncpy
typedef ULONG NAMESEG;

STRCPYN(&pszBuff[iLen], (PSZ)(*ppbOp), sizeof(NAMESEG));


0: kd> dv
ppbOp = 0x8997c03c
pszBuff = 0xf7899fec ""
dwLen = 0x100
icNameSegs = 0n1
rc = 0n0
0: kd> db 0xf7899fec
f7899fec 00 9c 89 f7 68 9c 89 f7-6c 9c 89 f7 70 9c 89 f7 ....h...l...p...
f7899ffc cc ad 89 f7 d0 3e af 80-c0 5f a0 80 ff ff ff ff .....>..._......


0: kd> db 0xf7899fec
f7899fec 5f 41 44 52 00 9c 89 f7-6c 9c 89 f7 70 9c 89 f7 _ADR....l...p...

0: kd> dd 0x8997c03c
8997c03c f74c8cb2 00000000 00000000 00000000
0: kd> db f74c8cb2
f74c8cb2 5f 41 44 52 0c 00 00 01-00 5b 82 46 58 49 53 41 _ADR.....[.FXISA

复制了4个字节。

(*ppbOp) += sizeof(NAMESEG); 向前移动4个字节,下一个参数用。
0: kd> dd 0x8997c03c
8997c03c f74c8cb6 00000000 00000000 00000000 f74c8cb2+4=f74c8cb6

icNameSegs--;

0: kd> dv
ppbOp = 0x00000000
pszBuff = 0xf7899fec "_ADR"
dwLen = 0x100
icNameSegs = 0n0


NTSTATUS LOCAL ParseObjName(PUCHAR *ppbOp, POBJDATA pdata, BOOLEAN fErrOK)
{


else if ((rc = ParseName(ppbOp, szNameBuff, sizeof(szNameBuff))) ==
STATUS_SUCCESS) //返回到这里:
{
pdata->dwDataType = OBJTYPE_STRDATA;
pdata->dwDataLen = STRLEN(szNameBuff) + 1;
if ((pdata->pbDataBuff = (PUCHAR)NEWSDOBJ(gpheapGlobal,
pdata->dwDataLen)) == NULL)
{
rc = AMLI_LOGERR(AMLIERR_OUT_OF_MEM,
("ParseObjName: failed to allocate name buffer - %s",
szNameBuff));
}
else
{
MEMCPY(pdata->pbDataBuff, szNameBuff, pdata->dwDataLen);
}
}

0: kd> dv
ppbOp = 0x8997c03c
pdata = 0x899b2200
fErrOK = 0x00 ''
szNameBuff = char [256] "_ADR"
0: kd> dx -id 0,0,899a2278 -r1 ((ACPI!_ObjData *)0x899b2200)
((ACPI!_ObjData *)0x899b2200) : 0x899b2200 [Type: _ObjData *]
[+0x000] dwfData : 0x0 [Type: unsigned short]
[+0x002] dwDataType : 0x0 [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 : 0x0 [Type: unsigned long]
[+0x010] pbDataBuff : 0x0 [Type: unsigned char *]


0: kd> dx -id 0,0,899a2278 -r1 ((ACPI!_ObjData *)0x899b2200)
((ACPI!_ObjData *)0x899b2200) : 0x899b2200 [Type: _ObjData *]
[+0x000] dwfData : 0x0 [Type: unsigned short]
[+0x002] dwDataType : 0x2 [Type: unsigned short] OBJTYPE_STRDATA
[+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 : 0x899b0b14 : 0x5f [Type: unsigned char *]


#define NEWSDOBJ(h,n) (++gdwcSDObjs, HeapAlloc(h, 'RTSH', n))
0: kd> x acpi!gdwcSDObjs
f743a870 ACPI!gdwcSDObjs = 6


第一个参数类型是N,第二个参数类型是O。
0: kd> t
eax=0000004f ebx=8997c000 ecx=899b2200 edx=00000000 esi=8997ddc4 edi=00000001
eip=f7427378 esp=f789a114 ebp=f789a130 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!ParseArg:
f7427378 55 push ebp
0: kd> dv
pctxt = 0x8997c000
chArgType = 0n79 'O'
pdataArg = 0x899b2214


case ARGTYPE_DATAOBJ:
if (((rc = ParseIntObj(&pctxt->pbOp, pdataArg, TRUE)) ==
AMLIERR_INVALID_OPCODE) &&
((rc = ParseString(&pctxt->pbOp, pdataArg, TRUE)) ==
AMLIERR_INVALID_OPCODE) &&
((*pctxt->pbOp == OP_BUFFER) || (*pctxt->pbOp == OP_PACKAGE)))
{
rc = PushTerm(pctxt, pctxt->pbOp, NULL,
OpcodeTable[*pctxt->pbOp], pdataArg);
pctxt->pbOp++;
}
break;


0: kd> dx -id 0,0,899a2278 -r1 ((ACPI!_term *)0x8997ddc4)
((ACPI!_term *)0x8997ddc4) : 0x8997ddc4 [Type: _term *]
[+0x000] FrameHdr [Type: _framehdr]
[+0x010] pbOpTerm : 0xf74c8cb1 : 0x8 [Type: unsigned char *]
[+0x014] pbOpEnd : 0x0 [Type: unsigned char *]
[+0x018] pbScopeEnd : 0xf74c8cbb : 0x5b [Type: unsigned char *]
[+0x01c] pamlterm : 0xf7438cf0 [Type: _amlterm *]
[+0x020] pnsObj : 0x0 [Type: _NSObj *]
[+0x024] iArg : 1 [Type: int]
[+0x028] icArgs : 2 [Type: int]
[+0x02c] pdataArgs : 0x899b2200 [Type: _ObjData *]
[+0x030] pdataResult : 0x8997c040 [Type: _ObjData *]


0: kd> dt _ObjData 0x899b2200
ACPI!_ObjData
+0x000 dwfData : 0
+0x002 dwDataType : 2
+0x004 dwRefCount : 0
+0x004 pdataBase : (null)
+0x008 dwDataValue : 0
+0x008 uipDataValue : 0
+0x008 pnsAlias : (null)
+0x008 pdataAlias : (null)
+0x008 powner : (null)
+0x00c dwDataLen : 5
+0x010 pbDataBuff : 0x899b0b14 "_ADR"
0: kd> dt _ObjData 0x899b2200+14
ACPI!_ObjData
+0x000 dwfData : 0
+0x002 dwDataType : 1
+0x004 dwRefCount : 0
+0x004 pdataBase : (null)
+0x008 dwDataValue : 0x10000
+0x008 uipDataValue : 0x10000
+0x008 pnsAlias : 0x00010000 _NSObj
+0x008 pdataAlias : 0x00010000 _ObjData
+0x008 powner : 0x00010000 Void
+0x00c dwDataLen : 0
+0x010 pbDataBuff : (null)


NTSTATUS LOCAL ParseIntObj(PUCHAR *ppbOp, POBJDATA pdataResult, BOOLEAN fErrOK)
{
TRACENAME("PARSEINTOBJ")
NTSTATUS rc = STATUS_SUCCESS;
UCHAR bOp;

ENTER(2, ("ParseIntObj(pbOp=%x,pdataResult=%x,fErrOK=%x)\n",
*ppbOp, pdataResult, fErrOK));

ASSERT(pdataResult != NULL);
bOp = **ppbOp;
(*ppbOp)++;
pdataResult->dwDataType = OBJTYPE_INTDATA;
pdataResult->uipDataValue = 0;

switch (bOp)
{
case OP_ZERO:
pdataResult->uipDataValue = DATAVALUE_ZERO;
#ifdef DEBUGGER
if (gDebugger.dwfDebugger &
(DBGF_AMLTRACE_ON | DBGF_STEP_MODES))
{
PRINTF("Zero");
}
#endif
break;

case OP_ONE:
pdataResult->uipDataValue = DATAVALUE_ONE;
#ifdef DEBUGGER
if (gDebugger.dwfDebugger &
(DBGF_AMLTRACE_ON | DBGF_STEP_MODES))
{
PRINTF("One");
}
#endif
break;

case OP_ONES:
pdataResult->uipDataValue = DATAVALUE_ONES;
#ifdef DEBUGGER
if (gDebugger.dwfDebugger &
(DBGF_AMLTRACE_ON | DBGF_STEP_MODES))
{
PRINTF("Ones");
}
#endif
break;

case OP_REVISION:
pdataResult->uipDataValue = AMLI_REVISION;
#ifdef DEBUGGER
if (gDebugger.dwfDebugger &
(DBGF_AMLTRACE_ON | DBGF_STEP_MODES))
{
PRINTF("Revision");
}
#endif
break;

case OP_BYTE:
MEMCPY(&pdataResult->uipDataValue, *ppbOp, sizeof(UCHAR));
(*ppbOp) += sizeof(UCHAR);
#ifdef DEBUGGER
if (gDebugger.dwfDebugger &
(DBGF_AMLTRACE_ON | DBGF_STEP_MODES))
{
PRINTF("0x%x", pdataResult->uipDataValue);
}
#endif
break;

case OP_WORD:
MEMCPY(&pdataResult->uipDataValue, *ppbOp, sizeof(USHORT));
(*ppbOp) += sizeof(USHORT);
#ifdef DEBUGGER
if (gDebugger.dwfDebugger &
(DBGF_AMLTRACE_ON | DBGF_STEP_MODES))
{
PRINTF("0x%x", pdataResult->uipDataValue);
}
#endif
break;

case OP_DWORD:
MEMCPY(&pdataResult->uipDataValue, *ppbOp, sizeof(ULONG));
(*ppbOp) += sizeof(ULONG);
#ifdef DEBUGGER
if (gDebugger.dwfDebugger &
(DBGF_AMLTRACE_ON | DBGF_STEP_MODES))
{
PRINTF("0x%x", pdataResult->uipDataValue);
}
#endif
break;

default:
(*ppbOp)--;
if (fErrOK)
{
rc = AMLIERR_INVALID_OPCODE;
}
else
{
rc = AMLI_LOGERR(AMLIERR_INVALID_OPCODE,
("ParseIntObj: invalid opcode 0x%02x at 0x%08x",
**ppbOp, *ppbOp));
}
}

EXIT(2, ("ParseIntObj=%x (pbOp=%x,Value=%x)\n",
rc, *ppbOp, pdataResult->uipDataValue));
return rc;
} //ParseIntObj


#define OP_BYTE 0x0a
#define OP_WORD 0x0b
#define OP_DWORD 0x0c

0: kd> db f74c8cbb-80
f74c8c3b 5f 53 42 5f 50 43 49 30-49 53 41 5f 4c 4e 4b 41 _SB_PCI0ISA_LNKA
f74c8c4b 0a 00 12 1e 04 0c ff ff-07 00 0a 01 5c 2f 04 5f ............\/._
f74c8c5b 53 42 5f 50 43 49 30 49-53 41 5f 4c 4e 4b 42 0a SB_PCI0ISA_LNKB.
f74c8c6b 00 12 1e 04 0c ff ff 07-00 0a 02 5c 2f 04 5f 53 ...........\/._S
f74c8c7b 42 5f 50 43 49 30 49 53-41 5f 4c 4e 4b 43 0a 00 B_PCI0ISA_LNKC..
f74c8c8b 12 1e 04 0c ff ff 07 00-0a 03 5c 2f 04 5f 53 42 ..........\/._SB
f74c8c9b 5f 50 43 49 30 49 53 41-5f 4c 4e 4b 44 0a 00 5b _PCI0ISA_LNKD..[
f74c8cab 82 0f 41 47 50 5f 08 5f-41 44 520c 00 00 01 00..AGP_._ADR.....
0: kd> db f74c8cbb
f74c8cbb 5b 82 46 58 49 53 41 5f-08 5f 41 44 52 0c 00 00 [.FXISA_._ADR...

0c 00 00 01 00

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

Tesseract OCR语言包完整实战指南:解锁多语言文本识别新境界

Tesseract OCR语言包完整实战指南&#xff1a;解锁多语言文本识别新境界 【免费下载链接】tessdata 训练模型基于‘最佳’LSTM模型的一个快速变体以及遗留模型。 项目地址: https://gitcode.com/gh_mirrors/te/tessdata 想要让Tesseract OCR真正发挥威力&#xff0c;语言…

作者头像 李华
网站建设 2026/5/22 23:48:09

Obsidian插件汉化与i18n翻译工具深度解析:从原理到实战应用

Obsidian插件汉化与i18n翻译工具深度解析&#xff1a;从原理到实战应用 【免费下载链接】obsidian-i18n 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-i18n 在Obsidian国际化进程中&#xff0c;插件本地化一直是用户面临的核心挑战。obsidian-i18n作为专业的…

作者头像 李华
网站建设 2026/5/8 23:50:41

MaterialDesignInXamlToolkit终极指南:快速打造现代化WPF应用界面

MaterialDesignInXamlToolkit终极指南&#xff1a;快速打造现代化WPF应用界面 【免费下载链接】MaterialDesignInXamlToolkit Googles Material Design in XAML & WPF, for C# & VB.Net. 项目地址: https://gitcode.com/gh_mirrors/ma/MaterialDesignInXamlToolkit …

作者头像 李华
网站建设 2026/5/15 7:37:51

微信机器人账号安全终极指南:告别封号困扰

微信机器人账号安全终极指南&#xff1a;告别封号困扰 【免费下载链接】wechat-bot &#x1f916;一个基于 WeChaty 结合 DeepSeek / ChatGPT / Kimi / 讯飞等Ai服务实现的微信机器人 &#xff0c;可以用来帮助你自动回复微信消息&#xff0c;或者管理微信群/好友&#xff0c;检…

作者头像 李华
网站建设 2026/5/8 14:35:14

PHP GoogleAuthenticator终极指南:3步实现双重身份验证

在当今数字化时代&#xff0c;账户安全已成为每个开发者和用户都必须重视的问题。PHP GoogleAuthenticator是一个强大的开源工具&#xff0c;专门用于实现Google Authenticator双重身份验证功能&#xff0c;让PHP应用的安全防护提升到专业级别。这个轻量级类库能够生成动态验证…

作者头像 李华
网站建设 2026/5/22 17:00:00

LiveSplit速度跑计时器:从零到精通的完整实战指南

LiveSplit速度跑计时器&#xff1a;从零到精通的完整实战指南 【免费下载链接】LiveSplit A sleek, highly customizable timer for speedrunners. 项目地址: https://gitcode.com/gh_mirrors/li/LiveSplit 你是否曾经在挑战游戏速度跑记录时&#xff0c;因为计时不准确…

作者头像 李华