EtwpStackRundown

VOID __fastcall EtwpStackRundown(INT64 **a1, UINT64 a2, UINT64 a3){
  __int64 v3; 
  unsigned int v4; 
  INT64 **v7; 
  __int64 v8; 
  unsigned __int8 CurrentIrql; 
  INT64 *i; 
  INT64 *v11; 
  INT64 v12; 
  __int128 v13[2]; 
  v3 = 0i64;
  v4 = a3;
  memset(v13, 0, sizeof(v13));
  if( *((_DWORD *)a1 + 2) )
  {
    do
    {
      v7 = &(&a1[2 * v3 + 4])[v3];
      if( *v7 != (INT64 *)v7 )
      {
        v8 = 0i64;
        CurrentIrql = KeGetCurrentIrql();
        __writecr8(2ui64);
        KxAcquireSpinLock((UINT64 *)v7 + 2);
        for( i = *v7; i != (INT64 *)v7; i = (INT64 *)*i )
        {
          _InterlockedIncrement((volatile signed __int32 *)i + 6);
          *((_QWORD *)v13 + v8) = i;
          v8 = (unsigned int)(v8 + 1);
        }
        KxReleaseSpinLock((UINT64 *)v7 + 2);
        __writecr8(CurrentIrql);
        if( (_DWORD)v8 )
        {
          v11 = (INT64 *)v13;
          do
          {
            v12 = *v11;
            EtwpTraceCachedStack(a2, v4, 0x1824ui64, *v11);
            EtwpDereferenceStackEntry(v12, a1);
            ++v11;
            --v8;
          }
          while( v8 );
        }
      }
      v3 = (unsigned int)(v3 + 1);
    }
    while( (unsigned int)v3 < *((_DWORD *)a1 + 2) );
  }
}

Referenced by:

EtwpCheckLoggerAccessAndDoRundown
EtwpStopLoggerInstance