MiUnlockVadRange
VOID __stdcall MiUnlockVadRange(_EPROCESS *Process, PVOID StartingVa, UINT64 NumberOfVads){
int v3;
_ETHREAD *CurrentThread;
int v5;
RTL_BALANCED_NODE *Address;
unsigned __int64 v9;
unsigned __int64 v10;
unsigned __int64 i;
_QWORD *v12;
$2AC33BEB5BE0E2B4BDE1FE63E3EEE4EC *v13;
RTL_BALANCED_NODE *v14;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v5 = v3;
if( StartingVa == (PVOID)-1i64 )
{
v14 = (RTL_BALANCED_NODE *)*((_QWORD *)Process + 251);
Address = 0i64;
while( v14 )
{
Address = v14;
v14 = v14->Children[0];
}
}
else
{
Address = MiLocateAddress((UINT64)StartingVa);
}
if( NumberOfVads )
{
while( 1 )
{
v9 = (unsigned __int64)Address->Children[1];
v10 = (unsigned __int64)Address;
if( v9 )
{
v12 = *(_QWORD **)v9;
if( *(_QWORD *)v9 )
{
do
{
v9 = (unsigned __int64)v12;
v12 = (_QWORD *)*v12;
}
while( v12 );
}
}
else
{
for( i = Address->ParentValue; ; i = *(_QWORD *)(v9 + 16) )
{
v9 = i & 0xFFFFFFFFFFFFFFFCui64;
if( !v9 || *(_QWORD *)v9 == v10 )
break;
v10 = v9;
}
}
if( NumberOfVads == 1 )
break;
v13 = &Address[1].16;
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&Address[1].16, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)&Address[1].16);
KeAbPostRelease(v13);
Address = (RTL_BALANCED_NODE *)v9;
if( !--NumberOfVads )
goto LABEL_13;
}
MiUnlockVad((__int64)CurrentThread, (__int64)Address);
}
LABEL_13:
if( v5 )
UNLOCK_ADDRESS_SPACE((__int64)CurrentThread, (__int64)Process);
else
UNLOCK_ADDRESS_SPACE_SHARED((__int64)CurrentThread, (__int64)Process);
}Referenced by:
MiCloneProcessAddressSpace
MiCoalescePlaceholderAllocations
MmAssignProcessToJob
NtLockVirtualMemory
NtUnlockVirtualMemory