MiAttemptPageFileExtension

unsigned __int64 __fastcall MiAttemptPageFileExtension(__int64 a1, __int64 a2, unsigned __int64 a3){
  _MI_PARTITION *v3; 
  __int64 v5; 
  unsigned __int64 i; 
  __int64 v9; 
  bool v10; 
  __int64 v11; 
  __int64 v12; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  int v16; 
  FILE_OBJECT *v17; 
  UINT64 ReturnedLength; 
  __int64 Information[2]; 
  __int64 v21; 
  __int64 FileInformation[3]; 
  unsigned int v23; 
  int v24; 
  v3 = *(_MI_PARTITION **)(a2 + 248);
  v24 = 0;
  v21 = 0i64;
  v5 = *(_QWORD *)(a2 + 8);
  *(_OWORD *)Information = 0i64;
  if( *(_QWORD *)a2 != v5
    && (int)IopQueryXxxInformation(*(FILE_OBJECT **)(a2 + 56), 3ui64, 0x18ui64, 0, Information, &ReturnedLength, 0) >= 0 )
  {
    for( i = 0x4000i64; ; i = 4096i64 )
    {
      v9 = *(_QWORD *)(a2 + 8);
      v10 = a3 < i;
      v11 = *(_QWORD *)a2;
      v12 = i;
      if( a3 >= i )
        i = a3;
      if( !v10 )
        v12 = 4096i64;
      v13 = v9 - v11;
      if( i <= v9 - v11 )
        v13 = i;
      v14 = Information[1] * (unsigned int)(v21 * HIDWORD(v21));
      if( v14 <= 0x10000000 )
        break;
      v15 = (v14 - 0x10000000) >> 12;
      if( v15 <= v13 )
        v13 = v15;
      if( (*(_BYTE *)(a2 + 204) & 0x10) != 0 && v13 < a3 )
        break;
      FileInformation[0] = (v13 + v11) << 12;
      v16 = ~*(_BYTE *)(a1 + 79) & 0x20;
      FileInformation[2] = v9 << 12;
      FileInformation[1] = v11 << 12;
      v17 = *(FILE_OBJECT **)(a2 + 56);
      v23 = (v16 | 8u) >> 3;
      if( !(unsigned int)IoSetInformation(v17, FileEndOfFileInformation, 0x20ui64, FileInformation) )
      {
        MiFinishPageFileExtension(v3, (_MMPAGING_FILE *)a2, v13);
        return v13;
      }
      if( v12 == 4096 )
        return 0i64;
    }
  }
  return 0i64;
}

Referenced by:

MiExtendPagingFiles