MiMapWithLargePages

VOID __fastcall MiMapWithLargePages(INT64 a1, UINT64 a2, UINT64 a3, UINT64 a4, INT64 a5, CHAR a6, INT64 a7){
  _MMPTE *PteBase; 
  unsigned __int64 v9; 
  unsigned __int64 v10; 
  INT64 v11; 
  int v12; 
  UINT64 v13; 
  UINT64 v14; 
  UINT64 v15; 
  int v16; 
  unsigned int v17; 
  unsigned __int64 v18; 
  UINT64 v19; 
  char *v20; 
  char *v21; 
  UINT64 v22; 
  char v23; 
  UINT8 v24; 
  UINT64 *v25; 
  unsigned __int64 v26; 
  UINT64 ValidPte; 
  __int64 v28; 
  INT64 *SharedVm; 
  UINT64 v32; 
  CHAR v33; 
  PteBase = MmGetPteBase();
  v9 = MiLargePageSizes[(unsigned int)a5];
  v10 = a3;
  v11 = a1;
  v12 = a6 & 7;
  v32 = a4 / v9;
  v13 = a4 / v9;
  v14 = v9 * (a4 / v9);
  v15 = (UINT64)PteBase + ((a2 >> 9) & 0x7FFFFFFFF8i64);
  if( v10 <= 0xFFFFFFFFFi64 && ((*((_QWORD *)MmGetPfnDb() + 6 * v10 + 5) >> 50) & 1) != 0 )
    v16 = *((unsigned __int8 *)MmGetPfnDb() + 48 * v10 + 34) >> 6;
  else
    v16 = a7;
  if( v16 )
  {
    if( v16 == 2 )
      v12 |= 0x18u;
  }
  else
  {
    v12 |= 8u;
  }
  v17 = v12 | 0xA0000000;
  if( a4 % v9 )
  {
    v25 = (UINT64 *)(v15 + 8 * v14);
    v26 = v15 + 8 * a4;
    ValidPte = MiMakeValidPte(0i64, v14 + v10, v17);
    if( (unsigned __int64)v25 < v26 )
    {
      do
      {
        *v25++ = ValidPte;
        ValidPte ^= (ValidPte ^ (ValidPte + 4096)) & 0xFFFFFFFFF000i64;
      }
      while( (unsigned __int64)v25 < v26 );
      v11 = a1;
      PteBase = MmGetPteBase();
    }
    v13 = v32;
    v10 = a3;
  }
  v18 = (unsigned __int64)PteBase + ((v15 >> 9) & 0x7FFFFFFFF8i64);
  if( !(_DWORD)a5 )
  {
    v28 = 1i64;
    do
    {
      v18 = (unsigned __int64)PteBase + ((v18 >> 9) & 0x7FFFFFFFF8i64);
      --v28;
    }
    while( v28 );
  }
  v19 = MiMakeValidPte(0i64, v10, v17 | 0x4000000);
  v20 = 0i64;
  v21 = (char *)(v18 + 8 * v13);
  v22 = v19;
  if( (_DWORD)a5 )
  {
    v23 = MiLockWorkingSetShared(v11);
  }
  else
  {
    SharedVm = MiGetSharedVm(v11);
    v23 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)SharedVm);
    *((_DWORD *)SharedVm + 1) = 0;
  }
  v33 = v23;
  v24 = v23;
  if( v18 < (unsigned __int64)v21 )
  {
    while( 1 )
    {
      if( (_DWORD)a5 )
      {
        if( !v20 )
          goto LABEL_20;
        if( (v18 & 0xFFF) == 0 )
          break;
      }
LABEL_14:
      *(_QWORD *)v18 = v22;
      v18 += 8i64;
      v22 ^= (v22 ^ ((v9 << 12) + v22)) & 0xFFFFFFFFF000i64;
      if( v18 >= (unsigned __int64)v21 )
      {
        v24 = v33;
        goto LABEL_16;
      }
    }
    MiUnlockPageTableInternal(v11, (UINT64)v20);
LABEL_20:
    v20 = (char *)MmGetPteBase() + ((v18 >> 9) & 0x7FFFFFFFF8i64);
    MiLockPageTableInternal(v11, (UINT64)v20, 0i64);
    goto LABEL_14;
  }
LABEL_16:
  if( (_DWORD)a5 )
  {
    if( v20 )
      MiUnlockPageTableInternal(v11, (UINT64)v20);
    MiUnlockWorkingSetShared(v11, v24);
  }
  else
  {
    MiUnlockWorkingSetExclusive(v11, v24);
  }
}

Referenced by:

MiInsertInSystemSpace
MiMapContiguousMemoryLarge
MiMapSystemImageWithLargePage