MiLockVadRange

NTSTATUS __stdcall MiLockVadRange(_EPROCESS *Process, VOID *StartingVa, VOID *EndingVa){
  int v3; 
  _ETHREAD *CurrentThread; 
  int v5; 
  VOID *v6; 
  int v8; 
  _MMVAD *Address; 
  __int64 v10; 
  _MMVAD *v11; 
  __int64 v12; 
  unsigned __int64 ExtraCreateInfo; 
  unsigned __int64 v14; 
  unsigned __int64 i; 
  _QWORD *v17; 
  __int64 EndingVpn; 
  _MMVAD_SHORT *v19; 
  _RTL_BALANCED_NODE *Root; 
  _MMVAD_SHORT **v21; 
  __int64 v22; 
  unsigned __int64 v23; 
  unsigned __int64 v24; 
  _QWORD *v25; 
  unsigned __int64 j; 
  _MMVAD_SHORT *v27; 
  __int128 v28[4]; 
  int v31; 

  v31 = v3;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v28[0] = 0i64;
  v5 = v3;
  v6 = StartingVa;
  v8 = 1;
LABEL_2:
  if( v5 )
    LOCK_ADDRESS_SPACE(CurrentThread, Process);
  else
    LOCK_ADDRESS_SPACE_SHARED(CurrentThread, Process);
  if( !v8 || (Process->Flags & 0x20) != 0 )
  {
    LODWORD(v10) = 0;
    return v10;
  }
  if( v6 == (VOID *)-1i64 )
  {
    Root = Process->VadRoot.Root;
    Address = 0i64;
    while( Root )
    {
      Address = (_MMVAD *)Root;
      Root = Root->Children[0];
    }
  }
  else
  {
    Address = MiLocateAddress(v6);
  }
  v10 = 0i64;
  v11 = Address;
  v12 = 0i64;
  while( v11 )
  {
    ExtraCreateInfo = (unsigned __int64)v11->Core.ExtraCreateInfo;
    v14 = (unsigned __int64)v11;
    if( ExtraCreateInfo )
    {
      v17 = *(_QWORD **)ExtraCreateInfo;
      if( *(_QWORD *)ExtraCreateInfo )
      {
        do
        {
          ExtraCreateInfo = (unsigned __int64)v17;
          v17 = (_QWORD *)*v17;
        }
        while( v17 );
      }
    }
    else
    {
      for( i = v11->Core.VadNode.ParentValue; ; i = *(_QWORD *)(ExtraCreateInfo + 16) )
      {
        ExtraCreateInfo = i & 0xFFFFFFFFFFFFFFFCui64;
        if( !ExtraCreateInfo || *(_QWORD *)ExtraCreateInfo == v14 )
          break;
        v14 = ExtraCreateInfo;
      }
    }
    if( EndingVa != (VOID *)-1i64 )
    {
      EndingVpn = v11->Core.EndingVpn;
      if( (unsigned __int64)EndingVa <= (EndingVpn | ((unsigned __int64)v11->Core.EndingVpnHigh << 32)) << 12 )
      {
        ExtraCreateInfo = 0i64;
        goto LABEL_23;
      }
      if( ExtraCreateInfo )
      {
        if( (EndingVpn | ((unsigned __int64)v11->Core.EndingVpnHigh << 32)) + 1 == (*(unsigned int *)(ExtraCreateInfo + 24) | ((unsigned __int64)*(unsigned __int8 *)(ExtraCreateInfo + 32) << 32)) )
          goto LABEL_23;
        ExtraCreateInfo = 0i64;
      }
      v8 = 0;
    }
LABEL_23:
    if( MiVadIsCfgBitmap(v11) == 1 )
    {
      *((_QWORD *)v28 + v12) = v11;
      v12 = (unsigned int)(v12 + 1);
    }
    else
    {
      if( v10 )
        ExAcquirePushLockExclusiveEx(&v11->Core.PushLock, 0i64);
      else
        MiLockVad(CurrentThread, &v11->Core);
      if( MiVadDeleted(&v11->Core) == 1 || !v8 )
      {
        MiReferenceVad(v19);
        if( Address != v11 )
        {
          do
          {
            v23 = (unsigned __int64)Address->Core.ExtraCreateInfo;
            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->Core.VadNode.ParentValue; ; j = *(_QWORD *)(v23 + 16) )
              {
                v23 = j & 0xFFFFFFFFFFFFFFFCui64;
                if( !v23 || *(_QWORD *)v23 == v24 )
                  break;
                v24 = v23;
              }
            }
            if( !MiVadIsCfgBitmap(Address) )
            {
              if( (_InterlockedExchangeAdd64(&Address->Core.PushLock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
                ExfTryToWakePushLock(&Address->Core.PushLock);
              KeAbPostRelease(&Address->Core.PushLock);
            }
            Address = (_MMVAD *)v23;
          }
          while( (_MMVAD *)v23 != v11 );
        }
        if( v31 )
          UNLOCK_ADDRESS_SPACE_UNORDERED(CurrentThread, Process);
        else
          UNLOCK_ADDRESS_SPACE_SHARED_UNORDERED(CurrentThread, Process);
        if( MiVadDeleted(&v11->Core) == 1 )
          MiWaitForVadDeletion(v27);
        MiUnlockAndDereferenceVad(&v11->Core);
        v5 = v31;
        v6 = StartingVa;
        goto LABEL_2;
      }
      ++v10;
    }
    v11 = (_MMVAD *)ExtraCreateInfo;
  }
  if( v8 == 1 && (_DWORD)v12 )
  {
    v21 = (_MMVAD_SHORT **)v28;
    v22 = (unsigned int)v12;
    do
    {
      if( v10 )
        ExAcquirePushLockExclusiveEx(&(*v21)->PushLock, 0i64);
      else
        MiLockVad(CurrentThread, *v21);
      ++v10;
      ++v21;
      --v22;
    }
    while( v22 );
  }
  return v10;
}

Referenced by:

MiCloneProcessAddressSpace
MiCoalescePlaceholderAllocations
MmAssignProcessToJob
NtLockVirtualMemory
NtUnlockVirtualMemory