EtwpRealtimeDeliverBuffer
NTSTATUS __stdcall EtwpRealtimeDeliverBuffer(_WMI_LOGGER_CONTEXT *LoggerContext, _WMI_BUFFER_HEADER *Buffer){
_ETW_RT_EVENT_LOSS NewRTEventsLost;
_ETW_REALTIME_CONSUMER *v5;
_LIST_ENTRY *p_Consumers;
_LIST_ENTRY *Flink;
__int16 v8;
_ETW_REALTIME_CONSUMER *v9;
NTSTATUS v10;
unsigned __int8 Flags;
char v12;
bool v14;
__int16 v15;
char v16;
char v17;
NewRTEventsLost = LoggerContext->NewRTEventsLost;
v16 = 0;
v17 = 0;
v5 = 0i64;
if( NewRTEventsLost )
{
if( NewRTEventsLost == EtwRtBackupLost )
{
v15 = 8;
}
else
{
v14 = NewRTEventsLost == EtwRtBufferLost;
v15 = 4;
if( !v14 )
v15 = 2;
}
*((_WORD *)Buffer + 26) |= v15;
v17 = 1;
}
p_Consumers = &LoggerContext->Consumers;
Flink = LoggerContext->Consumers.Flink;
if( Flink == &LoggerContext->Consumers )
return -1073741823;
do
{
v8 = *((_WORD *)Buffer + 26);
v9 = (_ETW_REALTIME_CONSUMER *)Flink;
Flink = Flink->Flink;
if( (v9->Flags & 2) != 0 )
*((_WORD *)Buffer + 26) = v8 | 4;
v10 = EtwpRealtimeInjectEtwBuffer(LoggerContext, v9, Buffer);
*((_WORD *)Buffer + 26) = v8;
if( v10 < 0 )
{
if( v10 == -1073741764 )
{
v9->NextNotDelivered = v5;
v5 = v9;
}
else
{
LABEL_17:
EtwpDisassociateConsumer(LoggerContext, v9);
}
v12 = v16;
continue;
}
Flags = v9->Flags;
if( (Flags & 2) != 0 )
{
Flags &= ~2u;
v9->Flags = Flags;
v8 = *((_WORD *)Buffer + 26);
}
v12 = 1;
v16 = 1;
if( (Flags & ((v8 & 1) != 0)) != 0 )
goto LABEL_17;
}
while( Flink != p_Consumers );
if( !v12 )
return -1073741823;
if( v17 )
LoggerContext->NewRTEventsLost = EtwRtEventNoLoss;
if( *((_WORD *)Buffer + 27) != 6 )
++LoggerContext->RealTimeBuffersDelivered;
while( v5 )
{
v5->Flags |= 2u;
++v5->BuffersLost;
v5 = (_ETW_REALTIME_CONSUMER *)v5->NextNotDelivered;
}
return 0;
}Referenced by:
EtwpFlushBufferToRealtime
EtwpRealtimeFlushSavedBuffers
EtwpRealtimeSendEmptyMarker
EtwpRealtimeUpdateReferenceTime