RtlpStdLogCapturedStackTrace
UINT64 __fastcall RtlpStdLogCapturedStackTrace(UINT64 *SpinLock, INT64 a2, UINT64 a3){
_SIZE_T *v4;
unsigned int v5;
__int64 v6;
__int64 v8;
UINT64 *v9;
UINT64 i;
_SLIST_ENTRY *SpaceForTrace;
__int16 v12;
__int64 v13;
__int16 v14;
unsigned __int64 v15;
v4 = (_SIZE_T *)(8i64 * *(unsigned __int16 *)(a2 + 14));
v5 = a3;
v6 = (unsigned int)a3 % *((_DWORD *)SpinLock + 180);
v8 = 3 * v6;
_InterlockedAdd((volatile signed __int32 *)SpinLock + 44, 1u);
v9 = &SpinLock[3 * (unsigned int)v6];
*((_BYTE *)v9 + 744) = KeAcquireSpinLockRaiseToDpc(v9 + 92);
for( i = SpinLock[v8 + 91]; i; i = *(_QWORD *)i )
{
if( *(_WORD *)(i + 14) == *(_WORD *)(a2 + 14)
&& RtlCompareMemory((const VOID *)(i + 16), (const VOID *)(a2 + 16), (_SIZE_T)v4) == v4 )
{
goto LABEL_8;
}
}
SpaceForTrace = RtlpStdGetSpaceForTrace(SpinLock, *(_WORD *)(a2 + 14));
i = (UINT64)SpaceForTrace;
if( !SpaceForTrace )
{
_InterlockedAdd((volatile signed __int32 *)SpinLock + 50, 1u);
goto LABEL_11;
}
memmove(&SpaceForTrace[1], (const VOID *)(a2 + 16), (size_t)v4);
v12 = *(_WORD *)(a2 + 14);
*(_WORD *)(i + 8) &= 0xF800u;
*(_WORD *)(i + 14) = v12;
v13 = 3i64 * (v5 % *((_DWORD *)SpinLock + 180));
*(_QWORD *)i = SpinLock[3 * (v5 % *((_DWORD *)SpinLock + 180)) + 91];
SpinLock[v13 + 91] = i;
LABEL_8:
v14 = *(_WORD *)(i + 8);
if( (v14 & 0x7FF) != 2047 )
*(_WORD *)(i + 8) = v14 ^ (v14 ^ (v14 + 1)) & 0x7FF;
LABEL_11:
v15 = *((unsigned __int8 *)v9 + 744);
KxReleaseSpinLock(v9 + 92);
__writecr8(v15);
return i;
}Referenced by:
RtlStdLogStackTrace