KiDeliverApc
VOID __stdcall KiDeliverApc(INT8 PreviousMode, _KTRAP_FRAME *ExceptionFrame, _KTRAP_FRAME *TrapFrame){
_ETHREAD *CurrentThread;
bool v6;
_KTRAP_FRAME *v7;
$F25F8C4BA33AF922A5F1AF68CD89DDDF *v8;
struct _KPRCB *CurrentPrcb;
_LIST_ENTRY *Flink;
_LIST_ENTRY *v11;
_LIST_ENTRY *v12;
_LIST_ENTRY *v13;
_LIST_ENTRY *v14;
_EPROCESS *Process;
_LIST_ENTRY *v16;
_LIST_ENTRY *v17;
_DWORD *SchedulerAssist;
_LIST_ENTRY *v19;
_LIST_ENTRY *v20;
struct _KPRCB *v21;
unsigned __int8 UserApcPendingAll;
_LIST_ENTRY *v23;
_LIST_ENTRY *v24;
_LIST_ENTRY *v25;
_LIST_ENTRY *v26;
unsigned __int8 v27;
int v28;
_DWORD *v29;
unsigned __int8 v30;
_LIST_ENTRY *v31;
int v32[8];
VOID *NormalContext;
VOID *v34;
VOID *NormalRoutine;
VOID *v36;
VOID *v37;
VOID *Blink;
_LIST_ENTRY *v39;
PVOID BugCheckParameter1;
UINT64 SpinCount;
UINT64 v43;
Blink = 0i64;
NormalRoutine = 0i64;
v37 = 0i64;
v36 = 0i64;
if( TrapFrame )
KiCheckForSListAddress(TrapFrame);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v6 = CurrentThread->Tcb.SpecialApcDisable == 0;
v7 = CurrentThread->Tcb.TrapFrame;
BugCheckParameter1 = CurrentThread->Tcb.ApcState.Process;
CurrentThread->Tcb.TrapFrame = TrapFrame;
CurrentThread->Tcb.ApcState.KernelApcPending = 0;
if( v6 )
{
_InterlockedOr(v32, 0);
v8 = &CurrentThread->Tcb.152;
while( ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v8->ApcState.ApcListHead[0].Flink != v8 )
{
KeGetCurrentIrql();
__writecr8(2ui64);
CurrentPrcb = KeGetCurrentPrcb();
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&CurrentThread->Tcb.ThreadLock, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( CurrentThread->Tcb.ThreadLock );
SchedulerAssist = CurrentPrcb->SchedulerAssist;
if( SchedulerAssist && CurrentPrcb->NestingLevel <= 1u )
++SchedulerAssist[6];
}
Flink = v8->ApcState.ApcListHead[0].Flink;
if( ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v8->ApcState.ApcListHead[0].Flink == v8 )
{
KiReleaseThreadLockSafe((INT64)CurrentThread);
__writecr8(1ui64);
break;
}
CurrentThread->Tcb.ApcState.KernelApcPending = 0;
v11 = Flink - 1;
_m_prefetchw(&Flink[-1]);
v12 = Flink[1].Flink;
NormalRoutine = Flink[2].Flink;
Blink = Flink[2].Blink;
v37 = Flink[3].Flink;
v36 = Flink[3].Blink;
if( NormalRoutine )
{
if( CurrentThread->Tcb.ApcState.InProgressFlags || CurrentThread->Tcb.KernelApcDisable )
{
KiReleaseThreadLockSafe((INT64)CurrentThread);
__writecr8(1ui64);
goto LABEL_14;
}
v16 = Flink->Flink;
v17 = Flink->Blink;
if( Flink->Flink->Blink != Flink || v17->Flink != Flink )
goto LABEL_58;
v17->Flink = v16;
v16->Blink = v17;
BYTE2(v11[5].Flink) = 0;
KiReleaseThreadLockSafe((INT64)CurrentThread);
__writecr8(1ui64);
CurrentThread->Tcb.ApcState.InProgressFlags = 1;
((void(__fastcall *)(_LIST_ENTRY *, VOID **, VOID **, VOID **, VOID **))v12)(
v11,
&NormalRoutine,
&Blink,
&v37,
&v36);
if( NormalRoutine )
{
__writecr8(0i64);
((void(__fastcall *)(VOID *, VOID *, VOID *))NormalRoutine)(Blink, v37, v36);
KeGetCurrentIrql();
__writecr8(1ui64);
}
CurrentThread->Tcb.ApcState.InProgressFlags = 0;
}
else
{
v13 = Flink->Flink;
v14 = Flink->Blink;
if( Flink->Flink->Blink != Flink || v14->Flink != Flink )
goto LABEL_58;
v14->Flink = v13;
v13->Blink = v14;
BYTE2(v11[5].Flink) = 0;
CurrentThread->Tcb.ThreadLock = 0i64;
__writecr8(1ui64);
CurrentThread->Tcb.ApcState.InProgressFlags |= 2u;
((void(__fastcall *)(_LIST_ENTRY *, VOID **, VOID **, VOID **, VOID **))v12)(
v11,
&NormalRoutine,
&Blink,
&v37,
&v36);
CurrentThread->Tcb.ApcState.InProgressFlags &= ~2u;
}
}
if( PreviousMode == 1 )
{
v19 = &CurrentThread->Tcb.ApcState.ApcListHead[1];
if( v19->Flink != v19 )
{
v39 = 0i64;
v20 = 0i64;
NormalRoutine = 0i64;
Blink = 0i64;
v37 = 0i64;
v36 = 0i64;
KeGetCurrentIrql();
__writecr8(2ui64);
v21 = KeGetCurrentPrcb();
LODWORD(v43) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&CurrentThread->Tcb.ThreadLock, 0i64) )
{
do
KeYieldProcessorEx(&v43);
while( CurrentThread->Tcb.ThreadLock );
v29 = v21->SchedulerAssist;
if( v29 && v21->NestingLevel <= 1u )
++v29[6];
}
UserApcPendingAll = CurrentThread->Tcb.ApcState.UserApcPendingAll;
CurrentThread->Tcb.ApcState.UserApcPendingAll = UserApcPendingAll & 0xFD;
v23 = v19->Flink;
if( v19->Flink == v19 )
{
v24 = 0i64;
}
else
{
while( 1 )
{
v20 = v23 - 1;
_m_prefetchw(&v23[-1]);
if( (UINT8(__stdcall *)(_KAPC *, INT64 *, INT64 *, VOID **, INT64))v23[1].Flink == KeSpecialUserApcKernelRoutine
|| (UserApcPendingAll & 2) != 0 )
{
break;
}
v23 = v23->Flink;
v20 = 0i64;
if( v23 == v19 )
{
v24 = v39;
goto LABEL_36;
}
}
v24 = v23[1].Flink;
NormalRoutine = v20[3].Flink;
Blink = v20[3].Blink;
v37 = v20[4].Flink;
v36 = v20[4].Blink;
v25 = v23->Flink;
v26 = v23->Blink;
if( v23->Flink->Blink != v23 || v26->Flink != v23 )
LABEL_58:
__fastfail(3u);
v26->Flink = v25;
v25->Blink = v26;
BYTE2(v20[5].Flink) = 0;
v27 = CurrentThread->Tcb.ApcState.UserApcPendingAll;
if( (v27 & 1) != 0 )
{
v30 = v27 & 0xFE;
CurrentThread->Tcb.ApcState.UserApcPendingAll = v30;
v31 = v19->Flink;
if( v19->Flink != v19 )
{
while( (UINT8(__stdcall *)(_KAPC *, INT64 *, INT64 *, VOID **, INT64))v31[1].Flink != KeSpecialUserApcKernelRoutine )
{
v31 = v31->Flink;
if( v31 == v19 )
goto LABEL_36;
}
CurrentThread->Tcb.ApcState.UserApcPendingAll = v30 | 1;
}
}
}
LABEL_36:
KiReleaseThreadLockSafe((INT64)CurrentThread);
__writecr8(1ui64);
if( v20 )
{
((void(__fastcall *)(_LIST_ENTRY *, VOID **, VOID **, VOID **, VOID **))v24)(
v20,
&NormalRoutine,
&Blink,
&v37,
&v36);
if( (UserApcPendingAll & 2) == 0 )
{
v28 = 0;
goto LABEL_40;
}
if( NormalRoutine )
{
v28 = 1;
LABEL_40:
LODWORD(NormalContext) = v28;
KiInitializeUserApc(
(_KEXCEPTION_FRAME *)ExceptionFrame,
TrapFrame,
NormalRoutine,
Blink,
v37,
v36,
NormalContext,
v34,
NormalRoutine,
(INT64)v36,
(INT64)v37);
goto LABEL_14;
}
KeTestAlertThread(1);
}
}
}
}
LABEL_14:
Process = CurrentThread->Tcb.ApcState.Process;
if( Process != BugCheckParameter1 )
KeBugCheckEx(
5u,
BugCheckParameter1,
Process,
(PVOID)CurrentThread->Tcb.ApcStateIndex,
(PVOID)(KeGetPcr()->Prcb._bf_0 & 0x10001));
CurrentThread->Tcb.TrapFrame = v7;
}Referenced by:
KeBoostPriorityThread
KeCpuSetReportParkedProcessors
KeRecomputeCpuSetAffinityProcess
KeRemoveQueueEx
KeSetAffinityThread
KeSetBasePriorityThread
KeSetCpuSetsProcess
KeSetLegacyAffinityThread
KeSetSchedulingGroupRankBias
KeSetSelectedCpuSetsThread
KeSetThreadSchedulerAssist
KeUpdateThreadCpuSets
KeWaitForMultipleObjects
KeWaitForSingleObject
KiAbForceProcessLockEntry
KiAbThreadUnboostCpuPriority
KiApcInterrupt
KiBeginThreadWait
KiCheckForKernelApcDelivery
KiCheckForThreadDispatch
KiContinueEx
KiExitDispatcher
KiExitThreadWait
KiInitiateUserApc
KiParkUmsThread
KiProcessDeferredReadyList
KiReadyOutSwappedThreads
KiSchedulerApc
KiSetHeteroPolicyThread
KiSwapThread
PsImpersonateContainerOfThread