EtwpFreeStackCache

VOID __stdcall EtwpFreeStackCache(_ETW_STACK_CACHE *StackCache){
  __int64 i; 
  _ETW_STACK_CACHE *v3; 
  _QWORD *v4; 
  __int64 v5; 
  _QWORD *v6; 
  _QWORD *v7; 
  _QWORD *v8; 
  void *v9; 

  for( i = 0i64; (unsigned int)i < StackCache[2]; i = (unsigned int)(i + 1) )
  {
    while( 1 )
    {
      v3 = &StackCache[4 * i + 8 + 2 * i];
      v4 = *(_QWORD **)v3;
      if( *(_ETW_STACK_CACHE **)v3 == v3 )
        break;
      if( (_ETW_STACK_CACHE *)v4[1] != v3 || (v5 = *v4, *(_QWORD **)(*v4 + 8i64) != v4) )
        __fastfail(3u);
      *(_QWORD *)v3 = v5;
      *(_QWORD *)(v5 + 8) = v3;
      do
      {
        v6 = (_QWORD *)v4[2];
        ExFreePoolWithTag(v4, 0);
        v4 = v6;
      }
      while( v6 );
    }
  }
  RtlpInterlockedFlushSList();
  v8 = v7;
  while( v8 )
  {
    v9 = v8;
    v8 = (_QWORD *)*v8;
    ExFreePoolWithTag(v9, 0);
  }
  ExFreePoolWithTag(StackCache, 0);
}

Referenced by:

EtwpEnableStackCaching
EtwpFreeLoggerContext