MiFindFreePageFileSpace

NTSTATUS __stdcall MiFindFreePageFileSpace(
        _MI_PARTITION *Partition,
        _MMPTE *PageFileInfo,
        UINT64 NumberOfPages,
        UINT64 Flags){
  unsigned int v4; 
  unsigned __int64 Long_high; 
  _MMPAGING_FILE *v8; 
  NTSTATUS v9; 
  volatile unsigned int NumberOfPagingFiles; 
  unsigned int v11; 
  _MMPAGING_FILE **v12; 
  __int64 i; 
  __int16 bf_cc; 
  _MMPAGING_FILE *v15; 
  int v16; 
  int v17; 
  _MI_PAGEFILE_BITMAPS_CACHE_ENTRY *v18; 
  unsigned __int8 v19; 
  unsigned __int8 v20; 
  UINT64 v21; 
  bool v22; 
  unsigned __int64 Root; 
  _MI_PAGEFILE_BITMAPS_CACHE_ENTRY *v24; 
  _MI_PAGEFILE_BITMAPS_CACHE_ENTRY *v25; 
  _MI_PAGEFILE_BITMAPS_CACHE_ENTRY *v26; 
  unsigned int v27; 
  char v28; 
  int v29; 
  volatile int *v30; 
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v31; 
  _MI_PAGEFILE_BITMAPS_CACHE_ENTRY *v33; 
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v34; 
  _MI_PAGING_FILE_SPACE_BITMAPS *Bitmaps; 
  int v36; 
  unsigned int v37; 
  unsigned int v38; 
  volatile int *p_SpinLock; 
  NTSTATUS FreePageFileSpaceForward; 
  UINT64 MaximumRunLengthInBitmaps; 
  unsigned int v42; 
  unsigned __int64 v43; 
  unsigned __int64 v44; 
  unsigned __int64 j; 
  UINT64 StartIndexInOut; 
  int v47; 
  __int128 v48; 
  __int128 v49; 
  __int128 v50; 
  __int64 v51; 
  unsigned int Flagsa; 

  Flagsa = Flags;
  v51 = 0i64;
  v4 = Flags;
  v48 = 0i64;
  v49 = 0i64;
  v50 = 0i64;
  if( NumberOfPages < 0xFFFFFFFF )
  {
    LODWORD(Long_high) = -1;
    if( (Flags & 0x10) != 0 )
      goto LABEL_3;
    v8 = Partition->Vp.PagingFile[(unsigned __int8)HIBYTE(LOWORD(PageFileInfo->u.Long)) >> 4];
    if( (Flags & 0x65) == 1
      && (unsigned int)MiPageFileLargestBitmapsRun(Partition->Vp.PagingFile[(unsigned __int8)HIBYTE(LOWORD(PageFileInfo->u.Long)) >> 4]) < NumberOfPages )
    {
      v4 |= 0x10u;
      Flagsa = v4;
    }
    else
    {
      v34.Long = (unsigned __int64)PageFileInfo->u;
      if( *(&stru_140C4DB30 + 42) && (v34.Long & 0x10) == 0 )
        v34.Long &= ~*(&stru_140C4DB30 + 42);
      Long_high = HIDWORD(v34.Long);
    }
    if( (v4 & 0x10) != 0 )
    {
LABEL_3:
      v8 = Partition->Vp.PagingFile[0];
      v9 = MiPageFileLargestBitmapsRun(v8);
      NumberOfPagingFiles = Partition->Vp.NumberOfPagingFiles;
      v11 = v9;
      if( NumberOfPagingFiles > 1 )
      {
        v12 = &Partition->Vp.PagingFile[1];
        for( i = NumberOfPagingFiles - 1; i; --i )
        {
          bf_cc = v8->_bf_cc;
          v15 = *v12;
          if( (bf_cc & 0x10) != 0 && (v15->_bf_cc & 0x10) == 0 || (bf_cc & 0x20) != 0 && (v15->_bf_cc & 0x20) == 0 )
          {
            v8 = *v12;
            v42 = MiPageFileLargestBitmapsRun(*v12);
          }
          else
          {
            if( (v15->_bf_cc & 0x30) != 0 )
              goto LABEL_8;
            v42 = MiPageFileLargestBitmapsRun(*v12);
            if( v42 <= v11 )
              goto LABEL_8;
            v8 = v15;
          }
          v11 = v42;
LABEL_8:
          ++v12;
        }
      }
      v4 = Flagsa;
    }
    v16 = 0;
    LODWORD(StartIndexInOut) = 0;
    v17 = v4 & 4;
    v47 = v17;
    while( 1 )
    {
      v18 = 0i64;
      HIDWORD(StartIndexInOut) = 0;
      if( v17 )
      {
        v20 = 0;
      }
      else
      {
        if( (v4 & 1) != 0 || v16 )
        {
          v19 = ExAcquireSpinLockExclusive((INT64 *)&v8->SpinLock);
        }
        else
        {
          HIDWORD(StartIndexInOut) = 1;
          v19 = ExAcquireSpinLockShared((INT64 *)&v8->SpinLock);
        }
        v20 = v19;
      }
      if( (v8->_bf_cc & 0x1000000) != 0 )
      {
LABEL_87:
        if( !v47 )
        {
          p_SpinLock = &v8->SpinLock;
          if( HIDWORD(StartIndexInOut) )
            ExReleaseSpinLockSharedFromDpcLevel(p_SpinLock);
          else
            ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)p_SpinLock);
          __writecr8(v20);
        }
        return 0;
      }
      if( (_DWORD)Long_high == -1 )
        goto LABEL_17;
      Bitmaps = v8->Bitmaps;
      if( (unsigned int)Long_high >= Bitmaps->ReservationBitmap.SizeOfBitMap )
      {
        if( (v4 & 0x48) == 0 )
        {
LABEL_17:
          v21 = NumberOfPages;
          goto LABEL_18;
        }
        goto LABEL_87;
      }
      if( _bittest64((const signed __int64 *)Bitmaps->ReservationBitmap.Buffer, (unsigned int)Long_high)
        || _bittest64((const signed __int64 *)Bitmaps->AllocationBitmap.Buffer, (unsigned int)Long_high) )
      {
        v21 = NumberOfPages;
        v27 = 0;
        v36 = v4 & 0x40;
      }
      else
      {
        v37 = RtlLengthCurrentClearRunForward(
                &Bitmaps->ReservationBitmap,
                (unsigned int)Long_high,
                (unsigned int)NumberOfPages);
        v21 = NumberOfPages;
        v36 = v4 & 0x40;
        if( v37 != (_DWORD)NumberOfPages && !v36
          || (v38 = RtlLengthCurrentClearRunForward(&v8->Bitmaps->AllocationBitmap, (unsigned int)Long_high, v37),
              v21 = NumberOfPages,
              v27 = v38,
              v38 != (_DWORD)NumberOfPages)
          && !v36 )
        {
          v27 = 0;
        }
      }
      if( v27 == v21 || v36 )
      {
        LODWORD(StartIndexInOut) = Long_high;
        goto LABEL_42;
      }
      v4 = Flagsa;
LABEL_18:
      while( 2 )
      {
        if( (v4 & 8) != 0 )
        {
          LODWORD(StartIndexInOut) = Long_high;
          FreePageFileSpaceForward = MiFindFreePageFileSpaceForward(v8, &StartIndexInOut, (unsigned int)v21, v4);
          LODWORD(Long_high) = StartIndexInOut;
          v27 = FreePageFileSpaceForward;
          goto LABEL_42;
        }
        LODWORD(v51) = 0;
        v22 = (v8->BitmapsCacheLengthTree._bf_0 & 1) == 0;
        Root = (unsigned __int64)v8->BitmapsCacheLengthTree.Root;
        HIDWORD(v51) = v21;
        if( !v22 && Root )
          Root ^= (unsigned __int64)&v8->BitmapsCacheLengthTree;
        v18 = 0i64;
        while( 1 )
        {
          if( !Root )
            goto LABEL_40;
          if( (unsigned int)v21 < *(_DWORD *)(Root + 52) )
            goto LABEL_54;
          if( (unsigned int)v21 <= *(_DWORD *)(Root + 52) )
            break;
          v33 = *(_MI_PAGEFILE_BITMAPS_CACHE_ENTRY **)(Root + 8);
LABEL_55:
          if( (v8->BitmapsCacheLengthTree._bf_0 & 1) != 0 && v33 )
            Root ^= (unsigned __int64)v33;
          else
            Root = (unsigned __int64)v33;
        }
        if( *(_DWORD *)(Root + 48) )
        {
LABEL_54:
          v33 = *(_MI_PAGEFILE_BITMAPS_CACHE_ENTRY **)Root;
          v18 = (_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *)Root;
          goto LABEL_55;
        }
        v24 = *(_MI_PAGEFILE_BITMAPS_CACHE_ENTRY **)Root;
        v18 = (_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *)Root;
        if( (v8->BitmapsCacheLengthTree._bf_0 & 1) != 0 && v24 )
          v24 = (_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *)(Root ^ (unsigned __int64)v24);
        v25 = 0i64;
        if( v24 )
        {
          while( 1 )
          {
            if( (unsigned int)v21 < v24->Length )
              goto LABEL_34;
            if( (unsigned int)v21 <= v24->Length )
              break;
            v26 = (_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *)v24->LengthTreeNode.Children[1];
LABEL_35:
            if( (v8->BitmapsCacheLengthTree._bf_0 & 1) != 0 && v26 )
              v24 = (_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *)((unsigned __int64)v26 ^ (unsigned __int64)v24);
            else
              v24 = v26;
            if( !v24 )
            {
              if( v25 )
                v18 = v25;
              goto LABEL_40;
            }
          }
          if( !v24->StartingIndex )
            v25 = v24;
LABEL_34:
          v26 = (_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *)v24->LengthTreeNode.Children[0];
          goto LABEL_35;
        }
LABEL_40:
        if( v18->Length != -1 )
          goto LABEL_41;
        MaximumRunLengthInBitmaps = v8->MaximumRunLengthInBitmaps;
        if( MaximumRunLengthInBitmaps < v21 || (unsigned int)MaximumRunLengthInBitmaps < 0x20 )
        {
          if( (v4 & 0x80u) != 0 )
            goto LABEL_87;
          v43 = (unsigned __int64)v18->LengthTreeNode.Children[0];
          v44 = (unsigned __int64)v18;
          if( v18->LengthTreeNode.Children[0] )
          {
            for( ; *(_QWORD *)(v43 + 8); v43 = *(_QWORD *)(v43 + 8) )
              ;
          }
          else
          {
            for( j = v18->LengthTreeNode.ParentValue; ; j = *(_QWORD *)(v43 + 16) )
            {
              v43 = j & 0xFFFFFFFFFFFFFFFCui64;
              if( !v43 || *(_QWORD *)(v43 + 8) == v44 )
                break;
              v44 = v43;
            }
          }
          if( !v43 )
          {
            if( (unsigned int)MaximumRunLengthInBitmaps < 0x20 )
              goto LABEL_87;
            goto LABEL_99;
          }
          v18 = (_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *)v43;
          if( (unsigned int)MaximumRunLengthInBitmaps > *(_DWORD *)(v43 + 52)
            && (unsigned int)MaximumRunLengthInBitmaps >= 0x20 )
          {
            goto LABEL_99;
          }
          LODWORD(v21) = *(_DWORD *)(v43 + 52);
LABEL_41:
          LODWORD(Long_high) = v18->StartingIndex;
          v27 = v21;
          LODWORD(StartIndexInOut) = Long_high;
LABEL_42:
          if( v27 )
          {
            v28 = Flagsa;
            v29 = 0;
            if( (Flagsa & 1) != 0 )
            {
              v29 = 2;
              RtlSetBits(&v8->Bitmaps->ReservationBitmap, (unsigned int)Long_high, v27);
              v8->FreeReservationSpace -= v27;
              v28 = Flagsa;
            }
            if( (v28 & 2) != 0 )
            {
              v29 |= 1u;
              MiSetPageFileAllocationBits(v8, (unsigned int)Long_high, v27);
            }
            if( v29 )
              MiInvalidatePageFileBitmapsCache(v8, (unsigned int)Long_high, v27, v18);
            if( !v47 )
            {
              v30 = &v8->SpinLock;
              if( HIDWORD(StartIndexInOut) )
                ExReleaseSpinLockSharedFromDpcLevel(v30);
              else
                ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)v30);
              __writecr8(v20);
            }
            LODWORD(v31.Long) = MiTransferSoftwarePte(PageFileInfo->u.Long, (INT64)v8, (unsigned int)Long_high);
            PageFileInfo->u.Long = v31.Long;
            return v27;
          }
          goto LABEL_87;
        }
LABEL_99:
        if( !HIDWORD(StartIndexInOut) )
        {
          MiRescanPagefileBitmaps(v8);
          v21 = NumberOfPages;
          continue;
        }
        break;
      }
      ExReleaseSpinLockSharedFromDpcLevel(&v8->SpinLock);
      __writecr8(v20);
      v17 = v47;
      v16 = 1;
    }
  }
  return 0;
}

Referenced by:

MiFindPageFileWriteCluster
MiGetKernelStackSwapSupport
MiReservePageFileSpace
MiReserveWorkingSetSwapSpaceRuns
MiTrimUnusedPageFileRegionsApc