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 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