HvUnCOWReconciledPages
VOID __stdcall HvUnCOWReconciledPages(INT64 a1){
_RTL_BITMAP *v2;
unsigned int SizeOfBitMap;
__int64 v4;
int *v5;
int v6;
int v7;
_ETHREAD *v8;
unsigned int v9;
unsigned int *Buffer;
unsigned int v11;
unsigned int *v12;
int v13;
int v14;
unsigned int i;
unsigned int v16;
INT64 v17;
unsigned int v18;
unsigned int *v19;
unsigned int *v20;
unsigned int *v21;
int v22;
int v23;
unsigned int j;
unsigned int *v25;
unsigned int *v26;
if( (*(_DWORD *)(a1 + 160) & 0x20000) != 0 )
{
v2 = (_RTL_BITMAP *)(a1 + 1728);
if( *(struct _KTHREAD **)(a1 + 4232) == KeGetCurrentThread() )
RtlMergeBitMaps((_RTL_BITMAP *)(a1 + 1728), (_RTL_BITMAP *)(a1 + 1680));
SizeOfBitMap = v2->SizeOfBitMap;
v4 = 0i64;
while( SizeOfBitMap )
{
v5 = (int *)&v2->Buffer[v4];
v6 = *v5;
if( SizeOfBitMap < 0x20 )
{
v22 = 1 << SizeOfBitMap;
SizeOfBitMap = 0;
v7 = (v22 - 1) ^ v6;
}
else
{
SizeOfBitMap -= 32;
v7 = ~v6;
}
*v5 = v7;
v4 = (unsigned int)(v4 + 1);
}
RtlMergeBitMaps(v2, (_RTL_BITMAP *)(a1 + 88));
RtlMergeBitMaps(v2, (_RTL_BITMAP *)(a1 + 112));
v8 = *(_ETHREAD **)(a1 + 4232);
if( v8 && v8 != (_ETHREAD *)KeGetCurrentThread() )
RtlMergeBitMaps(v2, (_RTL_BITMAP *)(a1 + 1680));
v9 = v2->SizeOfBitMap;
if( v2->SizeOfBitMap )
{
Buffer = v2->Buffer;
v11 = 0;
v12 = &Buffer[(unsigned __int64)(v9 - 1) >> 5];
if( Buffer != v12 && *Buffer == -1 )
{
v11 = 32;
for( ++Buffer; Buffer < v12 && *Buffer == -1; ++Buffer )
v11 += 32;
}
for( ; v11 < v9; ++v11 )
{
if( !_bittest((const signed __int32 *)v2->Buffer, v11) )
break;
}
v13 = 0;
if( Buffer != v12 )
{
v14 = v11 & 0x1F;
if( (*Buffer & ~*((_DWORD *)qword_140011CE0 + (v11 & 0x1F))) == 0 )
{
v13 = 32 - v14;
if( v14 == 33 )
goto LABEL_26;
v26 = Buffer + 1;
while( v26 < v12 && !*v26 )
{
++v26;
v13 += 32;
if( v13 == -1 )
goto LABEL_26;
}
}
}
for( i = v13 + v11; i < v2->SizeOfBitMap; ++v13 )
{
if( _bittest((const signed __int32 *)v2->Buffer, i) )
break;
if( v13 == -1 )
break;
++i;
}
while( 1 )
{
while( 1 )
{
LABEL_26:
if( !v13 )
return;
v16 = ((v11 << 9) + (v13 << 9)) & 0xFFFFF000;
v17 = ((v11 << 9) + 4095) & 0xFFFFF000;
if( (_DWORD)v17 != v16 )
HvpViewMapUnCOWAndSealRange(a1 + 216, v17, v16 - (unsigned int)v17);
v18 = v2->SizeOfBitMap;
v11 += v13;
if( v2->SizeOfBitMap <= v11 )
return;
v19 = v2->Buffer;
v20 = &v19[(unsigned __int64)(v18 - 1) >> 5];
v21 = &v19[(unsigned __int64)v11 >> 5];
if( v21 != v20 && (*v21 | *((_DWORD *)qword_140011CE0 + (v11 & 0x1F))) == -1 )
{
v11 = v11 - (v11 & 0x1F) + 32;
for( ++v21; v21 < v20 && *v21 == -1; ++v21 )
v11 += 32;
}
for( ; v11 < v18; ++v11 )
{
if( !_bittest((const signed __int32 *)v2->Buffer, v11) )
break;
}
v13 = 0;
if( v21 != v20 )
{
v23 = v11 & 0x1F;
if( (*v21 & ~*((_DWORD *)qword_140011CE0 + (v11 & 0x1F))) == 0 )
break;
}
LABEL_42:
for( j = v13 + v11; j < v2->SizeOfBitMap; ++v13 )
{
if( _bittest((const signed __int32 *)v2->Buffer, j) )
break;
if( v13 == -1 )
break;
++j;
}
}
v13 = 32 - v23;
if( v23 != 33 )
{
v25 = v21 + 1;
while( v25 < v20 && !*v25 )
{
++v25;
v13 += 32;
if( v13 == -1 )
goto LABEL_26;
}
goto LABEL_42;
}
}
}
}
}Referenced by:
CmpFlushHive