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