RtlFindFirstRunClear

UINT64 __stdcall RtlFindFirstRunClear(_RTL_BITMAP *BitMapHeader, UINT64 *StartingIndex){
  unsigned int SizeOfBitMap; 
  unsigned int v3; 
  unsigned int *Buffer; 
  unsigned int v7; 
  unsigned int *v8; 
  unsigned int v9; 
  __int64 v10; 
  unsigned int v11; 
  unsigned int i; 
  unsigned int *v14; 

  SizeOfBitMap = BitMapHeader->SizeOfBitMap;
  v3 = 0;
  if( !BitMapHeader->SizeOfBitMap )
  {
    *(_DWORD *)StartingIndex = 0;
    return v3;
  }
  Buffer = BitMapHeader->Buffer;
  v7 = 0;
  v8 = &Buffer[(unsigned __int64)(SizeOfBitMap - 1) >> 5];
  if( Buffer != v8 && *Buffer == -1 )
  {
    v7 = 32;
    for( ++Buffer; Buffer < v8 && *Buffer == -1; ++Buffer )
      v7 += 32;
  }
  for( ; v7 < SizeOfBitMap; ++v7 )
  {
    if( !_bittest((const signed __int32 *)BitMapHeader->Buffer, v7) )
      break;
  }
  v9 = 0;
  if( Buffer == v8 )
    goto LABEL_13;
  v10 = v7 & 0x1F;
  if( (*Buffer & ~*((_DWORD *)qword_140011CE0 + v10)) != 0 )
    goto LABEL_13;
  v9 = 32 - v10;
  if( (_DWORD)v10 != 33 )
  {
    v14 = Buffer + 1;
    while( v14 < v8 && !*v14 )
    {
      ++v14;
      v9 += 32;
      if( v9 == -1 )
        goto LABEL_17;
    }
LABEL_13:
    v11 = BitMapHeader->SizeOfBitMap;
    for( i = v9 + v7; i < v11; ++v9 )
    {
      if( _bittest((const signed __int32 *)BitMapHeader->Buffer, i) )
        break;
      if( v9 == -1 )
        break;
      ++i;
    }
  }
LABEL_17:
  *(_DWORD *)StartingIndex = v7;
  return v9;
}

Referenced by:

PnprMirrorMarkedPages