VmpMergeMemoryRanges
NTSTATUS __stdcall VmpMergeMemoryRanges(PEX_SPIN_LOCK SpinLock){
unsigned __int64 v1;
__int64 v2;
_QWORD *v3;
__int64 v4;
unsigned __int64 v5;
__int64 v7;
NTSTATUS v8;
INT64 v9;
unsigned __int64 v10;
INT64 v11;
_QWORD *v13;
_QWORD *i;
__int64 j;
__int64 v16;
__int64 v17;
_QWORD *v18;
_QWORD *v19;
_QWORD *v20;
_QWORD *v21;
_QWORD *v22;
unsigned __int64 k;
__int64 v24;
__int64 v25;
v3 = 0i64;
v4 = v2;
v5 = v1;
LODWORD(v7) = VmpProcessContextLockExclusive((INT64 *)SpinLock);
v25 = v7;
if( *((_QWORD *)SpinLock + 9) != v4 )
{
v8 = -1073740007;
goto LABEL_17;
}
v9 = *((_QWORD *)SpinLock + 3);
if( (SpinLock[8] & 1) != 0 && v9 )
v9 ^= (unsigned __int64)(SpinLock + 6);
while( 1 )
{
if( !v9 )
{
v8 = -1073741172;
goto LABEL_17;
}
v10 = *(_QWORD *)(v9 + 32);
if( v5 <= v10 )
break;
v11 = *(_QWORD *)(v9 + 8);
LABEL_11:
if( (SpinLock[8] & 1) != 0 && v11 )
v9 ^= v11;
else
v9 = v11;
}
if( v5 < *(_QWORD *)(v9 + 24) )
{
v11 = *(_QWORD *)v9;
goto LABEL_11;
}
if( v10 == v5 )
{
v3 = *(_QWORD **)(v9 + 8);
v13 = (_QWORD *)v9;
if( v3 )
{
for( i = (_QWORD *)*v3; i; i = (_QWORD *)*i )
v3 = i;
}
else
{
for( j = *(_QWORD *)(v9 + 16); ; j = v3[2] )
{
v3 = (_QWORD *)(j & 0xFFFFFFFFFFFFFFFCui64);
if( !v3 || (_QWORD *)*v3 == v13 )
break;
v13 = v3;
}
}
if( v3 && v3[3] == v5 + 1 )
{
VmpVaRangeNumberOfGpaRanges(v9);
LODWORD(v16) = VmpVaRangeNumberOfGpaRanges((INT64)v3);
if( v17 == v16 )
{
v18 = (_QWORD *)v3[5];
v19 = (_QWORD *)(v9 + 40);
v20 = *(_QWORD **)(v9 + 40);
v21 = v18;
v22 = v20;
for( k = v20[7]; k + 1 >= k && k + 1 == v21[6]; k = v22[7] )
{
v22 = (_QWORD *)*v22;
v21 = (_QWORD *)*v21;
if( v22 == v19 )
{
do
{
RtlRbRemoveNode((UINT64 *)SpinLock + 1, (UINT64)(v18 + 3));
v18[5] = -1i64;
v20[7] = v18[7];
v20 = (_QWORD *)*v20;
v18 = (_QWORD *)*v18;
}
while( v20 != v19 );
RtlRbRemoveNode((UINT64 *)SpinLock + 3, (UINT64)v3);
v24 = v3[4];
v3[2] = -1i64;
*(_QWORD *)(v9 + 32) = v24;
++*((_QWORD *)SpinLock + 5);
v8 = 0;
goto LABEL_17;
}
}
}
v8 = -1073741182;
}
else
{
v8 = -1073741503;
}
v3 = 0i64;
}
else
{
v8 = -1073741503;
}
LABEL_17:
if( v25 != -1 )
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)SpinLock);
__writecr8((unsigned __int8)v25);
}
if( v3 )
VmpFreeMemoryRanges(v3);
return v8;
}Referenced by:
VmMergeMemoryRanges