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