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