EtwpDequeueFreeBuffer

_WMI_BUFFER_HEADER *__stdcall EtwpDequeueFreeBuffer(_WMI_LOGGER_CONTEXT *LoggerContext){
  char v1; 
  bool v3; 
  _WMI_LOGGER_CONTEXT *v4; 
  unsigned int *v5; 
  unsigned int *v6; 
  unsigned int *v7; 
  signed __int32 v8; 
  _LARGE_INTEGER *LastDroppedTime; 
  __int64 v10; 
  signed __int64 QuadPart; 
  signed __int64 v12; 
  signed __int64 v13; 
  unsigned int *v15; 
  _WMI_LOGGER_CONTEXT *v16; 
  _SINGLE_LIST_ENTRY *Next; 
  unsigned int *v18; 
  _WMI_LOGGER_CONTEXT *v19; 
  signed __int64 v20; 
  signed __int64 v21; 
  signed __int64 v22; 
  _ETW_LOCK_HANDLE LockHandle; 

  v1 = 0;
  v3 = LoggerContext->BufferQueue.QueueEntry.Next == 0i64;
  LockHandle.OldIrql = 0;
  if( v3 && !LoggerContext->OverflowQueue.QueueEntry.Next )
    return 0i64;
  if( (LoggerContext->LoggerMode & 0x400) != 0 )
  {
    EtwpLockBufferList(LoggerContext, &LockHandle);
    EtwpDequeueBuffer(LoggerContext, &LoggerContext->OverflowQueue);
    v6 = v5;
    if( !v5 )
    {
      EtwpDequeueBuffer(v4, &LoggerContext->BufferQueue);
      v6 = v7;
    }
    if( LoggerContext->CompressionOn )
    {
      Next = LoggerContext->BufferQueue.QueueEntry.Next;
      if( !Next || ((HIDWORD(Next[1].Next) - 4) & 0xFFFFFFFD) == 0 )
        v1 = 1;
    }
    EtwpUnlockBufferList(LoggerContext, &LockHandle);
    if( v1 )
      EtwpDisableCompression(LoggerContext);
    if( !v6 )
      return 0i64;
    do
    {
      _InterlockedDecrement(&LoggerContext->BuffersAvailable);
      if( (LoggerContext->LoggerMode & 0x4000000) != 0 )
      {
        v8 = v6[11];
        if( (unsigned int)(v8 - 4) <= 1 )
          goto LABEL_12;
      }
      v8 = 0;
LABEL_12:
      if( !v6[3] && v8 == _InterlockedCompareExchange((volatile signed __int32 *)v6 + 11, 1, v8) )
        break;
      EtwpEnqueueOverflowBuffer(LoggerContext, (_WMI_BUFFER_HEADER *)v6);
      EtwpLockBufferList(LoggerContext, &LockHandle);
      EtwpDequeueBuffer(LoggerContext, &LoggerContext->BufferQueue);
      v6 = v18;
      EtwpUnlockBufferList(v19, &LockHandle);
    }
    while( v6 );
    if( !v6 )
      return 0i64;
    LastDroppedTime = LoggerContext->LastDroppedTime;
    if( LastDroppedTime )
    {
      v10 = *((unsigned __int16 *)v6 + 20);
      QuadPart = LastDroppedTime[v10].QuadPart;
      do
      {
        v12 = *((_QWORD *)v6 + 2);
        if( v12 <= QuadPart )
          break;
        v13 = QuadPart;
        QuadPart = _InterlockedCompareExchange64(
                     (volatile signed __int64 *)&LoggerContext->LastDroppedTime[v10],
                     v12,
                     QuadPart);
      }
      while( v13 != QuadPart );
      if( *((_QWORD *)v6 + 3) <= LoggerContext->FlushingSequenceNumber )
      {
        v20 = LoggerContext->FlushingLastDroppedTime[v10].QuadPart;
        do
        {
          v22 = *((_QWORD *)v6 + 2);
          if( v22 <= v20 )
            break;
          v21 = v20;
          v20 = _InterlockedCompareExchange64(
                  (volatile signed __int64 *)&LoggerContext->FlushingLastDroppedTime[v10],
                  v22,
                  v20);
        }
        while( v21 != v20 );
      }
    }
    EtwpResetBufferHeader((_WMI_BUFFER_HEADER *)v6, 0);
  }
  else
  {
    EtwpLockBufferList(LoggerContext, &LockHandle);
    EtwpDequeueBuffer(LoggerContext, &LoggerContext->BufferQueue);
    v6 = v15;
    EtwpUnlockBufferList(v16, &LockHandle);
    if( !v6 )
      return 0i64;
    EtwpResetBufferHeader((_WMI_BUFFER_HEADER *)v6, 0);
    v6[11] = 1;
    _InterlockedDecrement(&LoggerContext->BuffersAvailable);
  }
  if( LoggerContext->BufferSize != *v6 )
    KeBugCheckEx(0x11Du, (PVOID)7, v6, (PVOID)LoggerContext->BufferSize, (PVOID)*v6);
  return(_WMI_BUFFER_HEADER *)v6;
}

Referenced by:

EtwpRotateCompressionTarget
EtwpSwitchBuffer