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