EtwpStopLoggerInstance
INT64 __fastcall EtwpStopLoggerInstance(_WMI_LOGGER_CONTEXT *LoggerContext){
_ETW_SILODRIVERSTATE *v1;
int v3;
unsigned int v4;
_ETHREAD *CurrentThread;
__int64 v6;
int v7;
__int64 v9;
UINT64 v10;
v1 = (_ETW_SILODRIVERSTATE *)*((_QWORD *)LoggerContext + 135);
_InterlockedOr((volatile signed __int32 *)LoggerContext + 208, 0x40u);
if( (*((_DWORD *)LoggerContext + 3) & 0x2000000) != 0 )
EtwpUpdateLoggerGroupMasks((__int64)LoggerContext, 0i64);
v3 = *((_DWORD *)LoggerContext + 208);
if( (v3 & 0x20) == 0 )
{
EtwpDisableTraceProviders(v1, *(_DWORD *)LoggerContext);
v3 = *((_DWORD *)LoggerContext + 208);
}
if( (v3 & 0x4000) != 0 )
{
v4 = 0;
while( v1->EtwpSecurityLoggers[v4] != *(_DWORD *)LoggerContext )
{
if( ++v4 >= 8 )
goto LABEL_11;
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockExclusiveEx((UINT64)&v1->EtwpSecurityProviderGuidEntry.Lock, 0i64);
v1->EtwpSecurityProviderEnableMask &= ~(1 << v4);
v6 = v4;
*(_OWORD *)&v1->EtwpSecurityProviderGuidEntry.EnableInfo[v6].IsEnabled = 0i64;
*(_OWORD *)&v1->EtwpSecurityProviderGuidEntry.EnableInfo[v6].MatchAnyKeyword = 0i64;
v1->EtwpSecurityLoggers[v4] = 0;
v1->EtwpSecurityProviderGuidEntry.LockOwner = 0i64;
ExReleasePushLockEx((UINT64)&v1->EtwpSecurityProviderGuidEntry.Lock, 0i64);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
}
LABEL_11:
if( (*((_DWORD *)LoggerContext + 3) & 0x400) == 0 )
{
v7 = *((_DWORD *)LoggerContext + 208);
if( (v7 & 0x800) != 0 )
{
EtwpLogPmcCounterRundown(LoggerContext, *(_DWORD *)LoggerContext);
v7 = *((_DWORD *)LoggerContext + 208);
}
if( (v7 & 0x1000000) != 0 )
EtwpStackRundown(*((INT64 ***)LoggerContext + 124), (UINT64)v1, *(_DWORD *)LoggerContext);
}
if( !_InterlockedExchange((volatile __int32 *)LoggerContext + 84, 0) )
return 2147483685i64;
v9 = *((_QWORD *)LoggerContext + 133);
if( v9 )
{
v10 = *(_QWORD *)(v9 + 8);
if( v10 )
ExCancelTimer(v10);
}
v1->EtwpLoggerContext[*(_DWORD *)LoggerContext] = (_WMI_LOGGER_CONTEXT *)((unsigned __int64)LoggerContext | 1);
if( ObGetCurrentIrql() > 2u )
{
if( !_interlockedbittestandset((volatile signed __int32 *)LoggerContext + 209, 8u) )
KeInsertQueueDpc((PRKDPC)((char *)LoggerContext + 584), 0i64, 0i64);
}
else
{
KeSetEvent((PRKEVENT)((char *)LoggerContext + 496), 0);
}
EtwpSendSessionNotification((__int64)LoggerContext, 2u, 0);
return 0i64;
}Referenced by:
EtwpLogger
EtwpStartLogger
EtwpStopTrace