EtwpClearSessionAndUnreferenceEntry
INT64 __fastcall EtwpClearSessionAndUnreferenceEntry(INT64 a1, INT64 a2, CHAR a3){
CHAR v3;
_ETHREAD *CurrentThread;
int v6;
unsigned int v7;
UINT64 v8;
INT64 v9;
INT64 v11;
__int64 v12;
unsigned __int8 v13;
__int64 v14;
int v15;
__int64 v16;
int v17;
unsigned __int8 v18;
unsigned __int8 v19;
__int128 v20;
_QWORD *v21;
_ETWP_NOTIFICATION_HEADER *v22;
_ETW_REG_ENTRY *v23;
char *v24;
char v25;
char v26;
unsigned int SchematizedFilterSize;
unsigned int v28;
unsigned int v29;
int v30;
_ETW_GUID_ENTRY *GuidEntry;
_ETHREAD *v32;
char v33;
char v34;
_ETWP_NOTIFICATION_HEADER *DataBlock;
int v37;
__int64 v38;
int v39;
int v40;
__int128 v41;
__int128 v42;
_TRACE_ENABLE_INFO Source2;
v40 = a1;
memset(&Source2, 0, sizeof(Source2));
v3 = a3;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v6 = a1;
v33 = 0;
DataBlock = 0i64;
v7 = 0;
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockExclusiveEx(a2 + 408, 0i64);
*(_QWORD *)(a2 + 416) = KeGetCurrentThread();
v39 = *(unsigned __int16 *)(a2 + 88);
if( v39 == v6 )
*(_OWORD *)(a2 + 80) = 0i64;
v8 = 0i64;
v9 = a2 + 128;
while( *(_DWORD *)v9 != 1 || *(unsigned __int16 *)(v9 + 6) != v6 )
{
v8 = (unsigned int)(v8 + 1);
v9 += 32i64;
if( (unsigned int)v8 >= 8 )
{
v34 = 0;
goto LABEL_7;
}
}
*(_DWORD *)v9 = 0;
v11 = a2 + 132;
v12 = 0i64;
v41 = 0ui64;
v13 = 0;
*(_QWORD *)&v42 = 0i64;
v14 = -1i64;
v15 = 1 << v8;
v16 = 8i64;
*((_QWORD *)&v42 + 1) = -1i64;
v17 = 0;
do
{
if( *(_DWORD *)(v11 - 4) )
{
v18 = *(_BYTE *)v11;
v19 = v13;
LODWORD(v41) = 1;
if( v13 <= v18 )
v19 = v18;
v12 |= *(_QWORD *)(v11 + 12);
v14 &= *(_QWORD *)(v11 + 20);
v13 = v19;
v17 |= *(_DWORD *)(v11 + 4);
}
v11 += 32i64;
--v16;
}
while( v16 );
*(_QWORD *)&v42 = v12;
BYTE4(v41) = v13;
*((_QWORD *)&v42 + 1) = v14;
v20 = v42;
DWORD2(v41) = v17;
*(_OWORD *)(a2 + 96) = v41;
*(_OWORD *)(a2 + 112) = v20;
EtwpUpdateFilterData(a2, v8, 0i64, 1, 0i64);
v34 = 1;
v21 = *(_QWORD **)(a2 + 56);
if( v21 != (_QWORD *)(a2 + 56) )
{
v22 = DataBlock;
LOBYTE(v15) = ~(_BYTE)v15;
v37 = v15;
do
{
if( v3 )
{
v32 = (_ETHREAD *)KeGetCurrentThread();
v23 = (_ETW_REG_ENTRY *)(v21 - 2);
v24 = (char *)v21 + 85;
--*((_WORD *)v32 + 242);
ExAcquirePushLockExclusiveEx(v21[2] + 408i64, 0i64);
v22 = DataBlock;
v33 = 1;
*(_QWORD *)(v21[2] + 416i64) = KeGetCurrentThread();
}
else
{
v23 = (_ETW_REG_ENTRY *)v21;
v24 = (char *)v21 + 100;
}
v25 = *v24;
v21 = (_QWORD *)*v21;
v26 = *v24 & v15;
*v24 = v26;
if( ((v23->Flags & 8) == 0 || v39 == v40) && v26 != v25 )
{
EtwpComputeRegEntryEnableInfo(v23, &Source2);
SchematizedFilterSize = EtwpGetSchematizedFilterSize((_ETW_GUID_ENTRY *)a2, v23->EnableMask);
v28 = SchematizedFilterSize;
v29 = 120;
if( SchematizedFilterSize )
v29 = SchematizedFilterSize + 136;
if( v22 )
{
if( v22->NotificationSize != v29 || RtlCompareMemory(&v22[1], &Source2, 0x20ui64) != 32 )
{
EtwpUnreferenceDataBlock((volatile INT32 *)v22);
v22 = 0i64;
DataBlock = 0i64;
}
if( v22 )
goto LABEL_29;
}
v30 = EtwpAllocDataBlock(v29, 0i64, &DataBlock);
v22 = DataBlock;
v7 = v30;
if( v30 >= 0 )
{
DataBlock->NotificationType = EtwNotificationTypeEnable;
v22->NotificationSize = v29;
GuidEntry = v23->GuidEntry;
BYTE3(v38) = 0;
v22->DestinationGuid = GuidEntry->Guid;
*(_TRACE_ENABLE_INFO *)&v22[1].NotificationType = Source2;
v22[1].DestinationGuid.Data1 = *(_BYTE *)(a2 + 91) & 1;
LOWORD(v38) = *(_WORD *)(a2 + 88);
BYTE2(v38) = *(_BYTE *)(a2 + 90);
HIDWORD(v38) = *(_DWORD *)(a2 + 80);
*(_QWORD *)&v22[1].TargetPID = v38;
if( v28 )
{
*(_DWORD *)&v22[1].SourceGuid.Data2 = 0x80000000;
v22[1].SourceGuid.Data1 = v28;
*(_QWORD *)v22[1].DestinationGuid.Data4 = 136i64;
EtwpCopySchematizedFilters(
(_EVENT_FILTER_HEADER *)v22[1].SourceGuid.Data4,
(_ETW_GUID_ENTRY *)a2,
v23->EnableMask);
*(_DWORD *)&v22[1].DestinationGuid.Data2 = 1;
}
else
{
*(_DWORD *)&v22[1].DestinationGuid.Data2 = 0;
}
}
if( v22 )
LABEL_29:
v7 = EtwpSendDataBlock(v23, v22);
LOBYTE(v15) = v37;
}
if( v33 )
{
v23->GuidEntry->LockOwner = 0i64;
ExReleasePushLockEx((UINT64)&v23->GuidEntry->Lock, 0i64);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
v22 = DataBlock;
v33 = 0;
}
v3 = a3;
}
while( v21 != (_QWORD *)(a2 + 56) );
if( v22 )
EtwpUnreferenceDataBlock((volatile INT32 *)v22);
}
LABEL_7:
*(_QWORD *)(a2 + 416) = 0i64;
ExReleasePushLockEx(a2 + 408, 0i64);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
if( v34 == 1 )
EtwpUnreferenceGuidEntry((PVOID)a2);
return v7;
}Referenced by:
EtwpDisableTraceProviders