VmpMergeMemoryRanges

NTSTATUS __stdcall VmpMergeMemoryRanges(PEX_SPIN_LOCK SpinLock){
  unsigned __int64 v1; 
  __int64 v2; 
  _QWORD *v3; 
  __int64 v4; 
  unsigned __int64 v5; 
  __int64 v7; 
  NTSTATUS v8; 
  INT64 v9; 
  unsigned __int64 v10; 
  INT64 v11; 
  _QWORD *v13; 
  _QWORD *i; 
  __int64 j; 
  __int64 v16; 
  __int64 v17; 
  _QWORD *v18; 
  _QWORD *v19; 
  _QWORD *v20; 
  _QWORD *v21; 
  _QWORD *v22; 
  unsigned __int64 k; 
  __int64 v24; 
  __int64 v25; 

  v3 = 0i64;
  v4 = v2;
  v5 = v1;
  LODWORD(v7) = VmpProcessContextLockExclusive((INT64 *)SpinLock);
  v25 = v7;
  if( *((_QWORD *)SpinLock + 9) != v4 )
  {
    v8 = -1073740007;
    goto LABEL_17;
  }
  v9 = *((_QWORD *)SpinLock + 3);
  if( (SpinLock[8] & 1) != 0 && v9 )
    v9 ^= (unsigned __int64)(SpinLock + 6);
  while( 1 )
  {
    if( !v9 )
    {
      v8 = -1073741172;
      goto LABEL_17;
    }
    v10 = *(_QWORD *)(v9 + 32);
    if( v5 <= v10 )
      break;
    v11 = *(_QWORD *)(v9 + 8);
LABEL_11:
    if( (SpinLock[8] & 1) != 0 && v11 )
      v9 ^= v11;
    else
      v9 = v11;
  }
  if( v5 < *(_QWORD *)(v9 + 24) )
  {
    v11 = *(_QWORD *)v9;
    goto LABEL_11;
  }
  if( v10 == v5 )
  {
    v3 = *(_QWORD **)(v9 + 8);
    v13 = (_QWORD *)v9;
    if( v3 )
    {
      for( i = (_QWORD *)*v3; i; i = (_QWORD *)*i )
        v3 = i;
    }
    else
    {
      for( j = *(_QWORD *)(v9 + 16); ; j = v3[2] )
      {
        v3 = (_QWORD *)(j & 0xFFFFFFFFFFFFFFFCui64);
        if( !v3 || (_QWORD *)*v3 == v13 )
          break;
        v13 = v3;
      }
    }
    if( v3 && v3[3] == v5 + 1 )
    {
      VmpVaRangeNumberOfGpaRanges(v9);
      LODWORD(v16) = VmpVaRangeNumberOfGpaRanges((INT64)v3);
      if( v17 == v16 )
      {
        v18 = (_QWORD *)v3[5];
        v19 = (_QWORD *)(v9 + 40);
        v20 = *(_QWORD **)(v9 + 40);
        v21 = v18;
        v22 = v20;
        for( k = v20[7]; k + 1 >= k && k + 1 == v21[6]; k = v22[7] )
        {
          v22 = (_QWORD *)*v22;
          v21 = (_QWORD *)*v21;
          if( v22 == v19 )
          {
            do
            {
              RtlRbRemoveNode((UINT64 *)SpinLock + 1, (UINT64)(v18 + 3));
              v18[5] = -1i64;
              v20[7] = v18[7];
              v20 = (_QWORD *)*v20;
              v18 = (_QWORD *)*v18;
            }
            while( v20 != v19 );
            RtlRbRemoveNode((UINT64 *)SpinLock + 3, (UINT64)v3);
            v24 = v3[4];
            v3[2] = -1i64;
            *(_QWORD *)(v9 + 32) = v24;
            ++*((_QWORD *)SpinLock + 5);
            v8 = 0;
            goto LABEL_17;
          }
        }
      }
      v8 = -1073741182;
    }
    else
    {
      v8 = -1073741503;
    }
    v3 = 0i64;
  }
  else
  {
    v8 = -1073741503;
  }
LABEL_17:
  if( v25 != -1 )
  {
    ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)SpinLock);
    __writecr8((unsigned __int8)v25);
  }
  if( v3 )
    VmpFreeMemoryRanges(v3);
  return v8;
}

Referenced by:

VmMergeMemoryRanges