EtwpTraceStackKey
UINT8 __stdcall EtwpTraceStackKey(
UINT64 LoggerId,
UINT64 Flags,
UINT16 HookId,
EVENT_DATA_DESCRIPTOR *EventData,
PVOID *StackTrace,
UINT64 FrameCount){
__int64 v6;
UINT8 v7;
unsigned int v8;
unsigned __int64 v9;
unsigned int v10;
PSLIST_ENTRY v11;
unsigned int v12;
__int64 v13;
__int64 v14;
int v15;
__int64 v16;
int v17;
_SLIST_ENTRY *v18;
__int64 CurrentIrql;
PSLIST_ENTRY Next;
unsigned int v21;
int v22;
PSLIST_ENTRY v23;
unsigned int v24;
_SLIST_ENTRY *v25;
PSLIST_ENTRY *v26;
_SLIST_ENTRY *v27;
PSLIST_ENTRY *v28;
unsigned int v29;
PSLIST_ENTRY v30;
PSLIST_ENTRY v31;
unsigned int v32;
struct _SLIST_ENTRY *v33;
PSLIST_ENTRY *v34;
UINT64 Flag;
UINT64 v37;
int v38;
unsigned int v39;
PSLIST_HEADER ListHead;
unsigned int v41;
INT64 **v42;
PSLIST_ENTRY v43;
PSLIST_ENTRY ListEntry;
PKSPIN_LOCK SpinLock;
_SLIST_ENTRY *v46;
__int64 v47;
int v49;
v49 = Flags;
v6 = *(_QWORD *)(LoggerId + 992);
v7 = 0;
v43 = 0i64;
v42 = (INT64 **)v6;
if( !v6 )
return v7;
v8 = FrameCount;
ListEntry = 0i64;
v9 = 4i64 * (unsigned int)FrameCount;
v10 = 0;
v39 = 0;
v11 = 0i64;
v12 = 0;
if( v9 )
{
v13 = 0i64;
do
{
v14 = v12 + 1;
v12 += 2;
v15 = *((unsigned __int16 *)StackTrace + v13) ^ *((unsigned __int16 *)StackTrace + v14);
v13 = v12;
v10 += v15;
}
while( v12 < v9 );
v8 = FrameCount;
v39 = v10;
}
v16 = v10 % *(_DWORD *)(v6 + 8);
v17 = 0;
v18 = (_SLIST_ENTRY *)(v6 + 8 * (v16 + 2 * (v16 + 2)));
v46 = v18;
CurrentIrql = KeGetCurrentIrql();
v47 = CurrentIrql;
if( (unsigned __int8)CurrentIrql <= 1u )
{
KeGetCurrentIrql();
__writecr8(2ui64);
}
else if( (_BYTE)CurrentIrql != 2 )
{
SpinLock = (PKSPIN_LOCK)&v18[1];
if( !KxTryToAcquireSpinLock((volatile INT32 *)&v18[1]) )
return v7;
v17 = 0;
goto LABEL_10;
}
SpinLock = (PKSPIN_LOCK)&v18[1];
KxAcquireSpinLock((UINT64 *)&v18[1]);
LABEL_10:
Next = v18->Next;
if( v18->Next != v18 )
{
v21 = v39;
do
{
++v17;
if( *((_DWORD *)&Next[1].Next + 3) == v21 && LODWORD(Next[2].Next) == v8 )
{
v22 = 0;
v23 = Next;
v38 = 0;
ListHead = (PSLIST_HEADER)Next;
while( 1 )
{
v24 = 32;
if( LODWORD(v23[2].Next) < 0x20 )
v24 = (unsigned int)v23[2].Next;
v41 = v24;
if( RtlCompareMemory(&v23[2].Next + 1, &StackTrace[v22], 8i64 * v24) != 8i64 * v24 )
break;
v22 = v41 + v38;
v38 += v41;
v23 = (PSLIST_ENTRY)*((_QWORD *)ListHead + 2);
ListHead = (PSLIST_HEADER)v23;
if( !v23 )
{
_InterlockedIncrement((volatile signed __int32 *)&Next[1].Next + 2);
v25 = Next->Next;
v26 = (PSLIST_ENTRY *)*((_QWORD *)&Next->Next + 1);
if( *(&Next->Next->Next + 1) == Next && *v26 == Next )
{
*v26 = v25;
*((_QWORD *)&v25->Next + 1) = v26;
v27 = v18->Next;
if( *(&v18->Next->Next + 1) == v18 )
{
Next->Next = v27;
*((_QWORD *)&Next->Next + 1) = v18;
*((_QWORD *)&v27->Next + 1) = Next;
v18->Next = Next;
KxReleaseSpinLock((UINT64 *)&v18[1]);
__writecr8((unsigned __int8)CurrentIrql);
goto LABEL_54;
}
}
LABEL_51:
__fastfail(3u);
}
}
v21 = v39;
}
Next = Next->Next;
}
while( Next != v18 );
if( v17 == 4 )
{
v11 = (PSLIST_ENTRY)*((_QWORD *)&v18->Next + 1);
ListEntry = v11;
v28 = (PSLIST_ENTRY *)*((_QWORD *)&v11->Next + 1);
if( v11->Next != v18 || *v28 != v11 )
goto LABEL_51;
*((_QWORD *)&v18->Next + 1) = v28;
*v28 = v18;
}
}
Next = 0i64;
v29 = 0;
if( !v8 )
goto LABEL_50;
v30 = 0i64;
while( 1 )
{
v31 = RtlpInterlockedPopEntrySList((PSLIST_HEADER)(v42 + 2));
if( !v31 )
break;
if( v29 + 32 >= (unsigned int)FrameCount )
v32 = FrameCount - v29;
else
v32 = 32;
memmove((UINT8 *)&v31[2].Next + 8, (UINT8 *)&StackTrace[v29], 8i64 * v32);
if( v29 )
LODWORD(v31[2].Next) = v32;
else
Next = v31;
if( v30 )
v30[1].Next = v31;
v30 = v31;
v31[1].Next = 0i64;
v8 = FrameCount;
v29 += v32;
if( v29 >= (unsigned int)FrameCount )
goto LABEL_45;
}
v8 = FrameCount;
LABEL_45:
v18 = v46;
LOBYTE(CurrentIrql) = v47;
v11 = ListEntry;
if( v29 < v8 )
{
KxReleaseSpinLock(SpinLock);
__writecr8((unsigned __int8)v47);
if( Next )
{
do
{
v33 = Next[1].Next;
RtlpInterlockedPushEntrySList((PSLIST_HEADER)(v42 + 2), Next);
Next = v33;
}
while( v33 );
}
if( ListEntry )
EtwpDereferenceStackEntry((INT64)ListEntry, v42);
}
else
{
LABEL_50:
*((_DWORD *)&Next[1].Next + 3) = v39;
LODWORD(Next[2].Next) = v8;
*((_DWORD *)&Next[1].Next + 2) = 2;
v34 = (PSLIST_ENTRY *)*((_QWORD *)&v18->Next + 1);
if( *v34 != v18 )
goto LABEL_51;
Next->Next = v18;
*((_QWORD *)&Next->Next + 1) = v34;
*v34 = Next;
*((_QWORD *)&v18->Next + 1) = Next;
KxReleaseSpinLock((UINT64 *)&v18[1]);
__writecr8((unsigned __int8)CurrentIrql);
if( v11 )
EtwpDereferenceStackEntry((INT64)v11, v42);
LABEL_54:
v43 = Next;
EventData[1].Ptr = (unsigned __int64)&v43;
LODWORD(v37) = v49;
*(_QWORD *)&EventData[1].Size = 8i64;
LOWORD(Flag) = HookId;
EtwpLogKernelEvent(EventData, *(_QWORD *)(LoggerId + 1080), *(unsigned int *)LoggerId, 2u, Flag, v37);
EtwpDereferenceStackEntry((INT64)v43, *(INT64 ***)(LoggerId + 992));
return 1;
}
return v7;
}Referenced by:
EtwpTraceStackWalk