MiUnlockVadRange
VOID __stdcall MiUnlockVadRange(_EPROCESS *Process, VOID *StartingVa, UINT64 NumberOfVads){
int v3;
_ETHREAD *CurrentThread;
int v5;
_MMVAD *Address;
unsigned __int64 ExtraCreateInfo;
unsigned __int64 v10;
unsigned __int64 i;
_QWORD *v12;
_EX_PUSH_LOCK *p_PushLock;
_RTL_BALANCED_NODE *Root;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v5 = v3;
if( StartingVa == (VOID *)-1i64 )
{
Root = Process->VadRoot.Root;
Address = 0i64;
while( Root )
{
Address = (_MMVAD *)Root;
Root = Root->Children[0];
}
}
else
{
Address = MiLocateAddress(StartingVa);
}
if( NumberOfVads )
{
while( 1 )
{
ExtraCreateInfo = (unsigned __int64)Address->Core.ExtraCreateInfo;
v10 = (unsigned __int64)Address;
if( ExtraCreateInfo )
{
v12 = *(_QWORD **)ExtraCreateInfo;
if( *(_QWORD *)ExtraCreateInfo )
{
do
{
ExtraCreateInfo = (unsigned __int64)v12;
v12 = (_QWORD *)*v12;
}
while( v12 );
}
}
else
{
for( i = Address->Core.VadNode.ParentValue; ; i = *(_QWORD *)(ExtraCreateInfo + 16) )
{
ExtraCreateInfo = i & 0xFFFFFFFFFFFFFFFCui64;
if( !ExtraCreateInfo || *(_QWORD *)ExtraCreateInfo == v10 )
break;
v10 = ExtraCreateInfo;
}
}
if( NumberOfVads == 1 )
break;
p_PushLock = &Address->Core.PushLock;
if( (_InterlockedExchangeAdd64(&Address->Core.PushLock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(&Address->Core.PushLock);
KeAbPostRelease(p_PushLock);
Address = (_MMVAD *)ExtraCreateInfo;
if( !--NumberOfVads )
goto LABEL_13;
}
MiUnlockVad(CurrentThread, &Address->Core);
}
LABEL_13:
if( v5 )
UNLOCK_ADDRESS_SPACE(CurrentThread, Process);
else
UNLOCK_ADDRESS_SPACE_SHARED(CurrentThread, Process);
}Referenced by:
MiCloneProcessAddressSpace
MiCoalescePlaceholderAllocations
MmAssignProcessToJob
NtLockVirtualMemory
NtUnlockVirtualMemory