MiPrefetchPreallocatePages
VOID __stdcall MiPrefetchPreallocatePages(INT64 a1, INT64 a2, _MI_PARTITION *a3, INT64 a4, INT64 a5, INT64 a6){
unsigned __int64 v6;
__int64 v11;
unsigned __int64 v12;
unsigned int *v13;
__int64 v14;
__int64 v15;
unsigned int v16;
unsigned __int64 v17;
__int64 v18;
int v19;
unsigned __int64 v20;
__int64 v21;
__int64 v22;
int v23;
signed __int32 v24;
int v25;
unsigned __int8 CurrentIrql;
_KQUEUE *LargePage;
_MI_COLOR_BASE ColorBase[14];
INT64 v29;
LODWORD(v29) = 0;
v6 = a6;
*(_OWORD *)ColorBase = 0i64;
if( a4 != 1 && (*(_BYTE *)(a4 + 184) & 7) == 0 )
{
v11 = *(_QWORD *)a1;
v12 = a6 & 0xFFFFFFFFFFE00000ui64;
if( v11 && v12 == v11 )
goto LABEL_30;
if( (unsigned __int64)(a6 - 1) <= 0x7FFFFFFEFFFEi64
&& v12 == a6
&& (unsigned __int64)(*(_QWORD *)a5 + *(_QWORD *)(a5 + 8) - a6) >= 0x200000 )
{
*(_QWORD *)a1 = 0i64;
if( v6 >= *(_QWORD *)(a1 + 24) && v6 <= *(_QWORD *)(a1 + 32) )
{
v13 = (unsigned int *)(a1 + 40);
goto LABEL_18;
}
LODWORD(v14) = MiObtainReferencedVadEx(v6, 2, &v29);
v15 = v14;
if( !v14 )
goto LABEL_30;
v16 = *(_DWORD *)(v14 + 48);
v17 = (((*(unsigned int *)(v14 + 28) | ((unsigned __int64)*(unsigned __int8 *)(v14 + 33) << 32)) << 12) | 0xFFF)
+ 1;
if( (v16 & 0x100000) != 0
&& (v16 & 0x70) == 0
&& v17 - v6 >= 0x200000
&& ((v16 >> 12) & 0x3F) != 0
&& MiProtectionToCacheAttribute((v16 >> 7) & 0x1F) == MiCached )
{
v13 = (unsigned int *)(a1 + 40);
v20 = *(unsigned int *)(v15 + 24) | ((unsigned __int64)*(unsigned __int8 *)(v15 + 32) << 32);
*(_QWORD *)(a1 + 32) = v18;
*(_QWORD *)(a1 + 24) = v20 << 12;
*(_DWORD *)(a1 + 40) = v19;
MiUnlockAndDereferenceVadShared((PVOID)v15);
LABEL_18:
v21 = *(_QWORD *)(a2 + 88);
if( v21 )
{
if( v21 == *(_QWORD *)(a1 + 8) )
{
LODWORD(v22) = MiSearchNumaNodeTable((PVOID)((v21 - (__int64)MmGetPfnDb()) / 48));
v13 = (unsigned int *)(a1 + 40);
if( *(_DWORD *)(v22 + 8) == *(_DWORD *)(a1 + 40) - 1 )
{
*(_QWORD *)a1 = v6;
goto LABEL_30;
}
}
MiPrefetchReleasePreallocatedPages(a1, a2, (INT64)a3, 0i64);
}
*(_QWORD *)(a1 + 8) = 0i64;
if( *(_DWORD *)(a1 + 16) || (MiAcquireNonPagedResources(a3, 0x200ui64), (*(_DWORD *)(a1 + 16) = v23 >= 0) != 0) )
{
MiInitializePageColorBase((_MMSUPPORT_INSTANCE *)a4, *v13, ColorBase);
v24 = _InterlockedExchangeAdd(*(volatile signed __int32 **)ColorBase, 1u);
v25 = ColorBase[2] & v24 | ColorBase[3];
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LargePage = (_KQUEUE *)MiGetLargePage((INT64)a3, 1u, MiCached, v25, 4, 0i64);
*(_QWORD *)(a2 + 88) = LargePage;
if( LargePage )
MiConvertEntireLargePageToSmall(LargePage, 1, 2u, (_LARGE_INTEGER *)1, 0i64, 0i64);
__writecr8(CurrentIrql);
*(_QWORD *)(a1 + 8) = *(_QWORD *)(a2 + 88);
*(_QWORD *)a1 = v6;
}
goto LABEL_30;
}
MiUnlockAndDereferenceVadShared((PVOID)v15);
}
else
{
*(_QWORD *)a1 = 0i64;
}
LABEL_30:
if( !*(_QWORD *)a1 )
MiPrefetchReleasePreallocatedPages(a1, a2, (INT64)a3, 0i64);
}
}Referenced by:
MiPrefetchVirtualMemory