bool InitMultiCPUInformation() .9u0WP95
{ A[}I -
DWORD* dwPCRAddr; <X; #=H
DWORD dwCPUNumbers=1; )-nFfjLs
BYTE* Address=(BYTE*)HalInitializeProcessor; 7 l/O<zm
DWORD i,len=128; -W,j"M;
bool bOK=false; +/qW V>
L7kNK :
memset(gCPULocalAPIC_ID,0xff,sizeof(gCPULocalAPIC_ID)); |1`%WQ[qo
__try " d !
{ 2`bjty%$
for(i = 0; i < len;i++) /Wj3|-4p
{ 4ra&/?N9"
if(Address==0x89) > 5c#_@
{ ^o<50Tcl
if(*(WORD*)&Address[i+1]==0x850c) r]]Gtc/S;
{ V<@n(N/
dwPCRAddr=*(DWORD**)&Address[i+3]; `}DnBOh
if((*(DWORD*)&dwPCRAddr & 0x80000000)&& *(BYTE**)&dwPCRAddr<=&Address[0x80000]) 'xfa^V~|
{ /07YJv_?
for(;dwPCRAddr[dwCPUNumbers-1];dwCPUNumbers++); CVc:/?f(
bOK=true; T/j+M.&Sja
} A: e/Z^
} U C(bQNq
} ">d5z8
} 'TOWbZ_c
} <Q, C({OL
__except(EXCEPTION_EXECUTE_HANDLER) )S)tJxA{
{ B5 5X/:m
::DbgPrint("InitMultiCPUInformation exception ..../n"); yT3VFM1
} `<q<%V7
if(bOK) ?)71?Q-
{ O[A^i|R
gCPUNumbers=dwCPUNumbers-1; @fr @>[+
gPCRArray = (PKPCR*)dwPCRAddr; &MX@r`qN
gpMCPUReg = new X86_REG_CONTEXT[gCPUNumbers]; +c:Od40y
if(gpMCPUReg==NULL) .6m"M| t
return false; r]wZX 5(
gpMCPULocalApic = new SAVELOCALAPIC[gCPUNumbers]; ?dQ]n!TTh
if(gpMCPULocalApic==NULL) b!NW!z$,h
return false; m*T}gn80p
} D*XxVewE
::DbgPrint("Syser : Found %d CPU(s)/n",gCPUNumbers); Zh7ZYL?t
return true; /3^:@[D
} 7Cgtkyd.
;/0~y*<A_h
以上的函数获得了每个CPU的 PKPCR结构的指针。你想要的数据都在这个结构里面了。包括每个CPU的IDT,GDT,TSS等等信息
{ A[}I -
DWORD* dwPCRAddr; <X; #=H
DWORD dwCPUNumbers=1; )-nFfjLs
BYTE* Address=(BYTE*)HalInitializeProcessor; 7 l/O<zm
DWORD i,len=128; -W,j"M;
bool bOK=false; +/qW V>
L7kNK :
memset(gCPULocalAPIC_ID,0xff,sizeof(gCPULocalAPIC_ID)); |1`%WQ[qo
__try " d !
{ 2`bjty%$
for(i = 0; i < len;i++) /Wj3|-4p
{ 4ra&/?N9"
if(Address==0x89) > 5c#_@
{ ^o<50Tcl
if(*(WORD*)&Address[i+1]==0x850c) r]]Gtc/S;
{ V<@n(N/
dwPCRAddr=*(DWORD**)&Address[i+3]; `}DnBOh
if((*(DWORD*)&dwPCRAddr & 0x80000000)&& *(BYTE**)&dwPCRAddr<=&Address[0x80000]) 'xfa^V~|
{ /07YJv_?
for(;dwPCRAddr[dwCPUNumbers-1];dwCPUNumbers++); CVc:/?f(
bOK=true; T/j+M.&Sja
} A: e/Z^
} U C(bQNq
} ">d5z8
} 'TOWbZ_c
} <Q, C({OL
__except(EXCEPTION_EXECUTE_HANDLER) )S)tJxA{
{ B5 5X/:m
::DbgPrint("InitMultiCPUInformation exception ..../n"); yT3VFM1
} `<q<%V7
if(bOK) ?)71?Q-
{ O[A^i|R
gCPUNumbers=dwCPUNumbers-1; @fr @>[+
gPCRArray = (PKPCR*)dwPCRAddr; &MX@r`qN
gpMCPUReg = new X86_REG_CONTEXT[gCPUNumbers]; +c:Od40y
if(gpMCPUReg==NULL) .6m"M| t
return false; r]wZX 5(
gpMCPULocalApic = new SAVELOCALAPIC[gCPUNumbers]; ?dQ]n!TTh
if(gpMCPULocalApic==NULL) b!NW!z$,h
return false; m*T}gn80p
} D*XxVewE
::DbgPrint("Syser : Found %d CPU(s)/n",gCPUNumbers); Zh7ZYL?t
return true; /3^:@[D
} 7Cgtkyd.
;/0~y*<A_h
以上的函数获得了每个CPU的 PKPCR结构的指针。你想要的数据都在这个结构里面了。包括每个CPU的IDT,GDT,TSS等等信息