EtwpGetLoggerInfoFromContext
NTSTATUS __stdcall EtwpGetLoggerInfoFromContext(
_WMI_LOGGER_INFORMATION *LoggerInfo,
_WMI_LOGGER_CONTEXT *LoggerContext){
unsigned int BuffersWritten;
__int64 v5;
__int16 LoggerId;
_ETHREAD *LoggerThread;
char PreviousMode;
__int64 Length;
char v10;
__int64 v11;
__int64 v13;
_ETW_SILODRIVERSTATE *SiloState;
PERFINFO_GROUPMASK GroupMask[4];
__int128 v16;
if( (LoggerContext->LoggerMode & 0x2000000) != 0 )
{
v13 = BYTE2(LoggerContext->$B4A554AA980A5EA7570A49F99BAE17BC::_bf_0);
SiloState = LoggerContext->SiloState;
*(_OWORD *)GroupMask = *(_OWORD *)SiloState->SystemLoggerSettings.EtwpGroupMasks[v13].Masks;
v16 = *(_OWORD *)&SiloState->SystemLoggerSettings.EtwpGroupMasks[v13].Masks[4];
EtwpMapEnableFlags(GroupMask, 0);
LoggerInfo[18] = GroupMask[0];
}
else
{
LoggerInfo[18] = 0;
}
*(_GUID *)(LoggerInfo + 6) = LoggerContext->InstanceGuid;
LoggerInfo[16] = LoggerContext->LoggerMode;
LoggerInfo[15] = LoggerContext->MaximumFileSize;
LoggerInfo[17] = LoggerContext->FlushTimer;
LoggerInfo[12] = LoggerContext->BufferSize >> 10;
LoggerInfo[24] = LoggerContext->NumberOfBuffers;
LoggerInfo[13] = LoggerContext->MinimumBuffers;
LoggerInfo[14] = LoggerContext->MaximumBuffers;
LoggerInfo[26] = LoggerContext->EventsLost;
LoggerInfo[25] = LoggerContext->BuffersAvailable;
BuffersWritten = LoggerContext->BuffersWritten;
if( BuffersWritten <= LoggerContext->RealTimeBuffersDelivered )
BuffersWritten = LoggerContext->RealTimeBuffersDelivered;
LoggerInfo[27] = BuffersWritten;
*((_QWORD *)LoggerInfo + 10) = 0i64;
v5 = (LoggerContext->Flags >> 4) & 1;
*((_QWORD *)LoggerInfo + 10) = v5;
*((_QWORD *)LoggerInfo + 10) = v5 | (LoggerContext->Flags >> 26) & 2;
LoggerInfo[28] = LoggerContext->LogBuffersLost;
LoggerInfo[29] = LoggerContext->RealTimeBuffersLost;
LoggerInfo[40] = LoggerContext->NumConsumers;
LoggerInfo[19] = LoggerContext->FlushThreshold;
if( LoggerContext->LoggerId )
LoggerId = LoggerContext->LoggerId;
else
LoggerId = -1;
*((_WORD *)LoggerInfo + 4) = LoggerId;
LoggerThread = LoggerContext->LoggerThread;
if( LoggerThread )
*((_QWORD *)LoggerInfo + 15) = LoggerThread->Cid.UniqueThread;
LoggerInfo[10] = LoggerContext->ClockType;
PreviousMode = KeGetCurrentThread()->PreviousMode;
ExAcquirePushLockExclusiveEx(&LoggerContext->LoggerLock, 0i64);
Length = LoggerContext->LogFileName.Length;
if( (_WORD)Length && *((_WORD *)LoggerInfo + 65) )
{
if( PreviousMode )
ProbeForWrite(*((_QWORD *)LoggerInfo + 17), Length + 2, 2i64);
RtlCopyUnicodeString((PUNICODE_STRING)LoggerInfo + 8, &LoggerContext->LogFileName);
}
v10 = _InterlockedExchangeAdd64(&LoggerContext->LoggerLock._bf_0, 0xFFFFFFFFFFFFFFFFui64);
if( (v10 & 2) != 0 && (v10 & 4) == 0 )
ExfTryToWakePushLock(&LoggerContext->LoggerLock);
KeAbPostRelease(&LoggerContext->LoggerLock);
v11 = LoggerContext->LoggerName.Length;
if( (_WORD)v11
&& *((_WORD *)LoggerInfo + 73)
&& !(unsigned __int8)RtlEqualUnicodeString(&LoggerContext->LoggerName, (PCUNICODE_STRING)LoggerInfo + 9, 0) )
{
if( PreviousMode )
ProbeForWrite(*((_QWORD *)LoggerInfo + 19), v11 + 2, 2i64);
RtlCopyUnicodeString((PUNICODE_STRING)LoggerInfo + 9, &LoggerContext->LoggerName);
}
return 0;
}Referenced by:
EtwpFlushTrace
EtwpStartLogger
EtwpStopTrace
EtwpUpdateTrace