VmpAccessFaultBatch

INT64 __fastcall VmpAccessFaultBatch(
        PEX_SPIN_LOCK SpinLock,
        _RTL_BALANCED_NODE *a2,
        INT64 a3,
        INT64 a4,
        INT64 a5,
        INT64 a6,
        INT64 a7,
        INT64 a8){
  INT64 v8; 
  __int64 v9; 
  int v12; 
  int updated; 
  __int64 v14; 
  __int64 v15; 
  int v16; 
  _RTL_BALANCED_NODE *v17; 
  _RTL_BALANCED_NODE **v18; 
  unsigned __int64 v19; 
  __int64 *v20; 
  __int64 v21; 
  __int64 v22; 
  INT64 v24; 
  INT64 v25; 
  int v26; 
  v8 = a4;
  LODWORD(v9) = a3;
  do
  {
    VmpFaultEntryInsert((INT64)SpinLock, (UINT64)a2, (unsigned int)v9);
    v12 = 1;
    LODWORD(v25) = a7;
    v26 = 1;
    updated = VmpAccessFaultBatchResolve(a2, (unsigned int)v9, v8, a5, a6, v25);
    if( updated < 0 )
      goto LABEL_26;
    LODWORD(v14) = VmpProcessContextLockShared(SpinLock);
    v15 = v14;
    if( *((_QWORD *)SpinLock + 9) != a8 )
    {
      updated = -1073741558;
      goto LABEL_23;
    }
    v16 = 0;
    v17 = &a2[2 * (unsigned int)v9];
    if( a2 < v17 )
    {
      v18 = &a2[1].Children[1];
      v19 = (48 * (unsigned __int64)(unsigned int)v9 - 1) / 0x30 + 1;
      do
      {
        if( ((unsigned __int64)*(v18 - 1) & 0x10000000000000i64) != 0 || (*((_BYTE *)v18 + 7) & 1) != 0 )
        {
          *v18 = (_RTL_BALANCED_NODE *)((unsigned __int64)*v18 | 0x80000000000000i64);
          ++v16;
        }
        v18 += 6;
        --v19;
      }
      while( v19 );
    }
    if( v16 != (_DWORD)v9 )
    {
      LODWORD(v24) = ((unsigned int)a5 >> 5) & 1;
      updated = VmpProcessUpdateSlat((INT64)SpinLock, (UINT64)a2, (unsigned int)v9, a4, v24);
      if( updated < 0 )
        goto LABEL_22;
    }
    ExReleaseSpinLockSharedFromDpcLevel(SpinLock);
    __writecr8((unsigned __int8)v15);
    v15 = -1i64;
    VmpFaultEntryRemove((INT64)SpinLock, (UINT64)a2, (unsigned int)v9);
    v26 = 0;
    if( !v16 )
      break;
    v9 = 0i64;
    if( a2 >= v17 )
      break;
    v20 = (__int64 *)&a2[1].Children[1];
    do
    {
      v21 = *v20;
      if( (*v20 & 0x80000000000000i64) != 0 )
      {
        if( (v21 & 0x100000000000000i64) == 0 )
        {
          *(v20 - 1) &= ~0x10000000000000ui64;
          *v20 = v21 & 0xFFFFFFFFFFFFFi64;
          v22 = 2 * v9;
          v9 = (unsigned int)(v9 + 1);
          a2[v22].0 = ($B2AD7D77B0CFA0A0765E11E131618F47)*((_OWORD *)v20 - 2);
          *(_OWORD *)&a2[v22].0 = *((_OWORD *)v20 - 1);
          *(_OWORD *)&a2[v22 + 1].Right = *(_OWORD *)v20;
        }
        if( !--v16 )
          break;
      }
      v20 += 6;
    }
    while( v20 - 4 < (__int64 *)v17 );
    v8 = a4;
  }
  while( (_DWORD)v9 );
  updated = 0;
LABEL_22:
  v12 = v26;
LABEL_23:
  if( v15 != -1 )
  {
    ExReleaseSpinLockSharedFromDpcLevel(SpinLock);
    __writecr8((unsigned __int8)v15);
  }
  if( v12 )
LABEL_26:
    VmpFaultEntryRemove((INT64)SpinLock, (UINT64)a2, (unsigned int)v9);
  return(unsigned int)updated;
}

Referenced by:

VmAccessFault