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 52 0c 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