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