PspProcessDynamicEnforcedAddressRanges

NTSTATUS __fastcall PspProcessDynamicEnforcedAddressRanges(
        _EPROCESS *Process,
        _RTL_BALANCED_NODE **a2,
        INT64 a3,
        UINT16 a4,
        INT64 a5){
  _EX_PUSH_LOCK *v5; 
  unsigned int v6; 
  char v7; 
  unsigned int v8; 
  _EX_RUNDOWN_REF *p_RundownProtect; 
  NTSTATUS v12; 
  unsigned int v13; 
  unsigned int v14; 
  bool v15; 
  _ETHREAD *v16; 
  _DWORD *v17; 
  unsigned __int64 v18; 
  __int64 v19; 
  int *v20; 
  int v21; 
  _RTL_BALANCED_NODE *v22; 
  _RTL_BALANCED_NODE *v23; 
  NTSTATUS v24; 
  unsigned int v26; 
  _EX_RUNDOWN_REF *v27; 
  _ETHREAD *CurrentThread; 
  _EPROCESS *v30; 
  _KAPC_STATE ApcState; 

  v5 = (_EX_PUSH_LOCK *)(a2 + 1);
  memset(&ApcState, 0, sizeof(ApcState));
  v6 = 0;
  v7 = 0;
  v8 = a4;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v26 = 0;
  v30 = CurrentThread->Tcb.ApcState.Process;
  --CurrentThread->Tcb.KernelApcDisable;
  p_RundownProtect = &Process->RundownProtect;
  v27 = &Process->RundownProtect;
  if( ExAcquireRundownProtection(&Process->RundownProtect) )
  {
    v13 = 0;
    v14 = v8;
    v15 = v8 == 0;
    v7 = 2;
    v16 = CurrentThread;
    if( v15 )
    {
LABEL_13:
      if( Process != v30 )
      {
        KeStackAttachProcess(&Process->Pcb, &ApcState);
        v7 = 3;
      }
      v7 |= 4u;
      ExAcquirePushLockExclusiveEx(v5, 0i64);
      if( v14 )
      {
        v20 = (int *)(a3 + 16);
        while( 1 )
        {
          if( (v16->CrossThreadFlags & 1) != 0 )
          {
            v12 = -1073741749;
            goto LABEL_34;
          }
          if( (Process->Flags & 0x40000008) != 0 )
          {
            v12 = -1073741558;
            goto LABEL_34;
          }
          v21 = *v20;
          v22 = (_RTL_BALANCED_NODE *)*((_QWORD *)v20 - 2);
          v23 = (_RTL_BALANCED_NODE *)*((_QWORD *)v20 - 1);
          v24 = (*v20 & 1) != 0 ? RtlAddDynamicEnforcedAddressRange(a2, v22, v23) : RtlRemoveDynamicEnforcedAddressRange(
                                                                                      a2,
                                                                                      (INT64)v22,
                                                                                      (INT64)v23);
          v12 = v24;
          if( v24 < 0 )
            break;
          *v20 = v21 | 2;
          v20 += 6;
          v6 = v26 + 1;
          v26 = v6;
          if( v6 >= v14 )
            goto LABEL_32;
          v16 = CurrentThread;
        }
        v6 = v26;
      }
      else
      {
LABEL_32:
        v12 = 0;
      }
LABEL_34:
      if( (_InterlockedExchangeAdd64(&v5->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock(v5);
      KeAbPostRelease(v5);
    }
    else
    {
      v17 = (_DWORD *)(a3 + 16);
      while( (CurrentThread->CrossThreadFlags & 1) == 0 )
      {
        if( (Process->Flags & 0x40000008) != 0 )
        {
          v12 = -1073741558;
          goto LABEL_37;
        }
        v18 = *((_QWORD *)v17 - 2);
        v19 = *((_QWORD *)v17 - 1);
        if( v19 + v18 < v18 )
        {
          v12 = -1073741675;
          goto LABEL_37;
        }
        if( v18 - 0x10000 > 0x7FFFFFFDFFFFi64 || v19 + v18 - 0x10000 > 0x7FFFFFFDFFFFi64 || !v19 )
        {
          v12 = -1073741503;
          goto LABEL_37;
        }
        if( (*v17 & 0xFFFFFFFE) != 0 )
        {
          v12 = -1073741811;
          goto LABEL_37;
        }
        ++v13;
        v17 += 6;
        if( v13 >= v14 )
          goto LABEL_13;
      }
      v12 = -1073741749;
    }
LABEL_37:
    p_RundownProtect = v27;
  }
  else
  {
    v12 = -1073741558;
  }
  if( (v7 & 1) != 0 )
    KeUnstackDetachProcess(&ApcState);
  if( (v7 & 2) != 0 )
    ExReleaseRundownProtection(p_RundownProtect);
  KeLeaveCriticalRegion();
  *(_DWORD *)a5 = v6;
  return v12;
}

Referenced by:

NtSetInformationProcess