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