HalpHvInitMcaPcrContext
VOID __stdcall HalpHvInitMcaPcrContext(){
KPCR *Pcr;
NTSTATUS CurrentProcessorNumber;
int v2;
size_t v3;
UINT8 *v4;
VOID **PoolWithTag;
int v6;
unsigned int v7;
int v8;
INT64 v9;
__int64 v10;
__int64 v11;
int v12;
unsigned int i;
INT64 v14;
__int64 v15;
int v16;
int v17;
__int64 v18;
__int64 j;
unsigned int v20;
_PROCESSOR_NUMBER ProcNumber;
INT64 v22;
v20 = 0;
Pcr = KeGetPcr();
ProcNumber = 0;
if( byte_140C4A110 )
{
CurrentProcessorNumber = KeGetCurrentProcessorNumberEx(&ProcNumber.Group);
if( !CurrentProcessorNumber && !*(&stru_140CF2E80 + 810) )
{
KeQueryMaximumProcessorCountEx(0xFFFFu);
v3 = 184 * v2;
v4 = HalpMmAllocCtxAlloc((_HALP_ALLOC_CONTEXT *)(unsigned int)(184 * v2), (unsigned int)(184 * v2));
*(&stru_140CF2E80 + 810) = v4;
if( !v4 )
KeBugCheckEx(0xACu, (PVOID)v3, 0i64, "minkernel\\hals\\lib\\hv\\hvintel.c", (PVOID)0x49F);
memset(v4, 0i64, v3);
}
if( !*(_QWORD *)&Pcr->HalReserved[6] )
{
PoolWithTag = 0i64;
if( qword_140C4A190 )
v6 = qword_140C4A190(4294967294i64, &v20, 0i64);
else
v6 = -1073741823;
if( v6 == -1073741789 )
{
v7 = 8 * v20;
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 8 * v20, 543973704i64);
if( !PoolWithTag )
KeBugCheckEx(0xACu, (PVOID)v7, 0i64, "minkernel\\hals\\lib\\hv\\hvintel.c", (PVOID)0x4BA);
if( qword_140C4A190 )
v6 = qword_140C4A190(4294967294i64, &v20, PoolWithTag);
else
v6 = -1073741823;
}
if( v6 < 0 || !v20 )
KeBugCheckEx(0x5Cu, (PVOID)0x8200, 0i64, "minkernel\\hals\\lib\\hv\\hvintel.c", (PVOID)0x4C6);
v8 = 0;
v22 = *(_DWORD *)PoolWithTag & 0x7FFFFFFF;
v9 = v22;
LODWORD(v10) = HalpGetMcaPcrContext(v22);
v11 = v10;
*(_QWORD *)(v10 + 176) = 0i64;
*(_QWORD *)(v10 + 164) = v9;
*(_QWORD *)&Pcr->HalReserved[6] = v10;
v12 = 0;
for( i = 1; i < v20; v11 = v15 )
{
v8 &= ~1u;
HIDWORD(v22) = v8;
v12 = v8;
LODWORD(v22) = *((_DWORD *)PoolWithTag + i) & 0x7FFFFFFF;
v14 = v22;
LODWORD(v15) = HalpGetMcaPcrContext(v22);
++i;
*(_QWORD *)(v15 + 176) = 0i64;
*(_QWORD *)(v15 + 164) = v14;
*(_QWORD *)(v11 + 176) = v15;
}
v16 = v12 | 1;
v17 = CurrentProcessorNumber & 0x7FFFFFFF;
v22 = __PAIR64__(v16, v17);
LODWORD(v18) = HalpGetMcaPcrContext(__SPAIR64__(v16, v17));
*(_QWORD *)(v18 + 176) = 0i64;
*(_QWORD *)(v18 + 164) = __PAIR64__(v16, v17);
*(_QWORD *)(v11 + 176) = v18;
ExFreePoolWithTag(PoolWithTag, 0x206C6148u);
}
for( j = *(_QWORD *)&KeGetPcr()->HalReserved[6]; 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