EtwpStackTraceDispatcher
void __fastcall EtwpStackTraceDispatcher(__int64 a1, _QWORD *a2, __int64 a3, unsigned int a4){
_ETHREAD *CurrentThread;
unsigned int v5;
__int64 v6;
UINT8 CurrentIrql;
unsigned __int8 v10;
unsigned __int8 v11;
char v12;
int v13;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v5 = a4;
v6 = a3;
if( (a4 & 0x4000) == 0 || *((_ETHREAD **)KeGetCurrentPrcb() + 3) != CurrentThread )
{
if( !a3 )
v6 = (__int64)CurrentThread;
if( (a4 & 0x3000) != 4096 )
goto LABEL_29;
if( (*((_DWORD *)CurrentThread + 29) & 0x400) != 0
|| CurrentThread != (_ETHREAD *)v6
|| (*((_DWORD *)CurrentThread + 324) & 1) != 0 && (a4 & 0x4000000) == 0 )
{
v5 = a4 & 0xFFFFEFFF;
goto LABEL_29;
}
CurrentIrql = ObGetCurrentIrql();
v10 = 2;
v11 = CurrentIrql;
if( CurrentIrql < 2u )
{
if( (*(_DWORD *)(a1 + 832) & 0x1000000) == 0 || (*((_DWORD *)CurrentThread + 324) & 1) != 0 )
{
MmCanThreadFault();
if( v13 )
{
if( !*((_BYTE *)CurrentThread + 1310)
&& *((_BYTE *)KeGetCurrentThread() + 586) != 1
&& (v5 & 0x1000000) == 0
&& !_bittest((const signed __int32 *)CurrentThread + 29, 5u) )
{
goto LABEL_29;
}
}
}
v5 &= ~0x1000u;
}
else
{
v5 &= ~0x1000u;
v12 = *((_BYTE *)KeGetCurrentPrcb() + 32);
if( CurrentIrql == 2 )
{
if( !v12 )
goto LABEL_28;
goto LABEL_16;
}
if( v12 )
{
LABEL_16:
if( (v5 & 0x8000) == 0 || v12 != 1 )
goto LABEL_29;
}
}
v10 = v11;
LABEL_28:
EtwpQueueStackWalkApc((__int64)CurrentThread, v10, (unsigned int *)a1, (unsigned int *)a2);
LABEL_29:
if( (v5 & 0x1800) != 0 )
EtwpTraceStackWalk(a1, v5, v6, a2);
}
}Referenced by:
EtwpLogContextSwapEvent
EtwpLogKernelEvent
EtwpLogSystemEventUnsafe