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