KiInsertQueueApc
VOID __stdcall KiInsertQueueApc(_KAPC *Apc){
_ETHREAD *Thread;
__int64 v2;
char *v3;
__int64 ApcMode;
_LIST_ENTRY *v5;
_LIST_ENTRY *v6;
_LIST_ENTRY *Blink;
VOID(__stdcall *KernelRoutine)();
_LIST_ENTRY *p_ApcListEntry;
_LIST_ENTRY *v10;
_LIST_ENTRY *Flink;
_LIST_ENTRY *v12;
_LIST_ENTRY *v13;
_LIST_ENTRY *v14;
_LIST_ENTRY *v15;
_LIST_ENTRY *i;
Thread = Apc->Thread;
if( !Apc->ApcStateIndex && *((_BYTE *)Thread + 586) )
{
v2 = 600i64;
}
else
{
Apc->ApcStateIndex = *((_BYTE *)Thread + 586);
v2 = 152i64;
}
v3 = (char *)Thread + v2;
ApcMode = Apc->ApcMode;
if( Apc->NormalRoutine )
{
if( !(_BYTE)ApcMode )
goto LABEL_6;
KernelRoutine = (VOID(__stdcall *)())Apc->KernelRoutine;
if( KernelRoutine == KiSchedulerApcTerminate )
{
*((_BYTE *)Thread + 194) |= 2u;
p_ApcListEntry = &Apc->ApcListEntry;
v10 = (_LIST_ENTRY *)&v3[16 * ApcMode];
Flink = v10->Flink;
if( v10->Flink->Blink != v10 )
goto LABEL_23;
p_ApcListEntry->Flink = Flink;
p_ApcListEntry->Blink = v10;
Flink->Blink = p_ApcListEntry;
v10->Flink = p_ApcListEntry;
return;
}
if( (char *)KernelRoutine != (char *)KeSpecialUserApcKernelRoutine )
{
LABEL_6:
v5 = &Apc->ApcListEntry;
v6 = (_LIST_ENTRY *)&v3[16 * ApcMode];
Blink = v6->Blink;
if( Blink->Flink == v6 )
{
v5->Flink = v6;
v5->Blink = Blink;
Blink->Flink = v5;
v6->Blink = v5;
return;
}
LABEL_23:
__fastfail(3u);
}
v15 = (_LIST_ENTRY *)&v3[16 * ApcMode];
for( i = v15->Flink; i != v15; i = i->Flink )
;
*((_BYTE *)Thread + 194) |= 1u;
}
else
{
v12 = (_LIST_ENTRY *)&v3[16 * ApcMode];
for( i = v12->Blink; i != v12 && i[2].Flink; i = i->Blink )
;
}
v13 = i->Flink;
v14 = &Apc->ApcListEntry;
if( i->Flink->Blink != i )
goto LABEL_23;
v14->Flink = v13;
v14->Blink = i;
v13->Blink = v14;
i->Flink = v14;
}Referenced by:
IopfCompleteRequest
KeInsertQueueApc
KeRequestTerminationThread
KeTryToInsertQueueApc
KiInsertDeferredPreemptionApc
KiSchedulerApc
KiSuspendThread