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