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