EtwpDequeueFreeBuffer
NTSTATUS __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;
__int64 v9;
__int64 v10;
signed __int64 v11;
signed __int64 v12;
signed __int64 v13;
unsigned int *v15;
INT64 v16;
__int64 v17;
unsigned int *v18;
INT64 v19;
signed __int64 v20;
signed __int64 v21;
signed __int64 v22;
UINT8 v23;
v1 = 0;
v3 = *((_QWORD *)LoggerContext + 9) == 0i64;
v23 = 0;
if( v3 && !*((_QWORD *)LoggerContext + 11) )
return 0;
if( (*((_DWORD *)LoggerContext + 3) & 0x400) != 0 )
{
EtwpLockBufferList((INT64)LoggerContext, &v23);
EtwpDequeueBuffer(LoggerContext, (_ETW_BUFFER_QUEUE *)LoggerContext + 5);
v6 = v5;
if( !v5 )
{
EtwpDequeueBuffer(v4, (_ETW_BUFFER_QUEUE *)LoggerContext + 4);
v6 = v7;
}
if( *((_DWORD *)LoggerContext + 288) )
{
v17 = *((_QWORD *)LoggerContext + 9);
if( !v17 || ((*(_DWORD *)(v17 + 12) - 4) & 0xFFFFFFFD) == 0 )
v1 = 1;
}
EtwpUnlockBufferList((INT64)LoggerContext, &v23);
if( v1 )
EtwpDisableCompression((INT64)LoggerContext);
if( !v6 )
return 0;
do
{
_InterlockedDecrement((volatile signed __int32 *)LoggerContext + 61);
if( (*((_DWORD *)LoggerContext + 3) & 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((__int64)LoggerContext, (__int64)v6);
EtwpLockBufferList((INT64)LoggerContext, &v23);
EtwpDequeueBuffer(LoggerContext, (_ETW_BUFFER_QUEUE *)LoggerContext + 4);
v6 = v18;
EtwpUnlockBufferList(v19, &v23);
}
while( v6 );
if( !v6 )
return 0;
v9 = *((_QWORD *)LoggerContext + 160);
if( v9 )
{
v10 = *((unsigned __int16 *)v6 + 20);
v11 = *(_QWORD *)(v9 + 8 * v10);
do
{
v12 = *((_QWORD *)v6 + 2);
if( v12 <= v11 )
break;
v13 = v11;
v11 = _InterlockedCompareExchange64(
(volatile signed __int64 *)(*((_QWORD *)LoggerContext + 160) + 8 * v10),
v12,
v11);
}
while( v13 != v11 );
if( *((_QWORD *)v6 + 3) <= *((_QWORD *)LoggerContext + 162) )
{
v20 = *(_QWORD *)(*((_QWORD *)LoggerContext + 161) + 8 * v10);
do
{
v22 = *((_QWORD *)v6 + 2);
if( v22 <= v20 )
break;
v21 = v20;
v20 = _InterlockedCompareExchange64(
(volatile signed __int64 *)(*((_QWORD *)LoggerContext + 161) + 8 * v10),
v22,
v20);
}
while( v21 != v20 );
}
}
EtwpResetBufferHeader((__int64)v6, 0);
}
else
{
EtwpLockBufferList((INT64)LoggerContext, &v23);
EtwpDequeueBuffer(LoggerContext, (_ETW_BUFFER_QUEUE *)LoggerContext + 4);
v6 = v15;
EtwpUnlockBufferList(v16, &v23);
if( !v6 )
return 0;
EtwpResetBufferHeader((__int64)v6, 0);
v6[11] = 1;
_InterlockedDecrement((volatile signed __int32 *)LoggerContext + 61);
}
if( *((_DWORD *)LoggerContext + 1) != *v6 )
KeBugCheckEx(0x11Du, 7ui64, (ULONG_PTR)v6, *((unsigned int *)LoggerContext + 1), *v6);
return(int)v6;
}Referenced by:
EtwpRotateCompressionTarget
EtwpSwitchBuffer