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