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