EtwpFlushActiveBuffers
INT64 __fastcall EtwpFlushActiveBuffers(_WMI_LOGGER_CONTEXT *LoggerContext, UINT64 FlushAll){
int v2;
INT64 *v4;
int v5;
int v6;
__int64 v7;
__int64 v8;
_QWORD *v9;
_QWORD *v10;
unsigned __int64 v11;
__int64 v12;
unsigned __int32 v13;
signed __int64 i;
signed __int64 v15;
unsigned __int64 v16;
unsigned int *v17;
__int64 v18;
INT64 *v19;
int v20;
int v21;
__int64 v22;
__int64 v23;
_WMI_BUFFER_HEADER *v24;
$CE5421AAA17F992240E21CD59A4E8E5E v25;
unsigned int SavedOffset;
__int16 v27;
unsigned int v28;
unsigned int *v29;
__int16 v30;
unsigned int v31;
__int64 v33;
__int64 v34;
__int64 v35;
int v36;
__int64 v37;
__int64 v38;
char v39;
int v40;
INT64 result[32];
v2 = FlushAll;
v40 = FlushAll;
memset((INT64)result, 0i64);
if( !*((_QWORD *)LoggerContext + 102) && !*((_QWORD *)LoggerContext + 47) )
{
if( *((_DWORD *)LoggerContext + 56) )
EtwpRequestFlushTimer((__int64)LoggerContext, 0);
return 259i64;
}
v4 = result;
v39 = 0;
v5 = 0;
if( *((_QWORD *)LoggerContext + 130) )
v4 = (INT64 *)*((_QWORD *)LoggerContext + 130);
if( (*((_DWORD *)LoggerContext + 3) & 0x40000) != 0 )
{
v37 = _InterlockedExchange64((volatile __int64 *)LoggerContext + 18, 0i64);
if( v37 )
{
*v4 = v37;
v5 = 1;
}
goto LABEL_26;
}
v6 = EtwpQueryUsedProcessorCount((INT64)LoggerContext) - 1;
v7 = v6;
if( v6 < 0 )
goto LABEL_25;
v8 = (__int64)v6 << 6;
v9 = v4;
do
{
if( (*((_DWORD *)LoggerContext + 3) & 0x10000000) != 0 )
v10 = (_QWORD *)((char *)LoggerContext + 144);
else
v10 = (_QWORD *)(*(_QWORD *)(*(_QWORD *)(*((_QWORD *)LoggerContext + 135) + 4136i64) + v8)
+ 8i64 * *(_DWORD *)LoggerContext);
v11 = *v10 & 0xFFFFFFFFFFFFFFF0ui64;
if( v11 )
{
if( v40 )
{
v13 = _InterlockedExchangeAdd((volatile signed __int32 *)(v11 + 8), *((_DWORD *)LoggerContext + 1));
if( v13 <= *((_DWORD *)LoggerContext + 1) )
*(_DWORD *)(v11 + 4) = v13;
_m_prefetchw(v10);
for( i = *v10; (v11 ^ i) <= 0xF; i = v15 )
{
v15 = _InterlockedCompareExchange64(v10, 0i64, i);
if( i == v15 )
break;
}
v16 = i & 0xFFFFFFFFFFFFFFF0ui64;
if( (i & 0xFFFFFFFFFFFFFFF0ui64) == v11 )
{
_InterlockedExchangeAdd((volatile signed __int32 *)(v16 + 12), -(i & 0xF));
EtwpPrepareDirtyBuffer((PSTR)LoggerContext, v16);
}
else
{
if( v16 )
{
do
{
v38 = *(_QWORD *)(v16 + 32);
if( v38 == v11 )
break;
v16 = *(_QWORD *)(v16 + 32);
}
while( v38 );
}
*(_QWORD *)(v16 + 32) = 0i64;
v39 = 1;
}
*v9 = v11;
}
else
{
v12 = *(_QWORD *)((*v10 & 0xFFFFFFFFFFFFFFF0ui64) + 0x20);
if( !v12 )
goto LABEL_23;
*v9 = v12;
*(_QWORD *)(v11 + 32) = 0i64;
}
++v5;
++v9;
}
LABEL_23:
v8 -= 64i64;
--v7;
}
while( v7 >= 0 );
v2 = v40;
LABEL_25:
EtwpLockUnlockBufferList((INT64)LoggerContext);
LABEL_26:
v17 = 0i64;
if( v5 > 0 )
{
v18 = v5;
v19 = &v4[v5 - 1];
do
{
v20 = 1;
v21 = 0;
v22 = 1i64;
v23 = 0i64;
while( v22 < v18 )
{
v33 = *(_QWORD *)(v4[v22] + 16);
v34 = *(_QWORD *)(v4[v23] + 16);
v35 = v22;
if( v33 <= v34 )
v35 = v23;
v23 = v35;
v36 = v20;
if( v33 <= v34 )
v36 = v21;
++v20;
++v22;
v21 = v36;
}
v24 = (_WMI_BUFFER_HEADER *)v4[v23];
v25 = v24->0;
v4[v23] = (INT64)v25;
if( !*(_QWORD *)&v25 )
{
--v18;
v4[v23] = *v19--;
}
if( v24->ReferenceCount <= 0
&& (SavedOffset = v24->SavedOffset, SavedOffset <= 0x48)
&& (SavedOffset || v24->CurrentOffset <= 0x48) )
{
EtwpCompleteBuffer(LoggerContext, v24, 0i64);
}
else
{
v24->0 = ($CE5421AAA17F992240E21CD59A4E8E5E)v17;
v17 = (unsigned int *)&v24->32;
}
}
while( v18 > 0 );
v2 = v40;
}
v27 = 0;
v28 = 0;
if( v17 )
{
v29 = *(unsigned int **)v17;
do
{
v30 = v40 != 0;
if( v29 )
v30 = v27;
v27 = v30;
EtwpAdjustFreeBuffers(LoggerContext);
EtwpWaitForBufferReferenceCount((_WMI_BUFFER_HEADER *)(v17 - 8));
v31 = EtwpFlushBuffer((__int64)LoggerContext, v17 - 8, v27);
EtwpCompleteBuffer(LoggerContext, (_WMI_BUFFER_HEADER *)(v17 - 8), v31);
v17 = v29;
if( v29 )
v29 = *(unsigned int **)v29;
if( v31 )
v28 = v31;
}
while( v17 );
if( *((_DWORD *)LoggerContext + 56) && v40 && ((*((_DWORD *)LoggerContext + 3) & 0x10000000) == 0 || v39) )
EtwpRequestFlushTimer((__int64)LoggerContext, 0);
}
else if( v2 && (*((_DWORD *)LoggerContext + 208) & 8) != 0 )
{
EtwpRealtimeSendEmptyMarker((__int64)LoggerContext);
}
return v28;
}Referenced by:
EtwpLogger