HvpFindNextDirtyRun

UINT8 __stdcall HvpFindNextDirtyRun(
        _RTL_BITMAP *DirtyVector,
        UINT64 *Current,
        UINT64 *Start,
        UINT64 *End,
        UINT64 *Length){
  unsigned int v5; 
  unsigned int SizeOfBitMap; 
  unsigned int *Buffer; 
  unsigned int v12; 
  unsigned int *v13; 
  unsigned int *v14; 
  int v15; 
  __int64 v16; 
  unsigned int v17; 
  unsigned int i; 
  UINT8 result; 
  unsigned int *v20; 
  unsigned int v21; 
  unsigned int v22; 
  int v23; 
  unsigned int *v24; 
  unsigned int *v25; 
  unsigned int *v26; 
  __int64 v27; 
  __int64 v28; 
  unsigned int *v29; 
  unsigned int j; 

  v5 = *(_DWORD *)Current;
  SizeOfBitMap = DirtyVector->SizeOfBitMap;
  if( *(_DWORD *)Current >= DirtyVector->SizeOfBitMap )
    return 0;
  Buffer = DirtyVector->Buffer;
  v12 = *(_DWORD *)Current;
  v13 = &Buffer[(unsigned __int64)(SizeOfBitMap - 1) >> 5];
  v14 = &Buffer[(unsigned __int64)v5 >> 5];
  if( v14 != v13 && (*v14 | *((_DWORD *)qword_140011CE0 + (v5 & 0x1F))) == -1 )
  {
    v12 = v5 - (v5 & 0x1F) + 32;
    for( ++v14; v14 < v13 && *v14 == -1; ++v14 )
      v12 += 32;
  }
  for( ; v12 < SizeOfBitMap; ++v12 )
  {
    if( !_bittest((const signed __int32 *)DirtyVector->Buffer, v12) )
      break;
  }
  v15 = 0;
  if( v14 != v13 )
  {
    v16 = v12 & 0x1F;
    if( (*v14 & ~*((_DWORD *)qword_140011CE0 + v16)) == 0 )
    {
      v15 = 32 - v16;
      if( (_DWORD)v16 == 33 )
        goto LABEL_17;
      v20 = v14 + 1;
      while( v20 < v13 && !*v20 )
      {
        ++v20;
        v15 += 32;
        if( v15 == -1 )
          goto LABEL_17;
      }
    }
  }
  v17 = DirtyVector->SizeOfBitMap;
  for( i = v15 + v12; i < v17; ++v15 )
  {
    if( _bittest((const signed __int32 *)DirtyVector->Buffer, i) )
      break;
    if( v15 == -1 )
      break;
    ++i;
  }
LABEL_17:
  if( !v15 )
  {
    v12 = SizeOfBitMap;
    goto LABEL_20;
  }
  if( v12 != v5 )
  {
    SizeOfBitMap = v15 + v12;
LABEL_20:
    *(_DWORD *)Current = SizeOfBitMap;
    result = 1;
    *(_DWORD *)Start = v5;
    *(_DWORD *)End = v12;
    return result;
  }
  v5 += v15;
  if( v5 < SizeOfBitMap )
  {
    v21 = DirtyVector->SizeOfBitMap;
    v22 = v5;
    if( DirtyVector->SizeOfBitMap <= v5 )
    {
      v23 = 0;
LABEL_52:
      v12 = SizeOfBitMap;
      if( v23 )
        v12 = v22;
      if( v23 )
        SizeOfBitMap = v23 + v22;
      goto LABEL_20;
    }
    v24 = DirtyVector->Buffer;
    v25 = &v24[(unsigned __int64)(v21 - 1) >> 5];
    v26 = &v24[(unsigned __int64)v5 >> 5];
    if( v26 != v25 )
    {
      v27 = v5 & 0x1F;
      if( (*v26 | *((_DWORD *)qword_140011CE0 + v27)) == -1 )
      {
        v22 = v5 - v27 + 32;
        for( ++v26; v26 < v25 && *v26 == -1; ++v26 )
          v22 += 32;
      }
    }
    for( ; v22 < v21; ++v22 )
    {
      if( !_bittest((const signed __int32 *)DirtyVector->Buffer, v22) )
        break;
    }
    v23 = 0;
    if( v26 != v25 )
    {
      v28 = v22 & 0x1F;
      if( (*v26 & ~*((_DWORD *)qword_140011CE0 + v28)) == 0 )
      {
        v23 = 32 - v28;
        if( (_DWORD)v28 == 33 )
          goto LABEL_52;
        v29 = v26 + 1;
        while( v29 < v25 && !*v29 )
        {
          ++v29;
          v23 += 32;
          if( v23 == -1 )
            goto LABEL_52;
        }
      }
    }
    for( j = v23 + v22; j < DirtyVector->SizeOfBitMap; ++v23 )
    {
      if( _bittest((const signed __int32 *)DirtyVector->Buffer, j) )
        break;
      if( v23 == -1 )
        break;
      ++j;
    }
    goto LABEL_52;
  }
  return 0;
}

Referenced by:

HvpFindNextDirtyBlock