MiZeroBootLargePages
NTSTATUS __stdcall MiZeroBootLargePages(INT64 a1){
CHAR v2;
unsigned int v3;
__int64 **p_P;
NTSTATUS v5;
int v6;
unsigned int v7;
_QWORD *Pool;
__int64 **v9;
__int64 *v10;
NTSTATUS v11;
VOID *v12;
__int64 *v14;
__int64 *P;
__int64 **v16;
VOID *Handle;
__int128 v18;
Handle = 0i64;
v18 = 0i64;
KeQueryPerformanceCounter((_LARGE_INTEGER *)&stru_140C4DB30 + 36);
if( !MiComputeMemoryNodeProcessorAssignments(a1) )
return -1073741823;
*(_WORD *)(a1 + 6416) = 0;
*(_DWORD *)(a1 + 6420) = 0;
v3 = (unsigned __int16)KeNumberNodes;
p_P = &P;
*(_QWORD *)(a1 + 6432) = a1 + 6424;
v5 = 0;
*(_QWORD *)(a1 + 6424) = a1 + 6424;
v6 = 0;
*(_BYTE *)(a1 + 6418) = 6;
*(_DWORD *)(a1 + 6348) = 0;
v7 = 0;
*(_QWORD *)(a1 + 6360) = a1 + 6352;
*(_QWORD *)(a1 + 6352) = a1 + 6352;
v16 = &P;
*(_WORD *)(a1 + 6344) = 263;
*(_BYTE *)(a1 + 6346) = 6;
P = (__int64 *)&P;
if( v3 )
{
while( 1 )
{
v18 = *(_OWORD *)(4544i64 * v7 + *(_QWORD *)(a1 + 16) + 4472);
Pool = MiAllocatePool(64i64, 0x138ui64, 0x20206D4Dui64);
if( !Pool )
break;
Pool[38] = MiAllocateZeroPageDecisionTraceBuffer(a1, v7);
*((_DWORD *)Pool + 20) = v7;
Pool[9] = a1;
v9 = v16;
if( *v16 != (__int64 *)&P )
LABEL_25:
__fastfail(3u);
Pool[1] = v16;
*Pool = &P;
++v6;
++v7;
*v9 = Pool;
v16 = (__int64 **)Pool;
if( v7 >= v3 )
goto LABEL_6;
}
v5 = -1073741670;
*(_BYTE *)(a1 + 6400) = 1;
LABEL_6:
p_P = (__int64 **)P;
}
*(_DWORD *)(a1 + 6336) = v6;
*(_DWORD *)(a1 + 6408) = v6;
while( p_P != &P )
{
if( p_P[1] != (__int64 *)&P )
goto LABEL_25;
v10 = *p_P;
if( (__int64 **)(*p_P)[1] != p_P )
goto LABEL_25;
P = *p_P;
v10[1] = (__int64)&P;
*(_OWORD *)p_P = 0i64;
p_P[2] = 0i64;
if( v5 < 0 )
{
v12 = 0i64;
Handle = 0i64;
}
else
{
v18 = *(_OWORD *)(4544i64 * *((unsigned int *)p_P + 20) + *(_QWORD *)(a1 + 16) + 4472);
v11 = PsCreateSystemThreadEx(
(__int64)&Handle,
0x1FFFFF,
0i64,
0i64,
0i64,
MiZeroNodePages,
(INT64)p_P,
&v18,
0i64);
v12 = Handle;
v5 = v11;
}
if( v5 < 0 )
{
*(_BYTE *)(a1 + 6400) = 1;
MiNodeCompletedBootZeroing(a1);
MiZeroPageCalibrate(a1, 0i64);
v14 = p_P[38];
if( v14 )
ExFreePoolWithTag(v14, 0);
ExFreePoolWithTag(p_P, 0);
}
else
{
ObCloseHandle(v12, 0);
}
p_P = (__int64 **)P;
}
KeWaitForGate((_KGATE *)(a1 + 6344), Executive, v2);
if( *(_BYTE *)(a1 + 6400) )
return -1073741823;
return v5;
}Referenced by:
MiZeroPageThread