SendCaptureStateNotificationsWorker
VOID __fastcall SendCaptureStateNotificationsWorker(INT64 a1){
__int64 v2;
volatile INT64 *v3;
unsigned int v4;
_GUID *PoolWithTag;
_GUID *v6;
_ETW_GUID_ENTRY *GuidEntryByGuid;
_ETW_GUID_ENTRY *v8;
_ETHREAD *CurrentThread;
_LIST_ENTRY *Flink;
int v11;
unsigned __int16 *p_LoggerId;
__int64 v13;
unsigned __int8 v14;
_ETWP_NOTIFICATION_HEADER *DataBlock;
__int64 v16;
_GUID *Guid;
__int64 v18;
_OWORD v19[4];
_TRACE_ENABLE_INFO EnableInfo;
INT64 v21[2];
DataBlock = 0i64;
*(_OWORD *)v21 = 0i64;
memset((INT64)v19 + 8, 0i64);
v3 = (volatile INT64 *)(a1 + 704);
v18 = *(_QWORD *)(a1 + 1064);
v2 = v18;
ExAcquirePushLockExclusiveEx(a1 + 704, 0i64);
*(_DWORD *)(v18 + 64) = 0;
if( !*(_DWORD *)(a1 + 336)
|| (v4 = *(unsigned __int16 *)(v2 + 16), !(_WORD)v4)
|| (v16 = *(unsigned __int16 *)(v2 + 16),
PoolWithTag = (_GUID *)ExAllocatePoolWithTag(PagedPool, 16i64 * v4, 0x74777445ui64),
(Guid = PoolWithTag) == 0i64) )
{
LABEL_24:
if( (_InterlockedExchangeAdd64(v3, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v3);
KeAbPostRelease((PVOID)v3);
goto LABEL_27;
}
memmove((UINT8 *)PoolWithTag, *(UINT8 **)(v2 + 24), 16i64 * v4);
if( (_InterlockedExchangeAdd64(v3, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(a1 + 704));
KeAbPostRelease((PVOID)(a1 + 704));
*(_QWORD *)&v19[0] = 0x7800000003i64;
v6 = Guid;
do
{
GuidEntryByGuid = EtwpFindGuidEntryByGuid(*(_ETW_SILODRIVERSTATE **)(a1 + 1080), v6, EtwTraceGuidType);
v8 = GuidEntryByGuid;
if( GuidEntryByGuid )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockExclusiveEx((UINT64)&GuidEntryByGuid->Lock, 0i64);
Flink = v8->RegListHead.Flink;
v8->LockOwner = (_ETHREAD *)KeGetCurrentThread();
for( *(_GUID *)((char *)&v19[2] + 8) = *v6; Flink != &v8->RegListHead; Flink = Flink->Flink )
{
if( (BYTE2(Flink[6].Flink) & 1) == 0 )
{
v11 = 0;
p_LoggerId = &v8->EnableInfo[0].LoggerId;
do
{
v14 = BYTE4(Flink[6].Flink);
if( ((unsigned __int8)(1 << v11) & v14) != 0 )
{
if( *(_DWORD *)(p_LoggerId - 3) )
{
if( *p_LoggerId == *(_DWORD *)a1 )
{
EtwpComputeRegEntryEnableInfo((_ETW_REG_ENTRY *)Flink, &EnableInfo);
EnableInfo.LoggerId = *(_WORD *)a1;
EnableInfo.IsEnabled = 2;
if( (int)EtwpBuildNotificationPacket((__int64)v8, v19, v14, (__int64 *)&DataBlock) >= 0 )
{
EtwpSendDataBlock((_ETW_REG_ENTRY *)Flink, DataBlock);
EtwpUnreferenceDataBlock((volatile INT32 *)DataBlock);
}
}
}
}
++v11;
p_LoggerId += 16;
}
while( v11 < 8 );
}
}
v8->LockOwner = 0i64;
ExReleasePushLockEx((UINT64)&v8->Lock, 0i64);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
EtwpUnreferenceGuidEntry(v8);
}
++v6;
--v16;
}
while( v16 );
v13 = v18;
v3 = (volatile INT64 *)(a1 + 704);
if( *(_DWORD *)(a1 + 336) )
{
v21[1] = -1i64;
ExAcquirePushLockExclusiveEx((UINT64)v3, 0i64);
if( *(_WORD *)(v13 + 16) && !*(_DWORD *)(v13 + 64) )
{
ExSetTimer(*(_QWORD *)(v13 + 8), *(_QWORD *)v13, 0i64, (INT64)v21);
*(_DWORD *)(v13 + 64) = 1;
}
goto LABEL_24;
}
LABEL_27:
EtwpReleaseLoggerContext((unsigned int *)a1, 0);
}Referenced by:
No references.