EtwpEnqueueAvailableBuffer

VOID __stdcall EtwpEnqueueAvailableBuffer(
        _WMI_LOGGER_CONTEXT *LoggerContext,
        _WMI_BUFFER_HEADER *Buffer,
        _ETW_BUFFER_STATE NewState){
  void *BugCheckParameter4; 
  void *BufferSize; 
  _SINGLE_LIST_ENTRY *v8; 
  _SINGLE_LIST_ENTRY *p_QueueEntry; 
  _SINGLE_LIST_ENTRY *Next; 
  _SINGLE_LIST_ENTRY *v11; 
  int Next_high; 
  int v13; 
  _ETW_LOCK_HANDLE LockHandle; 

  BugCheckParameter4 = (void *)*(_DWORD *)Buffer;
  BufferSize = (void *)LoggerContext->BufferSize;
  LockHandle.OldIrql = 0;
  if( (_DWORD)BufferSize != (_DWORD)BugCheckParameter4 )
    KeBugCheckEx(0x11Du, (PVOID)7, Buffer, BufferSize, BugCheckParameter4);
  *((_DWORD *)Buffer + 11) = NewState;
  *((_QWORD *)Buffer + 3) = _InterlockedIncrement64(&LoggerContext->BufferSequenceNumber);
  EtwpLockBufferList(LoggerContext, &LockHandle);
  if( (LoggerContext->LoggerMode & 0x4000000) == 0
    || (p_QueueEntry = &LoggerContext->BufferQueue.QueueEntry,
        (Next = LoggerContext->BufferQueue.QueueEntry.Next) == 0i64)
    || NewState == EtwBufferStatePendingCompression )
  {
    v8 = (_SINGLE_LIST_ENTRY *)((char *)Buffer + 32);
    goto LABEL_4;
  }
  if( NewState )
  {
    v11 = 0i64;
    do
    {
      Next_high = HIDWORD(Next[1].Next);
      if( (!v11 && (v13 = HIDWORD(Next[1].Next), Next_high) || (v13 = HIDWORD(Next[1].Next), Next_high == 6))
        && (v11 = p_QueueEntry, v13 == 6) )
      {
        p_QueueEntry->Next = Next->Next;
        if( Next->Next )
          Next->Next = 0i64;
        else
          LoggerContext->BufferQueue.QueueTail = p_QueueEntry;
        Next->Next = (_SINGLE_LIST_ENTRY *)LoggerContext->PlaceholderList;
        LoggerContext->PlaceholderList.Next = Next;
      }
      else
      {
        p_QueueEntry = Next;
      }
      Next = p_QueueEntry->Next;
    }
    while( p_QueueEntry->Next );
    v8 = (_SINGLE_LIST_ENTRY *)((char *)Buffer + 32);
    if( v11 )
    {
      v8->Next = v11->Next;
      v11->Next = v8;
      if( v11 != LoggerContext->BufferQueue.QueueTail )
        goto LABEL_6;
      goto LABEL_5;
    }
LABEL_4:
    v8->Next = 0i64;
    LoggerContext->BufferQueue.QueueTail->Next = v8;
LABEL_5:
    LoggerContext->BufferQueue.QueueTail = v8;
    goto LABEL_6;
  }
  *((_QWORD *)Buffer + 4) = LoggerContext->BufferQueue.QueueEntry.Next;
  LoggerContext->BufferQueue.QueueEntry.Next = (_SINGLE_LIST_ENTRY *)((char *)Buffer + 32);
  if( &LoggerContext->BufferQueue.QueueEntry == LoggerContext->BufferQueue.QueueTail )
    LoggerContext->BufferQueue.QueueTail = (_SINGLE_LIST_ENTRY *)((char *)Buffer + 32);
LABEL_6:
  EtwpUnlockBufferList(LoggerContext, &LockHandle);
  _InterlockedIncrement(&LoggerContext->BuffersAvailable);
}

Referenced by:

EtwpAllocateFreeBuffers
EtwpCompleteBuffer
EtwpPrepareDirtyBuffer
EtwpRelinquishCompressionTarget
EtwpRotateCompressionTarget
EtwpSwitchBuffer