HalpHvInitMcaPcrContext
VOID __stdcall HalpHvInitMcaPcrContext(){
KPCR *Pcr;
int v1;
int v2;
unsigned int v3;
__int64 v4;
_DWORD *PoolWithTag;
int v6;
unsigned int v7;
int v8;
INT64 v9;
INT64 McaPcrContext;
int v11;
unsigned int i;
INT64 v13;
INT64 v14;
int v15;
int v16;
INT64 v17;
__int64 j;
unsigned int v19;
struct _PROCESSOR_NUMBER ProcNumber;
INT64 v21;
v19 = 0;
Pcr = KeGetPcr();
ProcNumber = 0;
if( HalpHvWheaEnlightenedCpuManager )
{
KeGetCurrentProcessorNumberEx(&ProcNumber);
v2 = v1;
if( !v1 && !HalpHvVpMcaPcrContextData )
{
v3 = 184 * KeQueryMaximumProcessorCountEx(0xFFFFu);
v4 = HalpMmAllocCtxAlloc(v3, v3);
HalpHvVpMcaPcrContextData = v4;
if( !v4 )
KeBugCheckEx(0xACu, v3, 0i64, (ULONG_PTR)"minkernel\\hals\\lib\\hv\\hvintel.c", 0x49Fui64);
memset(v4, 0i64);
}
if( !*((_QWORD *)Pcr + 27) )
{
PoolWithTag = 0i64;
if( qword_140C4A190 )
v6 = qword_140C4A190(4294967294i64, &v19, 0i64);
else
v6 = -1073741823;
if( v6 == -1073741789 )
{
v7 = 8 * v19;
PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, 8 * v19, 0x206C6148ui64);
if( !PoolWithTag )
KeBugCheckEx(0xACu, v7, 0i64, (ULONG_PTR)"minkernel\\hals\\lib\\hv\\hvintel.c", 0x4BAui64);
if( qword_140C4A190 )
v6 = qword_140C4A190(4294967294i64, &v19, PoolWithTag);
else
v6 = -1073741823;
}
if( v6 < 0 || !v19 )
KeBugCheckEx(0x5Cu, 0x8200ui64, 0i64, (ULONG_PTR)"minkernel\\hals\\lib\\hv\\hvintel.c", 0x4C6ui64);
v8 = 0;
v21 = *PoolWithTag & 0x7FFFFFFF;
v9 = v21;
McaPcrContext = HalpGetMcaPcrContext(v21);
*(_QWORD *)(McaPcrContext + 176) = 0i64;
*(_QWORD *)(McaPcrContext + 164) = v9;
*((_QWORD *)Pcr + 27) = McaPcrContext;
v11 = 0;
for( i = 1; i < v19; McaPcrContext = v14 )
{
v8 &= ~1u;
HIDWORD(v21) = v8;
v11 = v8;
LODWORD(v21) = PoolWithTag[i] & 0x7FFFFFFF;
v13 = v21;
v14 = HalpGetMcaPcrContext(v21);
++i;
*(_QWORD *)(v14 + 176) = 0i64;
*(_QWORD *)(v14 + 164) = v13;
*(_QWORD *)(McaPcrContext + 176) = v14;
}
v15 = v11 | 1;
v16 = v2 & 0x7FFFFFFF;
v21 = __PAIR64__(v15, v16);
v17 = HalpGetMcaPcrContext(__SPAIR64__(v15, v16));
*(_QWORD *)(v17 + 176) = 0i64;
*(_QWORD *)(v17 + 164) = __PAIR64__(v15, v16);
*(_QWORD *)(McaPcrContext + 176) = v17;
ExFreePoolWithTag(PoolWithTag, 0x206C6148u);
}
for( j = *((_QWORD *)KeGetPcr() + 27); j; j = *(_QWORD *)(j + 176) )
{
if( !*(_BYTE *)(j + 152) )
{
*(_DWORD *)(j + 40) = 275;
*(_QWORD *)(j + 64) = HalpCmciDeferredRoutine;
*(_QWORD *)(j + 72) = j;
*(_QWORD *)(j + 96) = 0i64;
*(_QWORD *)(j + 56) = 0i64;
KeSetTargetProcessorDpcEx((_KDPC *)(j + 40), &ProcNumber);
*(_BYTE *)(j + 152) = 1;
}
}
}
}Referenced by:
HalpMceInit