SendCaptureStateNotificationsWorker
VOID __stdcall SendCaptureStateNotificationsWorker(_WMI_LOGGER_CONTEXT *LoggerContext){
__int64 v2;
_EX_PUSH_LOCK *p_LoggerLock;
unsigned int v4;
VOID **PoolWithTag;
_GUID *v6;
_ETW_GUID_ENTRY *GuidEntryByGuid;
_ETW_GUID_ENTRY *v8;
_ETHREAD *CurrentThread;
_LIST_ENTRY *Flink;
int v11;
unsigned __int16 *p_LoggerId;
__int64 v13;
UINT8 EnableMask;
_ETWP_NOTIFICATION_HEADER *NotificationPacket;
__int64 v16;
_GUID *Guid;
PERIODIC_CAPTURE_STATE_CONTEXT *PeriodicCaptureStateContext;
_ETW_ENABLE_NOTIFICATION_PACKET EnableNotification;
_EXT_SET_PARAMETERS_V0 Parameters;
NotificationPacket = 0i64;
Parameters = 0i64;
memset(&EnableNotification.gap0[8], 0i64, 0x70u);
p_LoggerLock = &LoggerContext->LoggerLock;
PeriodicCaptureStateContext = LoggerContext->PeriodicCaptureStateContext;
v2 = (__int64)PeriodicCaptureStateContext;
ExAcquirePushLockExclusiveEx(&LoggerContext->LoggerLock, 0i64);
PeriodicCaptureStateContext->TimerState = EtwpPeriodicTimerUnset;
if( !LoggerContext->CollectionOn
|| (v4 = *(unsigned __int16 *)(v2 + 16), !(_WORD)v4)
|| (v16 = *(unsigned __int16 *)(v2 + 16),
PoolWithTag = ExAllocatePoolWithTag(1ui64, 16i64 * v4, 1953985605i64),
(Guid = (_GUID *)PoolWithTag) == 0i64) )
{
LABEL_24:
if( (_InterlockedExchangeAdd64(&p_LoggerLock->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(p_LoggerLock);
KeAbPostRelease(p_LoggerLock);
goto LABEL_27;
}
memmove(PoolWithTag, *(const VOID **)(v2 + 24), 16 * v4);
if( (_InterlockedExchangeAdd64(&p_LoggerLock->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(&LoggerContext->LoggerLock);
KeAbPostRelease(&LoggerContext->LoggerLock);
*(_DWORD *)EnableNotification.gap0 = 3;
*(_DWORD *)&EnableNotification.gap0[4] = 120;
v6 = Guid;
do
{
GuidEntryByGuid = EtwpFindGuidEntryByGuid(LoggerContext->SiloState, v6, EtwTraceGuidType);
v8 = GuidEntryByGuid;
if( GuidEntryByGuid )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(&GuidEntryByGuid->Lock, 0i64);
Flink = v8->RegListHead.Flink;
v8->LockOwner = (_ETHREAD *)KeGetCurrentThread();
for( *(_GUID *)&EnableNotification.gap0[40] = *v6; Flink != &v8->RegListHead; Flink = Flink->Flink )
{
if( (BYTE2(Flink[6].Flink) & 1) == 0 )
{
v11 = 0;
p_LoggerId = &v8->EnableInfo[0].LoggerId;
do
{
EnableMask = BYTE4(Flink[6].Flink);
if( ((unsigned __int8)(1 << v11) & EnableMask) != 0 )
{
if( *(_DWORD *)(p_LoggerId - 3) )
{
if( *p_LoggerId == LoggerContext->LoggerId )
{
EtwpComputeRegEntryEnableInfo((_ETW_REG_ENTRY *)Flink, &EnableNotification.EnableInfo);
EnableNotification.EnableInfo.LoggerId = LoggerContext->LoggerId;
EnableNotification.EnableInfo.IsEnabled = 2;
if( EtwpBuildNotificationPacket(v8, &EnableNotification, EnableMask, &NotificationPacket) >= 0 )
{
EtwpSendDataBlock((_ETW_REG_ENTRY *)Flink, NotificationPacket);
EtwpUnreferenceDataBlock(NotificationPacket);
}
}
}
}
++v11;
p_LoggerId += 16;
}
while( v11 < 8 );
}
}
v8->LockOwner = 0i64;
ExReleasePushLockEx((_DWORD)v8 + 408, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
EtwpUnreferenceGuidEntry(v8);
}
++v6;
--v16;
}
while( v16 );
v13 = (__int64)PeriodicCaptureStateContext;
p_LoggerLock = &LoggerContext->LoggerLock;
if( LoggerContext->CollectionOn )
{
Parameters.NoWakeTolerance = -1i64;
ExAcquirePushLockExclusiveEx(p_LoggerLock, 0i64);
if( *(_WORD *)(v13 + 16) && !*(_DWORD *)(v13 + 64) )
{
ExSetTimer(*(_QWORD *)(v13 + 8), *(_QWORD *)v13, 0i64, (INT64)&Parameters);
*(_DWORD *)(v13 + 64) = 1;
}
goto LABEL_24;
}
LABEL_27:
EtwpReleaseLoggerContext(LoggerContext, 0);
}Referenced by:
No references.