KeTryToInsertQueueApc
UINT8 __stdcall KeTryToInsertQueueApc(_KAPC *Apc, PVOID SystemArgument1, PVOID SystemArgument2){
_ETHREAD *Thread;
UINT8 v7;
UINT8 CurrentIrql;
_KPRCB *CurrentPrcb;
UINT8 v10;
char v12;
Thread = Apc->Thread;
v7 = 0;
if( !KeIsThreadRunning((__int64)Thread) )
return 0;
CurrentIrql = ObGetCurrentIrql();
CurrentPrcb = KeGetCurrentPrcb();
v10 = CurrentIrql;
if( !KiTryToAcquireThreadLock((__int64)Thread, &v12) )
return 0;
if( (*((_DWORD *)Thread + 29) & 0x4000) != 0 && !Apc->Inserted )
{
v7 = 1;
Apc->SystemArgument1 = SystemArgument1;
Apc->Inserted = 1;
Apc->SystemArgument2 = SystemArgument2;
KiInsertQueueApc(Apc);
KiSignalThreadForApc(CurrentPrcb, Apc, v10);
}
KiReleaseThreadLockSafe((INT64)Thread);
return v7;
}Referenced by:
EtwpCovSampCaptureQueueApc
EtwpQueueStackWalkApc