HalpMceInit
VOID __fastcall HalpMceInit(INT64 a1){
unsigned int v2;
unsigned int ActiveProcessorCount;
int *v4;
unsigned int v5;
struct _GROUP_AFFINITY *p_PreviousAffinity;
__int64 i;
struct _GROUP_AFFINITY Affinity;
struct _GROUP_AFFINITY PreviousAffinity;
Affinity = 0i64;
PreviousAffinity = 0i64;
if( (HalpFeatureBits & 4) == 0 || !*(_BYTE *)(a1 + 42) )
HalpMcaEnabled = 0;
if( !HalpMcaEnabled && (HalpFeatureBits & 8) == 0 )
HalpMceEnabled = 0;
v2 = 0;
ActiveProcessorCount = KeQueryActiveProcessorCountEx(0xFFFFu);
if( ActiveProcessorCount )
{
v4 = KiProcessorIndexToNumberMappingTable;
do
{
v5 = *v4;
Affinity.Reserved[1] = 0;
Affinity.Reserved[2] = 0;
*(_DWORD *)&Affinity.Group = (unsigned __int16)(v5 >> 6);
Affinity.Mask = 1i64 << (v5 & 0x3F);
if( v2 )
p_PreviousAffinity = 0i64;
else
p_PreviousAffinity = &PreviousAffinity;
KeSetSystemGroupAffinityThread(&Affinity, p_PreviousAffinity);
HalpHvInitMcaPcrContext();
for( i = *((_QWORD *)KeGetPcr() + 27); i; i = *(_QWORD *)(i + 176) )
HalpMceInitProcessor(a1, *(_QWORD *)(i + 164));
++v2;
++v4;
}
while( v2 < ActiveProcessorCount );
}
KeRevertToUserGroupAffinityThread(&PreviousAffinity);
if( HalpHvWheaEnlightenedCpuManager )
{
if( HalpMceEnabled )
{
HalpHvInitMcaStatusMsrCache();
HalpHvSetMachineCheckHandlerState();
}
}
}Referenced by:
HalpInitializeMce