PspProcessDynamicEHContinuationTargets

INT64 __stdcall PspProcessDynamicEHContinuationTargets(PVOID BugCheckParameter1){
  _QWORD *v1; 
  unsigned __int16 v2; 
  unsigned int *v3; 
  unsigned int v4; 
  char v5; 
  unsigned int v6; 
  _ETHREAD *CurrentThread; 
  _QWORD *v8; 
  PVOID v10; 
  int v11; 
  unsigned int v12; 
  _QWORD *v13; 
  __int64 *v14; 
  __int64 v15; 
  __int64 **v16; 
  __int64 *v17; 
  UINT64 v18; 
  int v19; 
  unsigned int v21; 
  unsigned int v22; 
  _ETHREAD *v23; 
  struct _EX_RUNDOWN_REF *RunRef; 
  unsigned int *v25; 
  _KAPC_STATE ApcState; 
  v25 = v3;
  memset(&ApcState, 0, sizeof(ApcState));
  v4 = 0;
  v5 = 0;
  v6 = v2;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v8 = v1;
  v21 = 0;
  v23 = CurrentThread;
  v10 = (PVOID)*((_QWORD *)CurrentThread + 23);
  --*((_WORD *)CurrentThread + 242);
  RunRef = (struct _EX_RUNDOWN_REF *)((char *)BugCheckParameter1 + 1112);
  if( ExAcquireRundownProtection((PEX_RUNDOWN_REF)BugCheckParameter1 + 139) )
  {
    v12 = 0;
    v22 = v6;
    v5 = 2;
    if( v6 )
    {
      v13 = v8;
      while( (*((_DWORD *)CurrentThread + 324) & 1) == 0 )
      {
        if( (*((_DWORD *)BugCheckParameter1 + 281) & 0x40000008) != 0 )
          goto LABEL_2;
        if( (unsigned __int64)(*v13 - 0x10000i64) > 0x7FFFFFFDFFFFi64 )
        {
          v11 = -1073741503;
          goto LABEL_38;
        }
        if( (v13[1] & 0xFFFFFFFFFFFFFFFEui64) != 0 )
        {
          v11 = -1073741811;
          goto LABEL_38;
        }
        ++v12;
        v13 += 2;
        if( v12 >= v6 )
          goto LABEL_10;
      }
      v11 = -1073741749;
    }
    else
    {
LABEL_10:
      if( BugCheckParameter1 != v10 )
      {
        KiStackAttachProcess((_KPROCESS *)BugCheckParameter1, 0i64, &ApcState);
        v5 = 3;
      }
      v5 |= 4u;
      ExAcquirePushLockExclusiveEx((UINT64)BugCheckParameter1 + 2568, 0i64);
      if( v6 )
      {
        v14 = v8 + 1;
        while( (*((_DWORD *)CurrentThread + 324) & 1) == 0 )
        {
          if( (*((_DWORD *)BugCheckParameter1 + 281) & 0x40000008) != 0 )
          {
            v11 = -1073741558;
            goto LABEL_35;
          }
          v15 = *v14;
          v16 = (__int64 **)((char *)BugCheckParameter1 + 2560);
          if( (*v14 & 1) != 0 )
          {
            v11 = RtlAddDynamicEHContinuationTarget((unsigned __int64 *)BugCheckParameter1 + 320, *(v14 - 1));
          }
          else
          {
            v17 = *v16;
            if( !*v16 )
              goto LABEL_33;
            v18 = *(v14 - 1);
            do
            {
              v19 = MiHotPatchImageTreeCompare(v18, (INT64)v17);
              if( v19 >= 0 )
              {
                if( v19 <= 0 )
                  break;
                v17 = (__int64 *)v17[1];
              }
              else
              {
                v17 = (__int64 *)*v17;
              }
            }
            while( v17 );
            if( !v17 )
            {
LABEL_33:
              v11 = -1073741275;
LABEL_34:
              v4 = v21;
              goto LABEL_35;
            }
            RtlAvlRemoveNode((unsigned __int64 *)BugCheckParameter1 + 320, v17);
            ExFreePoolWithTag(v17, 0);
            v11 = 0;
          }
          if( v11 < 0 )
            goto LABEL_34;
          *v14 = v15 | 2;
          v14 += 2;
          v4 = v21 + 1;
          v21 = v4;
          if( v4 >= v22 )
            goto LABEL_45;
          CurrentThread = v23;
        }
        v11 = -1073741749;
      }
      else
      {
LABEL_45:
        v11 = 0;
      }
LABEL_35:
      if( (_InterlockedExchangeAdd64((volatile signed __int64 *)BugCheckParameter1 + 321, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock((volatile INT64 *)BugCheckParameter1 + 321);
      KeAbPostRelease((char *)BugCheckParameter1 + 2568);
    }
  }
  else
  {
LABEL_2:
    v11 = -1073741558;
  }
LABEL_38:
  if( (v5 & 1) != 0 )
    KiUnstackDetachProcess(&ApcState, 0i64);
  if( (v5 & 2) != 0 )
    ExReleaseRundownProtection(RunRef);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  *v25 = v4;
  return(unsigned int)v11;
}

Referenced by:

NtSetInformationProcess