EtwpQueueStackWalkApc
VOID __stdcall EtwpQueueStackWalkApc(
_ETHREAD *Thread,
UINT8 CurrentIrql,
UINT64 LoggerId,
_LARGE_INTEGER *RelatedTimeStamp){
char v4;
_KAPC *v5;
unsigned int v10;
INT64 HighPart;
INT64 LowPart;
INT8 inserted;
int v14;
v4 = 0;
v5 = 0i64;
if( Thread != (_ETHREAD *)KeGetCurrentThread() )
return;
if( Thread->Tcb.Process->Pcb.FreezeCount + (((unsigned __int32)Thread->Tcb.Process->Pcb._bf_0 >> 3) & 1) )
return;
if( Thread->Tcb.SuspendCount )
return;
v10 = (*(_WORD *)(LoggerId + 834) & 7) + 24;
if( _interlockedbittestandset((volatile signed __int32 *)&Thread->Tcb.116 + 1, v10) )
return;
if( (Thread->Tcb._bf_0 & 0x4000) == 0 )
goto LABEL_15;
if( !ExAcquireRundownProtectionCacheAwareEx(
*(_QWORD *)(*(_QWORD *)(*(_QWORD *)(LoggerId + 1080) + 448i64) + 8i64 * *(unsigned int *)LoggerId),
1i64) )
goto LABEL_15;
v4 = 1;
v5 = (_KAPC *)RtlpInterlockedPopEntrySList((PSLIST_HEADER)(LoggerId + 928));
if( !v5 )
goto LABEL_15;
KeInitializeApc(
(INT64)v5,
(INT64)Thread,
0i64,
(INT64)EtwpStackWalkApc,
(INT64)EtwpCancelStackWalkApc,
(INT64)EtwpStackWalkApc,
0,
LoggerId);
if( !*(_DWORD *)(LoggerId + 336) )
goto LABEL_15;
HighPart = (unsigned int)RelatedTimeStamp->anonymous_0.HighPart;
LowPart = RelatedTimeStamp->anonymous_0.LowPart;
if( CurrentIrql <= 2u )
inserted = KeInsertQueueApc((INT64)v5, LowPart, HighPart, 0i64);
else
KeTryToInsertQueueApc(v5, (VOID *)LowPart, (VOID *)HighPart);
if( !*(_DWORD *)(LoggerId + 336) )
{
if( inserted && !KeRemoveQueueApc((INT64)v5) )
return;
goto LABEL_15;
}
if( !inserted )
{
if( CurrentIrql > 2u )
EtwpQueueStackWalkDpc(Thread, LoggerId, RelatedTimeStamp);
LABEL_15:
_interlockedbittestandreset((volatile signed __int32 *)&Thread->Tcb.116 + 1, v10);
if( v4 )
ExReleaseRundownProtectionCacheAwareEx(
*(_QWORD *)(*(_QWORD *)(*(_QWORD *)(LoggerId + 1080) + 448i64) + 8i64 * *(unsigned int *)LoggerId),
1i64);
if( v5 )
RtlpInterlockedPushEntrySList((PSLIST_HEADER)(LoggerId + 928), (PSLIST_ENTRY)v5);
return;
}
_InterlockedIncrement((volatile signed __int32 *)(LoggerId + 960));
v14 = *(_DWORD *)(LoggerId + 960);
if( v14 > *(_DWORD *)(LoggerId + 964) )
*(_DWORD *)(LoggerId + 964) = v14;
}Referenced by:
EtwpStackTraceDispatcher
EtwpStackWalkDpc