EtwpTraceStackWalk
VOID __stdcall EtwpTraceStackWalk(UINT64 LoggerId, UINT64 Flags, _ETHREAD *Thread, _LARGE_INTEGER *RelatedTimeStamp){
unsigned int v4;
int v6;
int v7;
_KPROFILE_SOURCE v8;
UINT64 v9;
char *StackLookasideListEntry;
__int64 v11;
void *v12;
unsigned int v13;
unsigned int v14;
unsigned int v15;
UINT64 v16;
unsigned int v17;
unsigned int v18;
VOID **v19;
unsigned int v20;
unsigned int v21;
unsigned int v22;
unsigned int v23;
bool v24;
unsigned int v25;
_ETW_SILODRIVERSTATE *v26;
char v27;
_KERNEL_STACK_LIMITS Type;
UINT64 LowLimit;
UINT64 HighLimit;
_ETHREAD *v31;
_LARGE_INTEGER *v32;
__int128 v33;
__int64 v34;
__int64 v35[3];
unsigned int v36;
int v37;
v31 = Thread;
v4 = Flags;
Type = BugcheckStackLimits;
LowLimit = 0i64;
HighLimit = 0i64;
v32 = RelatedTimeStamp;
v34 = 0i64;
v33 = 0i64;
if( !KeQueryCurrentStackInformation(&Type, &LowLimit, &HighLimit) )
return;
if( (unsigned int)Type <= MachineCheckStackLimits )
{
v6 = 929;
if( _bittest(&v6, Type) )
return;
}
v7 = 256;
StackLookasideListEntry = (char *)EtwpGetStackLookasideListEntry();
if( !StackLookasideListEntry )
{
LODWORD(v11) = KeGetCurrentStackPointer(v9, v8);
if( v11 - LowLimit <= 0x1438 )
return;
v12 = alloca(1536i64);
StackLookasideListEntry = &v27;
v7 = 192;
}
v13 = 0;
v14 = 0;
if( (*(_DWORD *)(LoggerId + 832) & 0x40000000) == 0 )
goto LABEL_10;
if( (v4 & 0x800) != 0 )
{
v13 = 1;
*(_QWORD *)StackLookasideListEntry = PsNtosImageBase;
v4 &= ~0x800u;
LABEL_10:
if( (v4 & 0x800) != 0 )
{
v15 = (v4 >> 20) & 0xF;
v16 = (v15 << 8) | 2;
if( (v4 & 0x2000000) == 0 )
v16 = ((v4 >> 20) & 0xF) << 8;
v17 = RtlWalkFrameChain((INT64)StackLookasideListEntry, v15 + v7, v16);
if( v17 > v15 )
v13 = v17 - v15;
else
v13 = 0;
}
}
if( (v4 & 0x1000) != 0 )
{
v18 = v7 - v13;
v19 = (VOID **)&StackLookasideListEntry[8 * v13];
if( KeGetCurrentThread()->ApcState.Process->PicoContext )
{
v14 = PsPicoWalkUserStack(v19, v18);
}
else
{
v20 = HIWORD(v4) & 0xF;
v21 = RtlWalkFrameChain((INT64)v19, v18 + v20, (v20 << 8) | 1);
if( v21 > v20 )
v14 = v21 - v20;
else
v14 = 0;
}
}
v22 = v13 + v14;
if( v22 )
{
v23 = v4 & 0xFFFFE600 | 2;
v35[1] = 16i64;
v24 = (*(_DWORD *)(LoggerId + 832) & 0x1000000) == 0;
DWORD2(v33) = v31->Cid.UniqueProcess;
HIDWORD(v33) = v31->Cid.UniqueThread;
*(_LARGE_INTEGER *)&v33 = *v32;
v35[0] = (__int64)&v33;
if( v24
|| v22 < 4
|| !EtwpTraceStackKey(
(unsigned int *)LoggerId,
v23,
6182 - (v13 != 0),
(__int64)v35,
(__int64)StackLookasideListEntry,
v22) )
{
v25 = *(_DWORD *)LoggerId;
v26 = *(_ETW_SILODRIVERSTATE **)(LoggerId + 1080);
v36 = 8 * v22;
v35[2] = (__int64)StackLookasideListEntry;
v37 = 0;
EtwpLogKernelEvent((__int64)v35, v26, v25, 2u, 0x1820u, v23);
}
}
if( v7 == 256 )
RtlpInterlockedPushEntrySList(&xmmword_140C53A90, (PSLIST_ENTRY)StackLookasideListEntry - 1);
}Referenced by:
EtwpStackTraceDispatcher
EtwpStackWalkApc