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