MiFindPageFileWriteCluster

unsigned int *__fastcall MiFindPageFileWriteCluster(__int64 a1, ULONG *a2, unsigned int *a3, int a4){
  unsigned int v4; 
  INT64 v8; 
  INT64 v9; 
  _MI_PARTITION *v10; 
  int v11; 
  unsigned int FreePageFileSpace; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  unsigned int *result; 
  int v16; 
  unsigned int v17; 
  unsigned int v18; 
  _MI_PAGING_FILE_SPACE_BITMAPS *p_ReferencedBitmaps; 
  RTL_BITMAP *p_BitMapHeader; 
  ULONG *v21; 
  unsigned int LongestRunClearCapped; 
  bool v23; 
  _DWORD *v24; 
  RTL_BITMAP BitMapHeader; 
  _MI_PAGING_FILE_SPACE_BITMAPS ReferencedBitmaps; 
  unsigned __int64 v27; 
  unsigned int *v28; 
  UINT64 StartingIndex; 
  v28 = a3;
  v4 = *a3;
  v8 = (unsigned __int64)*a2 << 32;
  memset(&ReferencedBitmaps, 0, sizeof(ReferencedBitmaps));
  BitMapHeader = 0i64;
  v9 = MiSwizzleInvalidPte(v8);
  v10 = *(_MI_PARTITION **)(a1 + 248);
  v27 = ((unsigned __int64)(*(_WORD *)(a1 + 204) & 0xF) << 12) | v9 & 0xFFFFFFFFFFFF0FFFui64;
  FreePageFileSpace = MiFindFreePageFileSpace(v10, (_MMPTE *)&v27, v4, v11 != 0 ? 38 : 32, 0);
  if( FreePageFileSpace )
  {
    v13 = v27;
    if( qword_140C4DC80 && (v27 & 0x10) == 0 )
      v13 = v27 & ~qword_140C4DC80;
    v14 = HIDWORD(v13);
  }
  else
  {
    if( a4 )
    {
      p_BitMapHeader = &BitMapHeader;
      p_ReferencedBitmaps = *(_MI_PAGING_FILE_SPACE_BITMAPS **)(a1 + 112);
      v16 = 0;
      BitMapHeader.SizeOfBitMap = *(_DWORD *)a1;
      BitMapHeader.Buffer = p_ReferencedBitmaps->AllocationBitmap.Buffer;
      v21 = a2;
    }
    else
    {
      v16 = *(_DWORD *)(a1 + 128);
      v17 = *(_DWORD *)(a1 + 124);
      if( v17 < dword_140CFA18C && *(_DWORD *)(a1 + 132) != v16 )
      {
        if( v17 >= (unsigned int)dword_140CFA18C >> 3 )
        {
          v18 = v17 + (v17 >> 1);
          v17 = dword_140CFA18C;
          if( v18 < dword_140CFA18C )
            v17 = v18;
        }
        else
        {
          v17 *= 2;
        }
        *(_DWORD *)(a1 + 124) = v17;
      }
      p_ReferencedBitmaps = &ReferencedBitmaps;
      if( v4 >= v17 )
        v4 = v17;
      if( (*(_WORD *)(a1 + 204) & 0x800) != 0 )
        v4 = 1;
      MiRefPageFileSpaceBitmaps((_MMPAGING_FILE *)a1, &ReferencedBitmaps);
      p_BitMapHeader = &ReferencedBitmaps.AllocationBitmap;
      v21 = (ULONG *)(a1 + 120);
    }
    LODWORD(StartingIndex) = *v21;
    LongestRunClearCapped = RtlFindLongestRunClearCapped(p_BitMapHeader, v4, &StartingIndex);
    v23 = a4 == 0;
    FreePageFileSpace = LongestRunClearCapped;
    LODWORD(v14) = StartingIndex;
    if( v23 )
    {
      if( LongestRunClearCapped )
      {
        if( LongestRunClearCapped < v4 )
        {
          *(_DWORD *)(a1 + 124) = LongestRunClearCapped;
          *(_DWORD *)(a1 + 132) = v16;
        }
        *(_DWORD *)(a1 + 120) = v14 + LongestRunClearCapped;
      }
      v24 = MiDerefPageFileSpaceBitmaps(a1, p_ReferencedBitmaps, 0);
      if( v24 )
        ExFreePoolWithTag(v24, 0);
    }
    else
    {
      MiSetPageFileAllocationBits(a1, (unsigned int)StartingIndex, LongestRunClearCapped);
    }
  }
  result = v28;
  *a2 = v14;
  *result = FreePageFileSpace;
  return result;
}

Referenced by:

MiGatherPagefilePages