MiUnlinkHugeRange

NTSTATUS __stdcall MiUnlinkHugeRange(INT64 a1, INT64 a2){
  __int64 v2; 
  unsigned __int64 v4; 
  unsigned __int64 v5; 
  __int64 v6; 
  __int64 v7; 
  __int64 v8; 
  unsigned __int64 v9; 
  int v10; 
  __int64 v11; 
  __int64 v12; 
  int v13; 
  __int64 *v14; 
  unsigned __int64 *v15; 
  __int64 v16; 
  unsigned __int64 v17; 

  v2 = *(_QWORD *)(a1 + 6160);
  v4 = *(&stru_140C4DB30 + 100);
  v5 = a2 & 0x3FFFF;
  LODWORD(v6) = MiSearchNumaNodeTable((PVOID)((a2 & 0x3FFFF) << 18));
  v7 = *(&stru_140C4DB30 + 272);
  v8 = *(unsigned int *)(v6 + 8);
  v9 = *(_QWORD *)(*(&stru_140C4DB30 + 272) + 8 * v5);
  if( (v9 & 0x1C0000) == 0x80000 )
  {
    v10 = 1;
    v11 = 4200i64;
    v12 = v4 + (unsigned int)(2 * v4 * v8);
  }
  else
  {
    if( (v9 & 0x1C0000) == 0x40000 )
    {
      v10 = 0;
      v13 = *(_DWORD *)(v6 + 8);
      v11 = 4192i64;
    }
    else
    {
      v13 = (unsigned __int16)KeNumberNodes;
      v10 = 5;
      v11 = 4232i64;
    }
    v12 = (unsigned int)(2 * v4 * v13);
  }
  v14 = (__int64 *)(v2 + 8 * v12);
  if( v10 != 5 )
    v14 += v5 % v4;
  v15 = (unsigned __int64 *)v14;
  if( ((v9 >> 21) & 0x3FFFF) != 0 )
    v15 = (unsigned __int64 *)(*(&stru_140C4DB30 + 272) + 8 * ((v9 >> 21) & 0x3FFFF));
  *v15 = v9 & 0x3FFFF | *v15 & 0xFFFFFFFFFFFC0000ui64;
  if( (v9 & 0x3FFFF) != 0 )
    v14 = (__int64 *)(*(&stru_140C4DB30 + 272) + 8 * (v9 & 0x3FFFF));
  v16 = *v14 ^ (v9 ^ *v14) & 0x7FFFE00000i64;
  *v14 = v16;
  if( *(_BYTE *)(a1 + 4829) == 1 || v10 )
    v17 = v9 & 0xFFFFFFFFFFFC0000ui64 | 1;
  else
    v17 = v9 & 0xFFFFFFFFFFFC0000ui64;
  *(_QWORD *)(v7 + 8 * v5) = v17 & 0xFFFFFFFFFFE3FFFFui64 | 0xC0000;
  if( v10 != 5 )
  {
    --*(_QWORD *)(v11 + *(_QWORD *)(a1 + 16) + 4544 * v8);
    --*(_QWORD *)(a1 + 6168);
  }
  return v16;
}

Referenced by:

MiGetHugeRangeFromNode
MiMakeEntireHugePfnGood
MiMarkHugePfnBad
MiMarkHugePfnGood