MiFindFreePageFileSpaceForward
__int64 __fastcall MiFindFreePageFileSpaceForward(__int64 a1, unsigned int *a2, __int64 a3, char a4){
unsigned int v4;
unsigned int v5;
unsigned int v7;
unsigned int v8;
__int64 v10;
unsigned int NextClearRunUlong;
unsigned int v12;
unsigned int v13;
unsigned int v14;
__int64 result;
RTL_BITMAP BitMapHeader;
RTL_BITMAP v17;
unsigned int v18;
v4 = *(_DWORD *)a1;
*(&BitMapHeader.SizeOfBitMap + 1) = 0;
v5 = 0;
v7 = *a2;
v8 = a3;
BitMapHeader.SizeOfBitMap = v4;
v10 = *(_QWORD *)(a1 + 112);
v17 = 0i64;
BitMapHeader.Buffer = *(unsigned int **)(v10 + 32);
while( 1 )
{
NextClearRunUlong = RtlFindNextClearRunUlong(&BitMapHeader, v7, a3, (UINT64 *)0xFFFFFFFFi64);
a3 = NextClearRunUlong;
if( !NextClearRunUlong )
break;
v7 = NextClearRunUlong;
if( NextClearRunUlong >= v5 && (NextClearRunUlong >= v8 || a4 >= 0) )
{
v12 = 0;
v13 = v8;
v17.Buffer = *(unsigned int **)(*(_QWORD *)(a1 + 112) + 16i64);
v17.SizeOfBitMap = NextClearRunUlong;
if( v8 <= 0x20 )
v13 = 32;
v18 = v13;
while( 1 )
{
v14 = RtlFindNextClearRunUlong(&v17, v12, a3, (UINT64 *)v13);
if( !v14 )
break;
v13 = v18;
v12 = v14;
if( v14 > v5 )
{
v5 = v14;
if( v14 > v8 )
v5 = v8;
if( v5 == v8 )
goto LABEL_13;
}
}
if( v5 == v8 )
break;
}
}
LABEL_13:
if( a4 < 0 && v5 < v8 )
v5 = 0;
result = v5;
*a2 = 0;
return result;
}Referenced by:
MiFindFreePageFileSpace