EtwpAllocateFreeBuffers

__int64 __fastcall EtwpAllocateFreeBuffers(__int64 a1, unsigned int a2){
  unsigned int v2; 
  unsigned int v3; 
  bool v4; 
  unsigned __int32 v7; 
  CHAR *TraceBuffer; 
  unsigned __int32 v9; 
  _QWORD *v10; 
  _QWORD *v11; 
  UINT8 v13; 
  v2 = *(_DWORD *)(a1 + 4);
  v3 = 0;
  v4 = (*(_DWORD *)(a1 + 832) & 0x1000) == 0;
  v13 = 0;
  if( !v4 )
    v2 = (v2 + 4095) & 0xFFFFF000;
  if( a2 )
  {
    while( 1 )
    {
      v7 = _InterlockedIncrement((volatile signed __int32 *)(a1 + 248));
      if( v7 > *(_DWORD *)(a1 + 252) )
      {
        _InterlockedDecrement((volatile signed __int32 *)(a1 + 248));
        goto LABEL_12;
      }
      TraceBuffer = EtwpAllocateTraceBuffer(a1, v2);
      if( !TraceBuffer )
        break;
      while( 1 )
      {
        v9 = *(_DWORD *)(a1 + 260);
        if( v9 >= v7 )
          break;
        _InterlockedCompareExchange((volatile signed __int32 *)(a1 + 260), v7, v9);
      }
      EtwpInitializeBufferHeader((__int16 *)a1, TraceBuffer);
      EtwpLockBufferList(a1, &v13);
      v10 = *(_QWORD **)(a1 + 104);
      v11 = TraceBuffer + 56;
      if( *v10 != a1 + 96 )
        __fastfail(3u);
      *((_QWORD *)TraceBuffer + 8) = v10;
      *v11 = a1 + 96;
      *v10 = v11;
      *(_QWORD *)(a1 + 104) = v11;
      EtwpUnlockBufferList(a1, &v13);
      EtwpEnqueueAvailableBuffer(a1, (UINT64 *)TraceBuffer, 0i64);
      if( ++v3 >= a2 )
        goto LABEL_12;
    }
    _InterlockedDecrement((volatile signed __int32 *)(a1 + 248));
  }
  else
  {
LABEL_12:
    _InterlockedExchangeAdd(
      (volatile signed __int32 *)(*(_QWORD *)(a1 + 1080) + 4i64 * (*(_DWORD *)(a1 + 316) & 1) + 4116),
      *(_DWORD *)(a1 + 4) * v3);
  }
  return v3;
}

Referenced by:

EtwpAdjustFreeBuffers
EtwpAllocateTraceBufferPool
EtwpSwitchBuffer