PspProcessDynamicEnforcedAddressRanges

INT64 __stdcall PspProcessDynamicEnforcedAddressRanges(_EPROCESS *PROCESS, INT64 a2){
  __int64 v2; 
  unsigned __int16 v3; 
  volatile INT64 *v4; 
  unsigned int v5; 
  char v6; 
  unsigned int v7; 
  __int64 v8; 
  struct _EX_RUNDOWN_REF *v10; 
  unsigned int v11; 
  unsigned int v12; 
  unsigned int v13; 
  bool v14; 
  _ETHREAD *v15; 
  _DWORD *v16; 
  unsigned __int64 v17; 
  __int64 v18; 
  int *v19; 
  int v20; 
  INT64 v21; 
  INT64 v22; 
  int v23; 
  unsigned int v25; 
  struct _EX_RUNDOWN_REF *v26; 
  _ETHREAD *CurrentThread; 
  _EPROCESS *v29; 
  struct _KAPC_STATE ApcState; 
  unsigned int *v31; 
  v4 = (volatile INT64 *)(a2 + 8);
  memset(&ApcState, 0, sizeof(ApcState));
  v5 = 0;
  v6 = 0;
  v7 = v3;
  v8 = v2;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v25 = 0;
  v29 = (_EPROCESS *)*((_QWORD *)CurrentThread + 23);
  --*((_WORD *)CurrentThread + 242);
  v10 = (struct _EX_RUNDOWN_REF *)((char *)PROCESS + 1112);
  v26 = (struct _EX_RUNDOWN_REF *)((char *)PROCESS + 1112);
  if( ExAcquireRundownProtection((PEX_RUNDOWN_REF)PROCESS + 139) )
  {
    v12 = 0;
    v13 = v7;
    v14 = v7 == 0;
    v6 = 2;
    v15 = CurrentThread;
    if( v14 )
    {
LABEL_13:
      if( PROCESS != v29 )
      {
        KeStackAttachProcess((PRKPROCESS)PROCESS, &ApcState);
        v6 = 3;
      }
      v6 |= 4u;
      ExAcquirePushLockExclusiveEx((UINT64)v4, 0i64);
      if( v13 )
      {
        v19 = (int *)(v8 + 16);
        while( 1 )
        {
          if( (*((_DWORD *)v15 + 324) & 1) != 0 )
          {
            v11 = -1073741749;
            goto LABEL_34;
          }
          if( (*((_DWORD *)PROCESS + 281) & 0x40000008) != 0 )
          {
            v11 = -1073741558;
            goto LABEL_34;
          }
          v20 = *v19;
          v21 = *((_QWORD *)v19 - 2);
          v22 = *((_QWORD *)v19 - 1);
          v23 = (*v19 & 1) != 0 ? RtlAddDynamicEnforcedAddressRange((RTL_BALANCED_NODE **)a2, v21, v22) : RtlRemoveDynamicEnforcedAddressRange((RTL_BALANCED_NODE **)a2, v21, v22);
          v11 = v23;
          if( v23 < 0 )
            break;
          *v19 = v20 | 2;
          v19 += 6;
          v5 = v25 + 1;
          v25 = v5;
          if( v5 >= v13 )
            goto LABEL_32;
          v15 = CurrentThread;
        }
        v5 = v25;
      }
      else
      {
LABEL_32:
        v11 = 0;
      }
LABEL_34:
      if( (_InterlockedExchangeAdd64(v4, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock(v4);
      KeAbPostRelease((PVOID)v4);
    }
    else
    {
      v16 = (_DWORD *)(v8 + 16);
      while( (*((_DWORD *)CurrentThread + 324) & 1) == 0 )
      {
        if( (*((_DWORD *)PROCESS + 281) & 0x40000008) != 0 )
        {
          v11 = -1073741558;
          goto LABEL_37;
        }
        v17 = *((_QWORD *)v16 - 2);
        v18 = *((_QWORD *)v16 - 1);
        if( v18 + v17 < v17 )
        {
          v11 = -1073741675;
          goto LABEL_37;
        }
        if( v17 - 0x10000 > 0x7FFFFFFDFFFFi64 || v18 + v17 - 0x10000 > 0x7FFFFFFDFFFFi64 || !v18 )
        {
          v11 = -1073741503;
          goto LABEL_37;
        }
        if( (*v16 & 0xFFFFFFFE) != 0 )
        {
          v11 = -1073741811;
          goto LABEL_37;
        }
        ++v12;
        v16 += 6;
        if( v12 >= v13 )
          goto LABEL_13;
      }
      v11 = -1073741749;
    }
LABEL_37:
    v10 = v26;
  }
  else
  {
    v11 = -1073741558;
  }
  if( (v6 & 1) != 0 )
    KeUnstackDetachProcess(&ApcState);
  if( (v6 & 2) != 0 )
    ExReleaseRundownProtection(v10);
  KeLeaveCriticalRegion();
  *v31 = v5;
  return v11;
}

Referenced by:

NtSetInformationProcess