EtwpFindAndLockBufferForFlushing

_WMI_BUFFER_HEADER *__stdcall EtwpFindAndLockBufferForFlushing(
        _WMI_LOGGER_CONTEXT *LoggerContext,
        INT64 SequenceNumber){
  _LIST_ENTRY *p_GlobalList; 
  _LIST_ENTRY *Flink; 
  bool v4; 
  _LIST_ENTRY **p_Blink; 
  _LIST_ENTRY *v6; 

  p_GlobalList = &LoggerContext->GlobalList;
  Flink = LoggerContext->GlobalList.Flink;
  v4 = Flink == &LoggerContext->GlobalList;
  p_Blink = &Flink[-4].Blink;
  if( v4 )
    p_Blink = 0i64;
  if( !p_Blink )
    return(_WMI_BUFFER_HEADER *)p_Blink;
  while( p_Blink[3] != (_LIST_ENTRY *)SequenceNumber )
  {
    v6 = p_Blink[7];
    p_Blink = &v6[-4].Blink;
    if( v6 == p_GlobalList )
      p_Blink = 0i64;
    if( !p_Blink )
      return 0i64;
  }
  if( _InterlockedCompareExchange((volatile signed __int32 *)p_Blink + 11, 3, 0) )
    return 0i64;
  if( p_Blink[3] == (_LIST_ENTRY *)SequenceNumber )
    return(_WMI_BUFFER_HEADER *)p_Blink;
  _InterlockedExchange((volatile __int32 *)p_Blink + 11, 0);
  return 0i64;
}

Referenced by:

EtwpBufferingModeFlush