EtwpFreeTraceBufferPool
INT64 __fastcall EtwpFreeTraceBufferPool(UINT64 *a1){
__int64 v1;
int v2;
CHAR *v4;
INT64 v5;
CHAR *v6;
CHAR *v7;
INT64 v8;
unsigned int UsedProcessorCount;
__int64 v10;
__int64 v11;
volatile __int64 *v12;
__int64 v13;
unsigned __int64 v14;
UINT64 *v15;
unsigned __int64 v17;
v1 = *(unsigned int *)a1;
v2 = 0;
if( (*((_DWORD *)a1 + 3) & 0x40000) == 0 )
{
do
{
EtwpDequeueBuffer((_WMI_LOGGER_CONTEXT *)a1, (_ETW_BUFFER_QUEUE *)a1 + 4);
v6 = v4;
if( v4 )
{
_InterlockedDecrement((volatile signed __int32 *)a1 + 62);
++v2;
_InterlockedDecrement((volatile signed __int32 *)a1 + 61);
EtwpFreeTraceBuffer(v5, v4);
}
}
while( v6 );
while( 1 )
{
EtwpDequeueBuffer((_WMI_LOGGER_CONTEXT *)a1, (_ETW_BUFFER_QUEUE *)a1 + 5);
if( !v7 )
break;
_InterlockedDecrement((volatile signed __int32 *)a1 + 62);
++v2;
_InterlockedDecrement((volatile signed __int32 *)a1 + 61);
EtwpFreeTraceBuffer(v8, v7);
}
UsedProcessorCount = EtwpQueryUsedProcessorCount(v8);
if( UsedProcessorCount )
{
v10 = 0i64;
v11 = UsedProcessorCount;
do
{
if( (*((_DWORD *)a1 + 3) & 0x10000000) != 0 )
v12 = (volatile __int64 *)(a1 + 18);
else
v12 = (volatile __int64 *)(*(_QWORD *)(*(_QWORD *)(a1[135] + 4136) + v10) + 8 * v1);
v13 = _InterlockedExchange64(v12, 0i64);
v14 = v13 & 0xFFFFFFFFFFFFFFF0ui64;
if( (v13 & 0xFFFFFFFFFFFFFFF0ui64) != 0 )
{
_InterlockedExchangeAdd((volatile signed __int32 *)(v14 + 12), -(v13 & 0xF));
do
{
v17 = *(_QWORD *)(v14 + 32);
_InterlockedDecrement((volatile signed __int32 *)a1 + 62);
++v2;
EtwpFreeTraceBuffer((INT64)a1, (CHAR *)v14);
v14 = v17;
}
while( v17 );
}
v10 += 64i64;
--v11;
}
while( v11 );
}
if( a1[142] )
{
_InterlockedDecrement((volatile signed __int32 *)a1 + 62);
++v2;
EtwpFreeTraceBuffer((INT64)a1, (CHAR *)a1[142]);
}
while( 1 )
{
v15 = (UINT64 *)a1[146];
if( !v15 )
break;
a1[146] = *v15;
ExFreePoolWithTag(v15 - 4, 0);
}
_InterlockedExchangeAdd(
(volatile signed __int32 *)(a1[135] + 4i64 * (*((_DWORD *)a1 + 79) & 1) + 4116),
-(v2 * *((_DWORD *)a1 + 1)));
}
return 0i64;
}Referenced by:
EtwpFreeLoggerContext
EtwpStartLogger