MiExtendPagingFileMaximum

VOID __stdcall MiExtendPagingFileMaximum(
        _MMPAGING_FILE *PagingFile,
        _MI_PAGING_FILE_SPACE_BITMAPS *NewBitmap,
        UINT64 *PageHash){
  _RTL_BITMAP *p_AllocationBitmap; 
  unsigned __int8 v7; 
  _MI_PAGING_FILE_SPACE_BITMAPS *Bitmaps; 
  unsigned __int64 v9; 
  _MMPTE *PteBase; 
  unsigned int SizeOfBitMap; 
  _MMPTE *v12; 
  size_t v13; 
  UINT64 v14; 
  unsigned int v15; 
  __int128 v16; 
  _MI_PAGING_FILE_SPACE_BITMAPS *v17; 
  _KTBFLUSH_TYPE v18; 
  _MMPTE *v19; 
  unsigned int v20; 
  unsigned __int64 v21; 
  UINT64 v22; 
  UINT64 v23; 
  UINT64 v24; 
  _MMPFN *v25; 
  unsigned __int64 v26; 
  unsigned __int64 v27; 
  UINT64 v28; 
  UINT64 v29; 
  __int64 v30; 
  char *v31; 
  INT64 *SpinLock; 
  _MI_PAGING_FILE_SPACE_BITMAPS ReferencedBitmaps; 
  unsigned int v34; 
  UINT64 v35; 
  UINT64 NumberOfPtes; 
  UINT64 v37; 
  _MMPTE *PointerPte; 

  v37 = (UINT64)PageHash;
  p_AllocationBitmap = &NewBitmap->AllocationBitmap;
  RtlSetAllBits(&NewBitmap->AllocationBitmap);
  RtlSetAllBits(&NewBitmap->ReservationBitmap);
  SpinLock = (INT64 *)&PagingFile->SpinLock;
  v7 = ExAcquireSpinLockExclusive((INT64 *)&PagingFile->SpinLock);
  Bitmaps = PagingFile->Bitmaps;
  v9 = v7;
  PteBase = MmGetPteBase();
  SizeOfBitMap = Bitmaps->AllocationBitmap.SizeOfBitMap;
  v34 = SizeOfBitMap;
  if( PageHash )
  {
    v12 = (_MMPTE *)((char *)PteBase + (((unsigned __int64)PagingFile->PageHash >> 9) & 0x7FFFFFFFF8i64));
    PointerPte = v12;
    v31 = (char *)PteBase + (((unsigned __int64)PageHash >> 9) & 0x7FFFFFFFF8i64);
    NumberOfPtes = ((4 * (unsigned __int64)SizeOfBitMap) >> 12) + (((4i64 * SizeOfBitMap) & 0xFFF) != 0);
    memmove(v31, v12, 8 * NumberOfPtes);
    memset(v12, 0i64, 8 * NumberOfPtes);
    SizeOfBitMap = v34;
  }
  else
  {
    PointerPte = 0i64;
    v31 = 0i64;
    NumberOfPtes = 0i64;
  }
  v13 = 8 * ((SizeOfBitMap >> 6) + ((SizeOfBitMap & 0x3F) != 0));
  memmove(NewBitmap->AllocationBitmap.Buffer, Bitmaps->AllocationBitmap.Buffer, v13);
  memmove(NewBitmap->ReservationBitmap.Buffer, Bitmaps->ReservationBitmap.Buffer, v13);
  v14 = Bitmaps->AllocationBitmap.SizeOfBitMap;
  v15 = 8 * v13 - v14;
  if( v15 )
  {
    RtlSetBits(p_AllocationBitmap, v14, v15);
    RtlSetBits(&NewBitmap->ReservationBitmap, Bitmaps->ReservationBitmap.SizeOfBitMap, v15);
  }
  PagingFile->MaximumSize = p_AllocationBitmap->SizeOfBitMap;
  v16 = *(_OWORD *)&Bitmaps->AllocationBitmap.Buffer;
  *(_QWORD *)&ReferencedBitmaps.AllocationBitmap.SizeOfBitMap = *(_QWORD *)&Bitmaps->AllocationBitmap.SizeOfBitMap;
  ReferencedBitmaps.Anchor = Bitmaps;
  ReferencedBitmaps.ReservationBitmap.Buffer = Bitmaps->ReservationBitmap.Buffer;
  *(_OWORD *)&ReferencedBitmaps.AllocationBitmap.Buffer = v16;
  v17 = MiDerefPageFileSpaceBitmaps(PagingFile, &ReferencedBitmaps, 1ui64);
  PagingFile->Bitmaps = NewBitmap;
  PagingFile->PageHash = (unsigned int *)v37;
  ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&PagingFile->SpinLock);
  __writecr8(v9);
  if( v17 )
    ExFreePoolWithTag(v17, 0);
  v19 = PointerPte;
  if( PointerPte )
  {
    v20 = NumberOfPtes;
    if( NumberOfPtes )
    {
      v21 = (unsigned __int64)v31;
      v22 = NumberOfPtes;
      v35 = NumberOfPtes;
      do
      {
        LODWORD(v23) = MI_READ_PTE_LOCK_FREE(v21);
        v37 = v23;
        v24 = v23;
        if( (v23 & 1) != 0 )
        {
          MiPteInShadowRange((UINT64)&v37);
          v25 = &MmGetPfnDb()[(v24 >> 12) & 0xFFFFFFFFFi64];
          if( (v25->PteLong | 0x8000000000000000ui64) != v21 )
          {
            v26 = MiLockPageInline(v25);
            v27 = (unsigned __int8)ExAcquireSpinLockExclusive(SpinLock);
            LODWORD(v28) = MI_READ_PTE_LOCK_FREE(v21);
            v37 = v28;
            if( (v28 & 1) != 0
              && v25 == &MmGetPfnDb()[(v28 >> 12) & 0xFFFFFFFFFi64]
              && (v25->PteLong | 0x8000000000000000ui64) != v21 )
            {
              LODWORD(v29) = MI_READ_PTE_LOCK_FREE((INT64)MmGetPteBase() + ((v21 >> 9) & 0x7FFFFFFFF8i64));
              v37 = v29;
              v30 = (v25->u4._bf_0 ^ (v29 >> 12)) & 0xFFFFFFFFFi64;
              v25->PteLong = v21;
              v25->u4._bf_0 ^= v30;
            }
            ExReleaseSpinLockExclusiveFromDpcLevel(SpinLock);
            __writecr8(v27);
            _InterlockedAnd64(&v25->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
            __writecr8(v26);
            v22 = v35;
          }
        }
        v21 += 8i64;
        v35 = --v22;
      }
      while( v22 );
      v20 = NumberOfPtes;
      v19 = PointerPte;
    }
    MiReleasePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), v19, v20, v18);
  }
}

Referenced by:

MiCreatePagingFile