MiLockVadRange
__int64 __fastcall MiLockVadRange(__int64 a1, unsigned __int64 a2, unsigned __int64 a3, int a4){
_ETHREAD *CurrentThread;
int v5;
unsigned __int64 v6;
int v8;
RTL_BALANCED_NODE *Address;
__int64 v10;
__int64 v11;
__int64 v12;
unsigned __int64 v13;
unsigned __int64 v14;
__int64 i;
_QWORD *v17;
__int64 v18;
__int64 v19;
RTL_BALANCED_NODE *v20;
__int64 *v21;
__int64 v22;
unsigned __int64 v23;
unsigned __int64 v24;
_QWORD *v25;
unsigned __int64 j;
__int64 v27;
__int128 v28[4];
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v28[0] = 0i64;
v5 = a4;
v6 = a2;
v8 = 1;
LABEL_2:
if( v5 )
LOCK_ADDRESS_SPACE((__int64)CurrentThread, a1);
else
LOCK_ADDRESS_SPACE_SHARED(CurrentThread, (_EPROCESS *)a1);
if( !v8 || (*(_DWORD *)(a1 + 1124) & 0x20) != 0 )
return 0i64;
if( v6 == -1i64 )
{
v20 = *(RTL_BALANCED_NODE **)(a1 + 2008);
Address = 0i64;
while( v20 )
{
Address = v20;
v20 = v20->Children[0];
}
}
else
{
Address = MiLocateAddress(v6);
}
v10 = 0i64;
v11 = (__int64)Address;
v12 = 0i64;
while( v11 )
{
v13 = *(_QWORD *)(v11 + 8);
v14 = v11;
if( v13 )
{
v17 = *(_QWORD **)v13;
if( *(_QWORD *)v13 )
{
do
{
v13 = (unsigned __int64)v17;
v17 = (_QWORD *)*v17;
}
while( v17 );
}
}
else
{
for( i = *(_QWORD *)(v11 + 16); ; i = *(_QWORD *)(v13 + 16) )
{
v13 = i & 0xFFFFFFFFFFFFFFFCui64;
if( !v13 || *(_QWORD *)v13 == v14 )
break;
v14 = v13;
}
}
if( a3 != -1i64 )
{
v18 = *(unsigned int *)(v11 + 28);
if( a3 <= (v18 | ((unsigned __int64)*(unsigned __int8 *)(v11 + 33) << 32)) << 12 )
{
v13 = 0i64;
goto LABEL_23;
}
if( v13 )
{
if( (v18 | ((unsigned __int64)*(unsigned __int8 *)(v11 + 33) << 32)) + 1 == (*(unsigned int *)(v13 + 24) | ((unsigned __int64)*(unsigned __int8 *)(v13 + 32) << 32)) )
goto LABEL_23;
v13 = 0i64;
}
v8 = 0;
}
LABEL_23:
if( (unsigned int)MiVadIsCfgBitmap((_MMVAD *)v11) == 1 )
{
*((_QWORD *)v28 + v12) = v11;
v12 = (unsigned int)(v12 + 1);
}
else
{
if( v10 )
ExAcquirePushLockExclusiveEx(v11 + 40, 0i64);
else
MiLockVad((__int64)CurrentThread, v11);
if( (unsigned int)MiVadDeleted(v11) == 1 || !v8 )
{
MiReferenceVad(v19);
if( Address != (RTL_BALANCED_NODE *)v11 )
{
do
{
v23 = (unsigned __int64)Address->Children[1];
v24 = (unsigned __int64)Address;
if( v23 )
{
v25 = *(_QWORD **)v23;
if( *(_QWORD *)v23 )
{
do
{
v23 = (unsigned __int64)v25;
v25 = (_QWORD *)*v25;
}
while( v25 );
}
}
else
{
for( j = Address->ParentValue; ; j = *(_QWORD *)(v23 + 16) )
{
v23 = j & 0xFFFFFFFFFFFFFFFCui64;
if( !v23 || *(_QWORD *)v23 == v24 )
break;
v24 = v23;
}
}
if( !(unsigned int)MiVadIsCfgBitmap((_MMVAD *)Address) )
{
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&Address[1].16, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)&Address[1].16);
KeAbPostRelease(&Address[1].16);
}
Address = (RTL_BALANCED_NODE *)v23;
}
while( v23 != v11 );
}
if( a4 )
UNLOCK_ADDRESS_SPACE_UNORDERED((__int64)CurrentThread, a1);
else
UNLOCK_ADDRESS_SPACE_SHARED_UNORDERED((__int64)CurrentThread, a1);
if( (unsigned int)MiVadDeleted(v11) == 1 )
MiWaitForVadDeletion(v27);
MiUnlockAndDereferenceVad((PVOID)v11);
v5 = a4;
v6 = a2;
goto LABEL_2;
}
++v10;
}
v11 = v13;
}
if( v8 == 1 && (_DWORD)v12 )
{
v21 = (__int64 *)v28;
v22 = (unsigned int)v12;
do
{
if( v10 )
ExAcquirePushLockExclusiveEx(*v21 + 40, 0i64);
else
MiLockVad((__int64)CurrentThread, *v21);
++v10;
++v21;
--v22;
}
while( v22 );
}
return v10;
}Referenced by:
MiCloneProcessAddressSpace
MiCoalescePlaceholderAllocations
MmAssignProcessToJob
NtLockVirtualMemory
NtUnlockVirtualMemory