VmpAccessFaultBatch

NTSTATUS __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 v13; 
  int updated; 
  __int64 v15; 
  __int64 v16; 
  int v17; 
  _RTL_BALANCED_NODE *v18; 
  _RTL_BALANCED_NODE **v19; 
  unsigned __int64 v20; 
  __int64 *v21; 
  __int64 v22; 
  __int64 v23; 
  INT64 v25; 
  int v26; 

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

Referenced by:

VmAccessFault