MiZeroPageCalibrate
VOID __fastcall MiZeroPageCalibrate(INT64 a1, INT64 a2){
UINT64 v4;
__int64 v5;
__int64 v6;
UINT64 v7;
VOID *PoolMm;
VOID *v9;
VOID *v10;
void *v11;
UINT8 CalibrationResultsMemory;
unsigned __int64 v13;
char v14;
void *v15;
ULONG_PTR Context;
int v17;
__int64 v18;
int v19;
PVOID P;
INT64 v21;
memset((INT64)&Context, 0i64);
if( a2 )
{
v4 = *(unsigned int *)(a2 + 80);
v5 = *(_QWORD *)(a1 + 16) + 4544 * v4;
*(_QWORD *)(v5 + 4432) = a2;
v6 = MmPerProcessorZeroCalibrationBytes;
if( !MmPerProcessorZeroCalibrationBytes )
v6 = 0x800000i64;
v7 = v6 * *(int *)(a2 + 128);
PoolMm = ExAllocatePoolMm(64i64, v7, 0x655A694Dui64, v4);
*(_QWORD *)(v5 + 4408) = PoolMm;
if( PoolMm )
*(_QWORD *)(v5 + 4416) = v7;
else
*(_BYTE *)(a1 + 6400) = 1;
v9 = ExAllocatePoolMm(64i64, 16i64 * *(int *)(a2 + 128), 0x655A694Dui64, (unsigned int)v4);
v10 = v9;
if( v9 )
{
memset((INT64)v9, 0i64);
v11 = *(void **)(v5 + 4384);
if( v11 )
ExFreePoolWithTag(v11, 0);
*(_QWORD *)(v5 + 4384) = v10;
*(_DWORD *)(v5 + 4360) = *(_DWORD *)(a2 + 128);
*(_QWORD *)(v5 + 4368) = v6;
}
else
{
*(_BYTE *)(a1 + 6400) = 1;
}
_InterlockedExchangeAdd((volatile signed __int32 *)(a1 + 6404), *(_DWORD *)(a2 + 128));
}
else
{
v5 = 0i64;
v6 = 0i64;
}
if( _InterlockedExchangeAdd((volatile signed __int32 *)(a1 + 6408), 0xFFFFFFFF) == 1 )
{
if( *(_BYTE *)(a1 + 6400) != 1 )
{
v21 = a1;
MiTimeSingleLargePageZero(a1);
CalibrationResultsMemory = MiAllocateCalibrationResultsMemory((INT64)&Context);
v13 = CalibrationResultsMemory;
if( CalibrationResultsMemory == 17 )
{
*(_BYTE *)(a1 + 6400) = 1;
v14 = 1;
}
else
{
v17 = *(_DWORD *)(a1 + 6404);
v14 = *(_BYTE *)(a1 + 6400);
v18 = v6;
}
if( v14 )
{
*(_BYTE *)(a1 + 6400) = 0;
}
else
{
v19 = *(_DWORD *)(a1 + 6404);
KeIpiGenericCall((PKIPI_BROADCAST_WORKER)MiZeroPageCalibrateIsr, &Context);
}
if( (_BYTE)v13 != 17 )
__writecr8(v13);
if( P )
ExFreePoolWithTag(P, 0);
MiComputeRunTimeZeroComparisons(a1);
}
*(_DWORD *)(a1 + 6408) = (unsigned __int16)KeNumberNodes;
KeSetEvent((PRKEVENT)(a1 + 6416), 0);
}
else if( a2 )
{
KeWaitForSingleObject((PVOID)(a1 + 6416), Executive, 0, 0, 0i64);
}
if( v5 )
{
v15 = *(void **)(v5 + 4408);
if( v15 )
{
ExFreePoolWithTag(v15, 0);
*(_QWORD *)(v5 + 4408) = 0i64;
}
}
}Referenced by:
MiZeroBootLargePages
MiZeroNodePages