MiInitializeNewUltraHugeContext
INT64 __fastcall MiInitializeNewUltraHugeContext(INT64 a1, INT64 a2, INT64 a3){
INT64 v6;
__int64 v7;
int v8;
_DWORD *v9;
INT64 result;
unsigned __int64 UltraMapping;
__int64 *v12;
__int64 v13;
__int64 **v14;
UINT64 *v15;
int ProtectionPfnCompatible;
__int64 v17;
UINT64 SpinCount;
*(_DWORD *)(a2 + 88) = 512;
*(_QWORD *)(a2 + 96) = a2 + 104;
v6 = (a3 - (__int64)MmGetPfnDb()) / 48;
LODWORD(v7) = MiSearchNumaNodeTable((PVOID)v6);
v8 = *(_DWORD *)(v7 + 8);
v9 = *(_DWORD **)(a2 + 96);
*(_DWORD *)(a2 + 184) = v8;
*(_QWORD *)(a2 + 168) = a3;
*(_DWORD *)(a2 + 188) = 1;
*v9 |= 1u;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(a3 + 24), 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(__int64 *)(a3 + 24) < 0 );
}
if( *(_BYTE *)(a2 + 69) == 1 )
{
_InterlockedAnd64((volatile signed __int64 *)(a3 + 24), 0x7FFFFFFFFFFFFFFFui64);
return 0i64;
}
else
{
UltraMapping = MiGetUltraMapping((unsigned __int64 *)(a1 + 88), 0, 0x40000i64, 1);
v12 = (__int64 *)(a2 + 72);
v13 = *(_QWORD *)(a1 + 232) + 56i64;
v14 = *(__int64 ***)(*(_QWORD *)(a1 + 232) + 64i64);
if( *v14 != (__int64 *)v13 )
__fastfail(3u);
*v12 = v13;
*(_QWORD *)(a2 + 80) = v14;
*v14 = v12;
*(_QWORD *)(v13 + 8) = v12;
*(_QWORD *)(a2 + 176) = UltraMapping;
*(_QWORD *)(a2 + 40) = UltraMapping;
v15 = (UINT64 *)((char *)MmGetPdpteBase() + ((UltraMapping >> 27) & 0x1FFFF8));
ProtectionPfnCompatible = MiMakeProtectionPfnCompatible(4ui64, (_MMPFN *)a3);
*v15 = MiMakeValidPte((UINT64)v15, v6, ProtectionPfnCompatible | 0xA4000000);
v17 = *(_QWORD *)(a2 + 40);
*(_DWORD *)(a2 + 64) = 0;
*(_QWORD *)(a2 + 48) = v17 + 0x3FFFFFFF;
*(_QWORD *)(a2 + 32) = v15;
_InterlockedAnd64((volatile signed __int64 *)(a3 + 24), 0x7FFFFFFFFFFFFFFFui64);
*(_DWORD *)(a1 + 64) = 0;
result = 1i64;
*(_QWORD *)(a1 + 224) = a2;
*(_WORD *)(a1 + 216) = 0;
}
return result;
}Referenced by:
MiGetHugePageToZero