KiDeliverApc

VOID __stdcall KiDeliverApc(CHAR PreviousMode, _KEXCEPTION_FRAME *ExceptionFrame, _KTRAP_FRAME *TrapFrame){
  _ETHREAD *CurrentThread; 
  bool v6; 
  __int64 v7; 
  _QWORD **v8; 
  struct _KPRCB *CurrentPrcb; 
  _QWORD *v10; 
  _QWORD *v11; 
  void(__fastcall *v12)(_QWORD *, void(__fastcall **)(__int64, __int64, __int64), __int64 *, __int64 *, __int64 *); 
  __int64 v13; 
  _QWORD *v14; 
  ULONG_PTR v15; 
  __int64 v16; 
  _QWORD *v17; 
  __int64 v18; 
  _QWORD **v19; 
  _QWORD *v20; 
  struct _KPRCB *v21; 
  char v22; 
  _QWORD *v23; 
  void(__fastcall *v24)(_QWORD *, void(__fastcall **)(__int64, __int64, __int64), __int64 *, __int64 *, __int64 *); 
  _QWORD *v25; 
  _QWORD *v26; 
  char v27; 
  char v28; 
  __int64 v29; 
  char v30; 
  _QWORD *v31; 
  int v32[8]; 
  void(__fastcall *v33)(__int64, __int64, __int64); 
  __int64 v34; 
  __int64 v35; 
  __int64 v36; 
  void(__fastcall *v37)(_QWORD *, void(__fastcall **)(__int64, __int64, __int64), __int64 *, __int64 *, __int64 *); 
  ULONG_PTR BugCheckParameter1; 
  UINT64 SpinCount; 
  UINT64 v41; 
  v36 = 0i64;
  v33 = 0i64;
  v35 = 0i64;
  v34 = 0i64;
  if( TrapFrame )
    KiCheckForSListAddress(TrapFrame);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v6 = *((_WORD *)CurrentThread + 243) == 0;
  v7 = *((_QWORD *)CurrentThread + 18);
  BugCheckParameter1 = *((_QWORD *)CurrentThread + 23);
  *((_QWORD *)CurrentThread + 18) = TrapFrame;
  *((_BYTE *)CurrentThread + 193) = 0;
  if( v6 )
  {
    _InterlockedOr(v32, 0);
    v8 = (_QWORD **)((char *)CurrentThread + 152);
    while( *v8 != v8 )
    {
      KeGetCurrentIrql();
      __writecr8(2ui64);
      CurrentPrcb = KeGetCurrentPrcb();
      LODWORD(SpinCount) = 0;
      while( _interlockedbittestandset64((volatile signed __int32 *)CurrentThread + 16, 0i64) )
      {
        do
          KeYieldProcessorEx(&SpinCount);
        while( *((_QWORD *)CurrentThread + 8) );
        v18 = *((_QWORD *)CurrentPrcb + 4247);
        if( v18 && *((_BYTE *)CurrentPrcb + 32) <= 1u )
          ++*(_DWORD *)(v18 + 24);
      }
      v10 = *v8;
      if( *v8 == v8 )
      {
        KiReleaseThreadLockSafe((INT64)CurrentThread);
        __writecr8(1ui64);
        break;
      }
      *((_BYTE *)CurrentThread + 193) = 0;
      v11 = v10 - 2;
      _m_prefetchw(v10 - 2);
      v12 = (void(__fastcall *)(_QWORD *, void(__fastcall **)(__int64, __int64, __int64), __int64 *, __int64 *, __int64 *))v10[2];
      v33 = (void(__fastcall *)(__int64, __int64, __int64))v10[4];
      v36 = v10[5];
      v35 = v10[6];
      v34 = v10[7];
      if( v33 )
      {
        if( *((_BYTE *)CurrentThread + 192) || *((_WORD *)CurrentThread + 242) )
        {
          KiReleaseThreadLockSafe((INT64)CurrentThread);
          __writecr8(1ui64);
          goto LABEL_14;
        }
        v16 = *v10;
        v17 = (_QWORD *)v10[1];
        if( *(_QWORD **)(*v10 + 8i64) != v10 || (_QWORD *)*v17 != v10 )
          goto LABEL_58;
        *v17 = v16;
        *(_QWORD *)(v16 + 8) = v17;
        *((_BYTE *)v11 + 82) = 0;
        KiReleaseThreadLockSafe((INT64)CurrentThread);
        __writecr8(1ui64);
        *((_BYTE *)CurrentThread + 192) = 1;
        v12(v11, &v33, &v36, &v35, &v34);
        if( v33 )
        {
          __writecr8(0i64);
          v33(v36, v35, v34);
          KeGetCurrentIrql();
          __writecr8(1ui64);
        }
        *((_BYTE *)CurrentThread + 192) = 0;
      }
      else
      {
        v13 = *v10;
        v14 = (_QWORD *)v10[1];
        if( *(_QWORD **)(*v10 + 8i64) != v10 || (_QWORD *)*v14 != v10 )
          goto LABEL_58;
        *v14 = v13;
        *(_QWORD *)(v13 + 8) = v14;
        *((_BYTE *)v11 + 82) = 0;
        *((_QWORD *)CurrentThread + 8) = 0i64;
        __writecr8(1ui64);
        *((_BYTE *)CurrentThread + 192) |= 2u;
        v12(v11, &v33, &v36, &v35, &v34);
        *((_BYTE *)CurrentThread + 192) &= ~2u;
      }
    }
    if( PreviousMode == 1 )
    {
      v19 = (_QWORD **)((char *)CurrentThread + 168);
      if( *v19 != v19 )
      {
        v37 = 0i64;
        v20 = 0i64;
        v33 = 0i64;
        v36 = 0i64;
        v35 = 0i64;
        v34 = 0i64;
        KeGetCurrentIrql();
        __writecr8(2ui64);
        v21 = KeGetCurrentPrcb();
        LODWORD(v41) = 0;
        while( _interlockedbittestandset64((volatile signed __int32 *)CurrentThread + 16, 0i64) )
        {
          do
            KeYieldProcessorEx(&v41);
          while( *((_QWORD *)CurrentThread + 8) );
          v29 = *((_QWORD *)v21 + 4247);
          if( v29 && *((_BYTE *)v21 + 32) <= 1u )
            ++*(_DWORD *)(v29 + 24);
        }
        v22 = *((_BYTE *)CurrentThread + 194);
        *((_BYTE *)CurrentThread + 194) = v22 & 0xFD;
        v23 = *v19;
        if( *v19 == v19 )
        {
          v24 = 0i64;
        }
        else
        {
          while( 1 )
          {
            v20 = v23 - 2;
            _m_prefetchw(v23 - 2);
            if( (UINT8(__fastcall *)(KAPC *, INT64 *, INT64 *, PVOID *, INT64))v23[2] == KeSpecialUserApcKernelRoutine
              || (v22 & 2) != 0 )
            {
              break;
            }
            v23 = (_QWORD *)*v23;
            v20 = 0i64;
            if( v23 == v19 )
            {
              v24 = v37;
              goto LABEL_36;
            }
          }
          v24 = (void(__fastcall *)(_QWORD *, void(__fastcall **)(__int64, __int64, __int64), __int64 *, __int64 *, __int64 *))v23[2];
          v33 = (void(__fastcall *)(__int64, __int64, __int64))v20[6];
          v36 = v20[7];
          v35 = v20[8];
          v34 = v20[9];
          v25 = (_QWORD *)*v23;
          v26 = (_QWORD *)v23[1];
          if( *(_QWORD **)(*v23 + 8i64) != v23 || (_QWORD *)*v26 != v23 )
LABEL_58:
            __fastfail(3u);
          *v26 = v25;
          v25[1] = v26;
          *((_BYTE *)v20 + 82) = 0;
          v27 = *((_BYTE *)CurrentThread + 194);
          if( (v27 & 1) != 0 )
          {
            v30 = v27 & 0xFE;
            *((_BYTE *)CurrentThread + 194) = v30;
            v31 = *v19;
            if( *v19 != v19 )
            {
              while( (UINT8(__fastcall *)(KAPC *, INT64 *, INT64 *, PVOID *, INT64))v31[2] != KeSpecialUserApcKernelRoutine )
              {
                v31 = (_QWORD *)*v31;
                if( v31 == v19 )
                  goto LABEL_36;
              }
              *((_BYTE *)CurrentThread + 194) = v30 | 1;
            }
          }
        }
LABEL_36:
        KiReleaseThreadLockSafe((INT64)CurrentThread);
        __writecr8(1ui64);
        if( v20 )
        {
          v24(v20, &v33, &v36, &v35, &v34);
          if( (v22 & 2) == 0 )
          {
            v28 = 0;
            goto LABEL_40;
          }
          if( v33 )
          {
            v28 = 1;
LABEL_40:
            KiInitializeUserApc((__int64)ExceptionFrame, (__int64)TrapFrame, (__int64)v33, v36, v35, v34, v28);
            goto LABEL_14;
          }
          KeTestAlertThread(1);
        }
      }
    }
  }
LABEL_14:
  v15 = *((_QWORD *)CurrentThread + 23);
  if( v15 != BugCheckParameter1 )
    KeBugCheckEx(
      5u,
      BugCheckParameter1,
      v15,
      *((unsigned __int8 *)CurrentThread + 586),
      *((_DWORD *)KeGetPcr() + 3243) & 0x10001);
  *((_QWORD *)CurrentThread + 18) = v7;
}

Referenced by:

KeBoostPriorityThread
KeCpuSetReportParkedProcessors
KeRecomputeCpuSetAffinityProcess
KeRemoveQueueEx
KeSetAffinityThread
KeSetBasePriorityThread
KeSetCpuSetsProcess
KeSetLegacyAffinityThread
KeSetSchedulingGroupRankBias
KeSetSelectedCpuSetsThread
KeSetThreadSchedulerAssist
KeUpdateThreadCpuSets
KeWaitForMultipleObjects
KeWaitForSingleObject
KiAbForceProcessLockEntry
KiAbThreadUnboostCpuPriority
KiApcInterrupt
KiBeginThreadWait
KiCheckForThreadDispatch
KiContinueEx
KiExitDispatcher
KiExitThreadWait
KiInitiateUserApc
KiParkUmsThread
KiProcessDeferredReadyList
KiReadyOutSwappedThreads
KiSchedulerApc
KiSetHeteroPolicyThread
KiSwapThread
PsImpersonateContainerOfThread