KiMoveApcState

VOID __stdcall KiMoveApcState(_KAPC_STATE *Source, _KAPC_STATE *Destination){
  _KAPC_STATE *Flink; 
  _KAPC_STATE *v4; 
  _LIST_ENTRY *v5; 
  _LIST_ENTRY *Blink; 
  _LIST_ENTRY *v7; 

  Destination->Process = Source->Process;
  Destination->InProgressFlags = Source->InProgressFlags;
  Destination->KernelApcPending = Source->KernelApcPending;
  Destination->UserApcPendingAll = Source->UserApcPendingAll;
  Flink = (_KAPC_STATE *)Source->ApcListHead[0].Flink;
  if( Flink == Source )
  {
    Destination->ApcListHead[0].Blink = (_LIST_ENTRY *)Destination;
    Destination->ApcListHead[0].Flink = (_LIST_ENTRY *)Destination;
    Destination->KernelApcPending = 0;
  }
  else
  {
    Blink = Source->ApcListHead[0].Blink;
    Destination->ApcListHead[0].Flink = (_LIST_ENTRY *)Flink;
    Destination->ApcListHead[0].Blink = Blink;
    Flink->ApcListHead[0].Blink = (_LIST_ENTRY *)Destination;
    Blink->Flink = (_LIST_ENTRY *)Destination;
  }
  v4 = (_KAPC_STATE *)Source->ApcListHead[1].Flink;
  v5 = &Destination->ApcListHead[1];
  if( v4 == (_KAPC_STATE *)&Source->ApcListHead[1] )
  {
    Destination->ApcListHead[1].Blink = &Destination->ApcListHead[1];
    v5->Flink = v5;
    Destination->UserApcPendingAll = 0;
  }
  else
  {
    v7 = Source->ApcListHead[1].Blink;
    v5->Flink = (_LIST_ENTRY *)v4;
    Destination->ApcListHead[1].Blink = v7;
    v4->ApcListHead[0].Blink = v5;
    v7->Flink = v5;
  }
}

Referenced by:

KiDetachProcess
KiUnstackDetachProcess