MiMapPagesToZero

INT64 __fastcall MiMapPagesToZero(INT64 a1, INT64 a2, UINT64 a3){
  unsigned int v3; 
  INT64 v4; 
  __int64 v6; 
  _MMPTE *PteBase; 
  UINT64 v8; 
  __int64 v9; 
  INT64 v10; 
  unsigned __int8 CurrentIrql; 
  int v12; 
  __int64 v14; 
  unsigned __int64 v15; 
  int v16; 
  char v17; 
  unsigned int v18; 
  unsigned __int64 v19; 
  unsigned __int64 v20; 
  _MMPTE *PteLimit; 
  unsigned __int64 LeafVa; 
  int v23; 
  unsigned __int64 v24; 
  int v25; 
  unsigned int v26; 
  __int64 v27; 
  __int64 v28; 
  unsigned __int64 v29; 
  UINT64 v30; 
  _MMPTE *Pml4eBase; 
  _MMPTE *PxeUserLimit; 
  unsigned __int64 v33; 
  unsigned __int64 UltraMapping; 
  __int64 v36; 
  unsigned int v37; 
  unsigned __int8 v38; 
  v37 = a3;
  v3 = a3;
  v4 = a1;
  if( (unsigned int)a3 >= 3 )
  {
    v6 = 1i64;
  }
  else
  {
    _mm_lfence();
    v6 = MiLargePageSizes[(unsigned int)a3];
  }
  v36 = v6;
  UltraMapping = MiGetUltraMapping((unsigned __int64 *)(32i64 * (unsigned int)a3 + a1 + 88), a3, v6, 0);
  PteBase = MmGetPteBase();
  v8 = (UINT64)PteBase + ((UltraMapping >> 9) & 0x7FFFFFFFF8i64);
  if( v3 <= 1 )
  {
    v9 = 2 - v3;
    do
    {
      v8 = (UINT64)PteBase + ((v8 >> 9) & 0x7FFFFFFFF8i64);
      --v9;
    }
    while( v9 );
  }
  v10 = (a2 - (__int64)MmGetPfnDb()) / 48;
  CurrentIrql = KeGetCurrentIrql();
  v38 = CurrentIrql;
  __writecr8(2ui64);
  v12 = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)(a2 + 24), 0x3Fui64) )
  {
    do
    {
      ++v12;
      _mm_pause();
    }
    while( *(__int64 *)(a2 + 24) < 0 );
  }
  if( *(_BYTE *)(v4 + 69) == 1 )
  {
    MiRemoveFaultNode(v4);
    _InterlockedAnd64((volatile signed __int64 *)(a2 + 24), 0x7FFFFFFFFFFFFFFFui64);
    __writecr8(CurrentIrql);
    ++dword_140C2A070;
    return 0i64;
  }
  v14 = *(unsigned __int8 *)(a2 + 34) >> 6;
  if( v36 != 1 )
    goto LABEL_19;
  if( (_DWORD)v14 && (_DWORD)v14 != 2 )
  {
    if( (*(_BYTE *)(a2 + 34) & 0xC0) == 0xC0 )
      MiFinalizePageAttribute((_MMPFN *)a2, MiCached, 1ui64);
    goto LABEL_19;
  }
  v15 = 0x140000000ui64;
  if( dword_140C4DCDC[4 * v14] == 1 )
  {
    MiChangePageAttribute(a2, 1i64, 1);
LABEL_19:
    v15 = 0x140000000ui64;
  }
  v16 = 4;
  v17 = *(_BYTE *)(a2 + 34) >> 6;
  if( v17 )
  {
    if( v17 == 2 )
      v16 = 28;
  }
  else
  {
    v16 = 12;
  }
  v18 = v16 | 0xA0000000;
  if( v3 <= 1 )
    v18 = v16 | 0xA4000000;
  v19 = (unsigned __int64)MmGetPteBase();
  v20 = ((v10 & 0xFFFFFFFFFi64) << 12) | MmProtectToPteMask[v18 & 0x1F] & 0xFFFF000000000E7Fui64 | 0x21;
  if( v8 < v19 )
    goto LABEL_49;
  PteLimit = MmGetPteLimit();
  if( v8 > (unsigned __int64)PteLimit )
    goto LABEL_49;
  LeafVa = (__int64)((v8 << 25) - (v19 << 25)) >> 16;
  if( v8 >= (unsigned __int64)MmGetPdeBase() && v8 <= (unsigned __int64)MmGetPdeLimit() )
  {
    if( (_MMPTE *)v8 == MmGetPxeSelfRef() )
    {
      v20 |= 0x8000000000000000ui64;
    }
    else if( (v18 & 0x4000000) == 0 )
    {
      v20 &= ~0x8000000000000000ui64;
    }
    v23 = MiUserPdeOrAbove(v8);
    PteLimit = MmGetPteLimit();
    v15 = 0x140000000ui64;
    v19 = (unsigned __int64)MmGetPteBase();
    if( v23 )
      v20 |= 4ui64;
  }
  v24 = v20;
  v20 |= 4ui64;
  if( v8 > v19 + 0x3FFFFFFF78i64 )
    v20 = v24;
  if( (v18 & 0x4000000) != 0 )
  {
    LeafVa = MiGetLeafVa(LeafVa);
    v19 = (unsigned __int64)MmGetPteBase();
  }
  if( LeafVa >= 0xFFFF800000000000ui64 )
  {
    if( *(_BYTE *)(((LeafVa >> 39) & 0x1FF) - 256 + v15 + 12908296) == 1
      || LeafVa >= v19 && LeafVa <= (unsigned __int64)PteLimit )
    {
      goto LABEL_50;
    }
    if( LeafVa < qword_140C4F878 || (v25 = HIBYTE(word_140C4DD48), LeafVa > qword_140C4E0A8) )
      v25 = (unsigned __int8)word_140C4DD48;
  }
  else
  {
    v25 = HIBYTE(word_140C4DD48);
  }
  if( v25 )
LABEL_49:
    v20 |= 0x100ui64;
LABEL_50:
  v26 = v37;
  v27 = v20 ^ ((unsigned __int16)v20 ^ (unsigned __int16)((unsigned __int8)word_140C4DD48 << 8)) & 0x100 | 0x42;
  v28 = v20 ^ ((unsigned __int16)v20 ^ (unsigned __int16)((unsigned __int8)word_140C4DD48 << 8)) & 0x100 | 0xC2;
  if( (v18 & 0x4000000) == 0 )
    v28 = v27;
  v29 = v28 & 0xF0FFFFFFFFFFFFFFui64 | 0xA00000000000000i64;
  if( v37 > 1 )
  {
    v30 = 8 * v36 + v8;
    if( v8 < v30 )
    {
      Pml4eBase = MmGetPml4eBase();
      PxeUserLimit = MmGetPxeUserLimit();
      do
      {
        v33 = v29;
        if( v8 >= (unsigned __int64)Pml4eBase
          && v8 <= (unsigned __int64)PxeUserLimit
          && (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0
          && (v29 & 1) != 0 )
        {
          v33 = v29 | 0x8000000000000000ui64;
        }
        *(_QWORD *)v8 = v33;
        v8 += 8i64;
        v29 ^= (v29 ^ (v29 + 4096)) & 0xFFFFFFFFF000i64;
      }
      while( v8 < v30 );
      CurrentIrql = v38;
      v4 = a1;
      v26 = v37;
    }
    v8 -= 8 * v36;
  }
  else
  {
    *(_QWORD *)v8 = v29;
  }
  *(_QWORD *)(v4 + 32) = v8;
  *(_QWORD *)(v4 + 40) = UltraMapping;
  *(_QWORD *)(v4 + 48) = UltraMapping + (v36 << 12) - 1;
  *(_DWORD *)(v4 + 64) = v26;
  *(_QWORD *)(v4 + 72) = a2;
  _InterlockedAnd64((volatile signed __int64 *)(a2 + 24), 0x7FFFFFFFFFFFFFFFui64);
  __writecr8(CurrentIrql);
  return 1i64;
}

Referenced by:

MiGetPagesToZero
MiZeroLargePages