EtwpNotifyGuid
NTSTATUS __stdcall EtwpNotifyGuid(
_ETW_SILODRIVERSTATE *SiloState,
_ETWP_NOTIFICATION_HEADER *DataBlock,
INT8 RequestorMode){
_ETW_GUID_TYPE v3;
__int64 NotificationSize;
int v9;
unsigned __int64 v10;
unsigned int v11;
unsigned int v12;
unsigned int TargetPID;
_ETW_GUID_ENTRY *GuidEntryByGuid;
_ETWP_NOTIFICATION_HEADER *v15;
_ETW_GUID_ENTRY *v16;
_ETW_REG_ENTRY *p_RegListHead;
NTSTATUS v18;
_ETW_REG_ENTRY *i;
unsigned __int16 Flags;
_ETWP_NOTIFICATION_HEADER *v21;
unsigned int ProcessId;
NTSTATUS v23;
PVOID v24;
bool v25;
unsigned int v26;
bool v27;
_ETWP_NOTIFICATION_HEADER *DataBlocka;
_ETWP_NOTIFICATION_HEADER *OutDataBlock;
_ETW_REG_ENTRY *RegEntryPtr;
INT64 a2;
PVOID Handle;
INT64 v33[18];
UINT16 v34;
unsigned int v35;
v3 = EtwTraceGuidType;
Handle = 0i64;
RegEntryPtr = 0i64;
OutDataBlock = 0i64;
DataBlocka = 0i64;
v35 = 0;
v27 = 0;
a2 = 0i64;
memset(v33, 0i64, 0x58u);
NotificationSize = DataBlock->NotificationSize;
if( (unsigned int)NotificationSize > 0x10000 )
return -1073741306;
if( DataBlock->NotificationType == EtwNotificationTypeFilteredPrivateLogger )
{
if( (unsigned int)NotificationSize < 0x78
|| (v10 = (DataBlock->SourceGuid[1].Data1 + 7) & 0xFFFFFFF8, v10 >= NotificationSize - 76) )
{
v9 = -2147483643;
goto LABEL_60;
}
v11 = *(unsigned int *)((char *)&DataBlock->SourceGuid[1].Data1 + v10);
if( v11 )
{
a2 = (INT64)&DataBlock->SourceGuid[1].Data2 + v10;
if( EtwpValidateTraceControlFilterDescriptors(v11, a2, (unsigned int)(NotificationSize - (v10 + 76)), (INT64)v33) )
{
v9 = -1073741811;
goto LABEL_60;
}
}
DataBlock->NotificationType = EtwNotificationTypePrivateLogger;
}
DataBlock->SourcePID = (unsigned int)PsGetCurrentThreadProcessId();
if( DataBlock->NotificationType == EtwNotificationTypePrivateLogger )
{
if( DataBlock->NotificationSize < 0xF8 )
{
v9 = -1073741789;
goto LABEL_60;
}
v12 = 128;
v27 = EtwpCheckCurrentUserGuidAccess((_GUID *)&unk_1400105C8, 0x80ui64) < 0;
DataBlock->DestinationGuid = (_GUID)PrivateLoggerNotificationGuid;
}
else
{
v12 = 4;
v3 = EtwNotificationGuidType;
}
TargetPID = DataBlock->TargetPID;
DataBlock->ReplyCount = 0;
v26 = TargetPID;
GuidEntryByGuid = EtwpFindGuidEntryByGuid(SiloState, &DataBlock->DestinationGuid, v3);
v15 = 0i64;
v16 = GuidEntryByGuid;
if( !GuidEntryByGuid )
{
v9 = -1073741163;
goto LABEL_60;
}
if( RequestorMode )
{
if( DataBlock->NotificationType != EtwNotificationTypePrivateLogger )
{
v9 = EtwpAccessCheck(GuidEntryByGuid->SecurityDescriptor, v12, 0i64);
if( v9 < 0 )
goto LABEL_59;
}
}
KeEnterCriticalRegion();
ExAcquirePushLockExclusiveEx(&v16->Lock, 0i64);
p_RegListHead = (_ETW_REG_ENTRY *)&v16->RegListHead;
v16->LockOwner = (_ETHREAD *)KeGetCurrentThread();
if( (_ETW_REG_ENTRY *)p_RegListHead->RegList.Flink == p_RegListHead )
{
v9 = -1073741162;
goto LABEL_53;
}
if( DataBlock->ReplyRequested )
{
v9 = EtwpCreateUmReplyObject(v16, &Handle, &RegEntryPtr);
if( v9 < 0 )
goto LABEL_53;
DataBlock->ReplyHandle = (unsigned __int64)RegEntryPtr;
}
v18 = EtwpAllocDataBlock(DataBlock->NotificationSize, DataBlock, &OutDataBlock);
if( v18 < 0 )
{
LABEL_27:
v9 = -1073741801;
goto LABEL_53;
}
for( i = (_ETW_REG_ENTRY *)p_RegListHead->RegList.Flink; i != p_RegListHead; i = (_ETW_REG_ENTRY *)i->RegList.Flink )
{
Flags = i->Flags;
v21 = OutDataBlock;
if( (Flags & 2) == 0
|| (Flags & 0x40) != 0
|| a2 && !EtwpApplyTransientFilters(i, a2, v33[10], (_ETW_FILTER_STRING_TOKEN **)v33)
|| v26 && (unsigned int)PsGetProcessId(i->Process) != v26
|| v27 && (v18 = EtwpCheckCurrentUserProcessAccess(i->Process), v18 < 0) )
{
v15 = 0i64;
}
else
{
if( DataBlock->NotificationType == EtwNotificationTypePrivateLogger )
{
v34 = 0;
if( *(_DWORD *)&DataBlock->SourceGuid[1].Data2 != 1 )
{
ProcessId = (unsigned int)PsGetProcessId(i->Process);
v15 = 0i64;
v18 = EtwpDemuxPrivateTraceHandle(
(PLEARNING_MODE_DATA *)ProcessId,
*(_WORD *)DataBlock->SourceGuid[1].Data4 & 0x7FFF,
&v34);
if( v18 < 0 )
continue;
v15 = DataBlocka;
if( DataBlocka )
{
EtwpUnreferenceDataBlock(DataBlocka);
v15 = 0i64;
DataBlocka = 0i64;
}
v18 = EtwpAllocDataBlock(DataBlock->NotificationSize, DataBlock, &DataBlocka);
if( v18 < 0 )
goto LABEL_27;
v21 = DataBlocka;
*(_WORD *)DataBlocka->SourceGuid[1].Data4 = v34;
}
}
v23 = EtwpSendDataBlock(i, v21);
v15 = 0i64;
if( v23 < 0 )
v18 = v23;
else
++v35;
}
}
v9 = 0;
v24 = Handle;
v25 = v35 == 0;
DataBlock->ReplyCount = v35;
if( v25 )
v9 = v18;
DataBlock->ReplyHandle = (unsigned __int64)v24;
LABEL_53:
v16->LockOwner = (_ETHREAD *)v15;
ExReleasePushLockEx((_DWORD)v16 + 408, 0);
KeLeaveCriticalRegion();
if( OutDataBlock )
EtwpUnreferenceDataBlock(OutDataBlock);
if( DataBlocka )
EtwpUnreferenceDataBlock(DataBlocka);
if( RegEntryPtr )
HalPutDmaAdapter((PADAPTER_OBJECT)RegEntryPtr);
LABEL_59:
EtwpUnreferenceGuidEntry(v16);
LABEL_60:
EtwpFreeFilterInfo((_ETW_FILTER_INFO *)v33);
return v9;
}Referenced by:
EtwpSendSessionNotification
NtTraceControl