VmpAccessFaultBatch
NTSTATUS __fastcall VmpAccessFaultBatch(
PEX_SPIN_LOCK SpinLock,
_RTL_BALANCED_NODE *a2,
INT64 a3,
INT64 a4,
INT64 a5,
INT64 a6,
INT64 a7,
INT64 a8){
__int64 v8;
__int64 v9;
int v12;
int v13;
int updated;
__int64 v15;
__int64 v16;
int v17;
_RTL_BALANCED_NODE *v18;
_RTL_BALANCED_NODE **v19;
unsigned __int64 v20;
__int64 *v21;
__int64 v22;
__int64 v23;
INT64 v25;
int v26;
v8 = a4;
LODWORD(v9) = a3;
do
{
VmpFaultEntryInsert((__int64)SpinLock, a2, v9);
v12 = 1;
v26 = 1;
VmpAccessFaultBatchResolve(a2, v9, v8, a5, a6, a7);
updated = v13;
if( v13 < 0 )
goto LABEL_26;
LODWORD(v15) = VmpProcessContextLockShared(SpinLock);
v16 = v15;
if( *((_QWORD *)SpinLock + 9) != a8 )
{
updated = -1073741558;
goto LABEL_23;
}
v17 = 0;
v18 = &a2[2 * (unsigned int)v9];
if( a2 < v18 )
{
v19 = &a2[1].Children[1];
v20 = (48 * (unsigned __int64)(unsigned int)v9 - 1) / 0x30 + 1;
do
{
if( ((unsigned __int64)*(v19 - 1) & 0x10000000000000i64) != 0 || (*((_BYTE *)v19 + 7) & 1) != 0 )
{
*v19 = (_RTL_BALANCED_NODE *)((unsigned __int64)*v19 | 0x80000000000000i64);
++v17;
}
v19 += 6;
--v20;
}
while( v20 );
}
if( v17 != (_DWORD)v9 )
{
LODWORD(v25) = ((unsigned int)a5 >> 5) & 1;
updated = VmpProcessUpdateSlat((INT64)SpinLock, (UINT64)a2, (unsigned int)v9, a4, v25);
if( updated < 0 )
goto LABEL_22;
}
ExReleaseSpinLockSharedFromDpcLevel(SpinLock);
__writecr8((unsigned __int8)v16);
v16 = -1i64;
VmpFaultEntryRemove((__int64)SpinLock, a2, v9);
v26 = 0;
if( !v17 )
break;
v9 = 0i64;
if( a2 >= v18 )
break;
v21 = (__int64 *)&a2[1].Children[1];
do
{
v22 = *v21;
if( (*v21 & 0x80000000000000i64) != 0 )
{
if( (v22 & 0x100000000000000i64) == 0 )
{
*(v21 - 1) &= ~0x10000000000000ui64;
*v21 = v22 & 0xFFFFFFFFFFFFFi64;
v23 = 2 * v9;
v9 = (unsigned int)(v9 + 1);
a2[v23].0 = ($B2AD7D77B0CFA0A0765E11E131618F47)*((_OWORD *)v21 - 2);
*(_OWORD *)&a2[v23]._bf_0 = *((_OWORD *)v21 - 1);
*(_OWORD *)&a2[v23 + 1].Right = *(_OWORD *)v21;
}
if( !--v17 )
break;
}
v21 += 6;
}
while( v21 - 4 < (__int64 *)v18 );
v8 = a4;
}
while( (_DWORD)v9 );
updated = 0;
LABEL_22:
v12 = v26;
LABEL_23:
if( v16 != -1 )
{
ExReleaseSpinLockSharedFromDpcLevel(SpinLock);
__writecr8((unsigned __int8)v16);
}
if( v12 )
LABEL_26:
VmpFaultEntryRemove((__int64)SpinLock, a2, v9);
return updated;
}Referenced by:
VmAccessFault