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