MiAttemptPageFileExtension

NTSTATUS __stdcall MiAttemptPageFileExtension(_MMPAGING_FILE *PagingFile, UINT64 PagesNeeded){
  UINT64 v2; 
  _MI_PARTITION *v3; 
  UINT64 v4; 
  __int64 v5; 
  unsigned __int64 i; 
  __int64 v9; 
  bool v10; 
  __int64 v11; 
  __int64 v12; 
  UINT64 v13; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  int v16; 
  _FILE_OBJECT *v17; 
  UINT64 ReturnedLength; 
  __int128 Information; 
  __int64 v21; 
  __int64 v22[3]; 
  unsigned int v23; 
  int v24; 

  v3 = *(_MI_PARTITION **)(PagesNeeded + 248);
  v24 = 0;
  v21 = 0i64;
  v4 = v2;
  v5 = *(_QWORD *)(PagesNeeded + 8);
  Information = 0i64;
  if( *(_QWORD *)PagesNeeded != v5
    && IopQueryXxxInformation(*(PVOID *)(PagesNeeded + 56), 3ui64, 0x18ui64, 0, &Information, &ReturnedLength, 0) >= 0 )
  {
    for( i = 0x4000i64; ; i = 4096i64 )
    {
      v9 = *(_QWORD *)(PagesNeeded + 8);
      v10 = v4 < i;
      v11 = *(_QWORD *)PagesNeeded;
      v12 = i;
      if( v4 >= i )
        i = v4;
      if( !v10 )
        v12 = 4096i64;
      v13 = v9 - v11;
      if( i <= v9 - v11 )
        v13 = i;
      v14 = *((_QWORD *)&Information + 1) * (unsigned int)(v21 * HIDWORD(v21));
      if( v14 <= 0x10000000 )
        break;
      v15 = (v14 - 0x10000000) >> 12;
      if( v15 <= v13 )
        v13 = v15;
      if( (*(_BYTE *)(PagesNeeded + 204) & 0x10) != 0 && v13 < v4 )
        break;
      v22[0] = (v13 + v11) << 12;
      v16 = ~*((_BYTE *)&PagingFile->NumberOfModWriterEntries + 7) & 0x20;
      v22[2] = v9 << 12;
      v22[1] = v11 << 12;
      v17 = *(_FILE_OBJECT **)(PagesNeeded + 56);
      v23 = (v16 | 8u) >> 3;
      if( !IoSetInformation(v17, FileEndOfFileInformation, 0x20ui64, v22) )
      {
        MiFinishPageFileExtension(v3, (_MMPAGING_FILE *)PagesNeeded, v13);
        return v13;
      }
      if( v12 == 4096 )
        return 0;
    }
  }
  return 0;
}

Referenced by:

MiExtendPagingFiles