EtwpFlushActiveBuffers
NTSTATUS __stdcall EtwpFlushActiveBuffers(_WMI_LOGGER_CONTEXT *LoggerContext, UINT64 FlushAll){
int v2;
_WMI_BUFFER_HEADER **ScratchArray;
int v5;
int v6;
__int64 v7;
__int64 v8;
_QWORD *v9;
$B90001D19DE6081274E09A4BBDE43C18 *v10;
unsigned __int64 v11;
__int64 v12;
unsigned int v13;
signed __int64 i;
signed __int64 v15;
unsigned __int64 v16;
_QWORD **v17;
__int64 v18;
_WMI_BUFFER_HEADER **v19;
int v20;
int v21;
__int64 v22;
__int64 v23;
_WMI_BUFFER_HEADER *v24;
_WMI_BUFFER_HEADER *v25;
unsigned int v26;
UINT16 v27;
NTSTATUS v28;
_QWORD *v29;
UINT16 v30;
unsigned int v31;
__int64 v33;
__int64 v34;
__int64 v35;
int v36;
__int64 v37;
__int64 v38;
char v39;
int v40;
char v41[256];
v2 = FlushAll;
v40 = FlushAll;
memset(v41, 0i64, sizeof(v41));
if( !LoggerContext->LogFileHandle && !LoggerContext->RealtimeLogfileHandle )
{
if( LoggerContext->FlushTimer )
EtwpRequestFlushTimer(LoggerContext, 0);
return 259;
}
ScratchArray = (_WMI_BUFFER_HEADER **)v41;
v39 = 0;
v5 = 0;
if( LoggerContext->ScratchArray )
ScratchArray = LoggerContext->ScratchArray;
if( (LoggerContext->LoggerMode & 0x40000) != 0 )
{
v37 = _InterlockedExchange64((volatile __int64 *)&LoggerContext->144, 0i64);
if( v37 )
{
*ScratchArray = (_WMI_BUFFER_HEADER *)v37;
v5 = 1;
}
goto LABEL_26;
}
v6 = EtwpQueryUsedProcessorCount(LoggerContext) - 1;
v7 = v6;
if( v6 < 0 )
goto LABEL_25;
v8 = (__int64)v6 << 6;
v9 = ScratchArray;
do
{
if( (LoggerContext->LoggerMode & 0x10000000) != 0 )
v10 = &LoggerContext->144;
else
v10 = ($B90001D19DE6081274E09A4BBDE43C18 *)&(*(_EX_FAST_REF **)((char *)&LoggerContext->SiloState->ProcessorBlocks->ProcessorBuffers
+ v8))[LoggerContext->LoggerId];
v11 = v10->CurrentBuffer.Value & 0xFFFFFFFFFFFFFFF0ui64;
if( v11 )
{
if( v40 )
{
v13 = _InterlockedExchangeAdd((volatile signed __int32 *)(v11 + 8), LoggerContext->BufferSize);
if( v13 <= LoggerContext->BufferSize )
*(_DWORD *)(v11 + 4) = v13;
_m_prefetchw(v10);
for( i = v10->CurrentBuffer.Value; (v11 ^ i) <= 0xF; i = v15 )
{
v15 = _InterlockedCompareExchange64((volatile signed __int64 *)v10, 0i64, i);
if( i == v15 )
break;
}
v16 = i & 0xFFFFFFFFFFFFFFF0ui64;
if( (i & 0xFFFFFFFFFFFFFFF0ui64) == v11 )
{
_InterlockedExchangeAdd((volatile signed __int32 *)(v16 + 12), -(i & 0xF));
EtwpPrepareDirtyBuffer(LoggerContext, (_WMI_BUFFER_HEADER *)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->CurrentBuffer.Value & 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(LoggerContext);
LABEL_26:
v17 = 0i64;
if( v5 > 0 )
{
v18 = v5;
v19 = &ScratchArray[v5 - 1];
do
{
v20 = 1;
v21 = 0;
v22 = 1i64;
v23 = 0i64;
while( v22 < v18 )
{
v33 = *((_QWORD *)ScratchArray[v22] + 2);
v34 = *((_QWORD *)ScratchArray[v23] + 2);
v35 = v22;
if( v33 <= v34 )
v35 = v23;
v23 = v35;
v36 = v20;
if( v33 <= v34 )
v36 = v21;
++v20;
++v22;
v21 = v36;
}
v24 = ScratchArray[v23];
v25 = (_WMI_BUFFER_HEADER *)*((_QWORD *)v24 + 4);
ScratchArray[v23] = v25;
if( !v25 )
{
--v18;
ScratchArray[v23] = *v19--;
}
if( *((int *)v24 + 3) <= 0 && (v26 = *((_DWORD *)v24 + 1), v26 <= 0x48) && (v26 || *((_DWORD *)v24 + 2) <= 0x48u) )
{
EtwpCompleteBuffer(LoggerContext, v24, 0i64);
}
else
{
*((_QWORD *)v24 + 4) = v17;
v17 = (_QWORD **)((char *)v24 + 32);
}
}
while( v18 > 0 );
v2 = v40;
}
v27 = 0;
v28 = 0;
if( v17 )
{
v29 = *v17;
do
{
v30 = v40 != 0;
if( v29 )
v30 = v27;
v27 = v30;
EtwpAdjustFreeBuffers(LoggerContext);
EtwpWaitForBufferReferenceCount((_WMI_BUFFER_HEADER *)(v17 - 4));
v31 = EtwpFlushBuffer(LoggerContext, (_WMI_BUFFER_HEADER *)(v17 - 4), v27);
EtwpCompleteBuffer(LoggerContext, (_WMI_BUFFER_HEADER *)(v17 - 4), v31);
v17 = (_QWORD **)v29;
if( v29 )
v29 = (_QWORD *)*v29;
if( v31 )
v28 = v31;
}
while( v17 );
if( LoggerContext->FlushTimer && v40 && ((LoggerContext->LoggerMode & 0x10000000) == 0 || v39) )
EtwpRequestFlushTimer(LoggerContext, 0);
}
else if( v2 && (LoggerContext->Flags & 8) != 0 )
{
EtwpRealtimeSendEmptyMarker(LoggerContext);
}
return v28;
}Referenced by:
EtwpLogger