EtwpTraceStackKey
char __fastcall EtwpTraceStackKey(unsigned int *a1, int edx0, __int16 a3, __int64 a4, __int64 a5, unsigned int a6){
__int64 v6;
char 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;
_SLIST_ENTRY *Next;
unsigned int v21;
unsigned int v22;
unsigned __int64 Alignment;
unsigned int v24;
_SLIST_ENTRY *v25;
_SLIST_ENTRY **v26;
_SLIST_ENTRY *v27;
PSLIST_ENTRY *v28;
unsigned int v29;
PSLIST_ENTRY v30;
PSLIST_ENTRY v31;
int v32;
_SLIST_ENTRY *v33;
_SLIST_ENTRY **v34;
int v36;
unsigned int v37;
PSLIST_HEADER ListHead;
unsigned int v39;
_SLIST_HEADER *a2;
PSLIST_ENTRY v41;
PSLIST_ENTRY ListEntry;
UINT64 *SpinLock;
_SLIST_ENTRY *v44;
__int64 v45;
v6 = *((_QWORD *)a1 + 124);
v7 = 0;
v41 = 0i64;
a2 = (_SLIST_HEADER *)v6;
if( !v6 )
return v7;
v8 = a6;
ListEntry = 0i64;
v9 = 4i64 * a6;
v10 = 0;
v37 = 0;
v11 = 0i64;
v12 = 0;
if( v9 )
{
v13 = 0i64;
do
{
v14 = v12 + 1;
v12 += 2;
v15 = *(unsigned __int16 *)(a5 + 2 * v13) ^ *(unsigned __int16 *)(a5 + 2 * v14);
v13 = v12;
v10 += v15;
}
while( v12 < v9 );
v8 = a6;
v37 = v10;
}
v16 = v10 % *(_DWORD *)(v6 + 8);
v17 = 0;
v18 = (_SLIST_ENTRY *)(v6 + 8 * (v16 + 2 * (v16 + 2)));
v44 = v18;
CurrentIrql = KeGetCurrentIrql();
v45 = CurrentIrql;
if( (unsigned __int8)CurrentIrql <= 1u )
{
KeGetCurrentIrql();
__writecr8(2ui64);
}
else if( (_BYTE)CurrentIrql != 2 )
{
SpinLock = (UINT64 *)&v18[1];
if( !KxTryToAcquireSpinLock((INT32 *)&v18[1]) )
return v7;
v17 = 0;
goto LABEL_10;
}
SpinLock = (UINT64 *)&v18[1];
KxAcquireSpinLock((UINT64 *)&v18[1]);
LABEL_10:
Next = v18->Next;
if( v18->Next != v18 )
{
v21 = v37;
do
{
++v17;
if( *((_DWORD *)&Next[1].Next + 3) == v21 && LODWORD(Next[2].Next) == v8 )
{
v22 = 0;
Alignment = (unsigned __int64)Next;
v36 = 0;
ListHead = (PSLIST_HEADER)Next;
while( 1 )
{
v24 = 32;
if( *(_DWORD *)(Alignment + 32) < 0x20u )
v24 = *(_DWORD *)(Alignment + 32);
v39 = v24;
if( RtlCompareMemory((const VOID *)(Alignment + 40), (const VOID *)(a5 + 8i64 * v22), 8 * v24) != (_SIZE_T *)(8i64 * v24) )
break;
v22 = v39 + v36;
v36 += v39;
Alignment = ListHead[1].Alignment;
ListHead = (PSLIST_HEADER)Alignment;
if( !Alignment )
{
_InterlockedIncrement((volatile signed __int32 *)&Next[1].Next + 2);
v25 = Next->Next;
v26 = (_SLIST_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 = v37;
}
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(a2 + 1);
if( !v31 )
break;
if( v29 + 32 >= a6 )
v32 = a6 - v29;
else
v32 = 32;
memmove(&v31[2].Next + 1, (const VOID *)(a5 + 8i64 * v29), 8 * v32);
if( v29 )
LODWORD(v31[2].Next) = v32;
else
Next = v31;
if( v30 )
v30[1].Next = v31;
v30 = v31;
v31[1].Next = 0i64;
v8 = a6;
v29 += v32;
if( v29 >= a6 )
goto LABEL_45;
}
v8 = a6;
LABEL_45:
v18 = v44;
LOBYTE(CurrentIrql) = v45;
v11 = ListEntry;
if( v29 < v8 )
{
KxReleaseSpinLock(SpinLock);
__writecr8((unsigned __int8)v45);
if( Next )
{
do
{
v33 = Next[1].Next;
RtlpInterlockedPushEntrySList(a2 + 1, Next);
Next = v33;
}
while( v33 );
}
if( ListEntry )
EtwpDereferenceStackEntry(ListEntry, a2);
}
else
{
LABEL_50:
*((_DWORD *)&Next[1].Next + 3) = v37;
LODWORD(Next[2].Next) = v8;
*((_DWORD *)&Next[1].Next + 2) = 2;
v34 = (_SLIST_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(v11, a2);
LABEL_54:
v41 = Next;
*(_QWORD *)(a4 + 16) = &v41;
*(_QWORD *)(a4 + 24) = 8i64;
EtwpLogKernelEvent(a4, *((_ETW_SILODRIVERSTATE **)a1 + 135), *a1, 2u, a3, edx0);
EtwpDereferenceStackEntry(v41, *((_SLIST_HEADER **)a1 + 124));
return 1;
}
return v7;
}Referenced by:
EtwpTraceStackWalk