EtwpEnableGuid
NTSTATUS __stdcall EtwpEnableGuid(
_ETW_SILODRIVERSTATE *SiloState,
_ETW_ENABLE_NOTIFICATION_PACKET *EnableNotificationPacket,
CHAR RequestorMode){
_ETWP_NOTIFICATION_HEADER *v3;
unsigned int v4;
_ETW_GUID_ENTRY *v8;
_ETWP_NOTIFICATION_HEADER *v9;
int updated;
__int64 FilterCount;
unsigned int IsEnabled;
_ETHREAD *CurrentThread;
unsigned int CurrentThreadProcessId;
unsigned __int8 PrivateSession;
const _GUID *v16;
bool v17;
_ETW_GUID_ENTRY *GuidEntryByGuid;
_WMI_LOGGER_CONTEXT *v19;
_ETHREAD *v20;
char v21;
int v22;
unsigned __int8 v23;
unsigned __int16 v24;
unsigned __int64 MatchAnyKeyword;
UINT64 NotificationSize;
NTSTATUS v28;
int v29;
_TRACE_ENABLE_INFO *EnableInfo;
_ETWP_NOTIFICATION_HEADER *v31;
unsigned __int8 v32;
_ETWP_NOTIFICATION_HEADER *v33;
_ETW_GUID_ENTRY *Flink;
__int64 v35;
__int64 *v36;
__int64 *v37;
UINT8 IsRegEntryAllowed;
UINT64 v39;
int v40;
UINT8 v41;
int v42;
UINT8 v43;
__int16 v44;
_ETWP_NOTIFICATION_HEADER *v45;
NTSTATUS v46;
_EX_PUSH_LOCK *v47;
int v48;
int v49;
const _EVENT_DESCRIPTOR *v50;
__int64 v51;
unsigned __int16 LoggerId;
__int64 v53;
INT64 v54;
INT64 v55;
_EJOB *v56;
_EJOB *v57;
_ETWP_NOTIFICATION_HEADER *v58;
__int64 v59;
__int64 v60;
signed __int64 v61;
_DWORD *v62;
char *v63;
int v64;
_ADAPTER_OBJECT *v65;
signed __int32 bf_0;
signed __int32 v67;
_ETHREAD *v68;
_ADAPTER_OBJECT *SessionById;
unsigned int ProcessId;
__int16 v71;
_ETHREAD *v72;
__int64 v73;
_BYTE *v74;
_WMI_LOGGER_CONTEXT **LoggerContextPtr;
_ETW_FILTER_INFO *FilterInfo;
_ETWP_NOTIFICATION_HEADER **NotificationBlockPtr;
UINT8 ControlCode;
UINT8 ControlCode_1;
char ControlCode_2;
__int16 ControlCode_3;
char ControlCode_5;
int v83;
_ETWP_NOTIFICATION_HEADER *OutDataBlock;
_WMI_LOGGER_CONTEXT *LoggerContext;
_ETWP_NOTIFICATION_HEADER *NotificationPacket;
__int16 v87[2];
_DWORD v88[3];
_ETWP_NOTIFICATION_HEADER *DataBlock;
UINT8 GuidEnableMask[4];
int v91;
__int64 *v92;
_EX_PUSH_LOCK *p_Lock;
_ETW_GUID_ENTRY *v94;
_ETW_REG_ENTRY *RegEntryPtr;
PVOID Handle;
_ETW_SESSION_INFO SessionInfo;
_ETWP_NOTIFICATION_HEADER *v98;
_ETWP_NOTIFICATION_HEADER *v99;
unsigned int *p_NotificationSize;
__int64 *v101;
_ETW_FILTER_INFO v102[24];
_KAPC_STATE v103;
_KAPC_STATE ApcState;
INT64 a6;
int v106;
v3 = 0i64;
v4 = EnableNotificationPacket->EnableInfo.EnableProperty & 0x20;
Handle = 0i64;
v83 = v4;
RegEntryPtr = 0i64;
v91 = 0;
ControlCode_2 = 0;
ControlCode = v4 != 0 ? 2 : 0;
GuidEnableMask[0] = 0;
ControlCode_3 = 0;
ControlCode_5 = 0;
v8 = 0i64;
LoggerContext = 0i64;
v87[0] = 0;
memset(v102, 0i64, 0x58u);
OutDataBlock = 0i64;
NotificationPacket = 0i64;
v9 = 0i64;
memset(&SessionInfo, 0, sizeof(SessionInfo));
updated = EtwpValidateEnableNotification(
SiloState,
EnableNotificationPacket,
RequestorMode,
&SessionInfo,
&LoggerContext,
v102);
if( updated < 0 )
goto LABEL_14;
FilterCount = EnableNotificationPacket->FilterCount;
IsEnabled = EnableNotificationPacket->EnableInfo.IsEnabled;
v88[0] = IsEnabled;
if( (unsigned int)(FilterCount - 1) <= 1 )
{
v60 = FilterCount;
v61 = (char *)&a6 - (char *)&EnableNotificationPacket[1];
v62 = &EnableNotificationPacket[1].gap0[8];
do
{
v63 = &EnableNotificationPacket->gap0[*((_QWORD *)v62 - 1)];
*(_DWORD *)((char *)v62 + (char *)&a6 + 4 - (char *)&EnableNotificationPacket[1]) = v62[1];
v64 = *v62;
*(_QWORD *)((char *)v62 + v61 - 8) = v63;
*(_DWORD *)((char *)v62 + v61) = v64;
v62 += 4;
--v60;
}
while( v60 );
}
else
{
LODWORD(FilterCount) = 0;
v106 = 0;
}
if( !v83 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
LODWORD(NotificationBlockPtr) = FilterCount;
LODWORD(LoggerContextPtr) = EnableNotificationPacket->EnableInfo.MatchAnyKeyword;
updated = EtwpEnableDisableSpecialGuids(
SiloState,
(INT64 *)&EnableNotificationPacket->gap0[40],
EnableNotificationPacket->EnableInfo.LoggerId,
IsEnabled,
(UINT64)LoggerContextPtr,
(INT64)&a6,
(INT64)NotificationBlockPtr,
(INT64)&ControlCode_5);
KeLeaveCriticalRegion();
if( ControlCode_5 )
{
LABEL_14:
v19 = LoggerContext;
goto LABEL_34;
}
v9 = OutDataBlock;
v3 = NotificationPacket;
}
if( (EnableNotificationPacket->EnableInfo.LoggerId & 0xFFFD) == 0 )
{
v19 = LoggerContext;
updated = -1073741790;
goto LABEL_86;
}
CurrentThreadProcessId = (unsigned int)PsGetCurrentThreadProcessId();
PrivateSession = SessionInfo.PrivateSession;
v16 = (const _GUID *)&PrivateLoggerNotificationGuid;
v17 = SessionInfo.PrivateSession == 0;
*(_DWORD *)&EnableNotificationPacket->gap0[36] = CurrentThreadProcessId;
if( v17 )
v16 = (const _GUID *)&EnableNotificationPacket->gap0[40];
GuidEntryByGuid = EtwpFindGuidEntryByGuid(SiloState, v16, (_ETW_GUID_TYPE)ControlCode);
v8 = GuidEntryByGuid;
if( GuidEntryByGuid )
{
if( IsEnabled == 1 )
{
LoggerId = GuidEntryByGuid->LastEnable.LoggerId;
if( LoggerId )
{
if( !v83 && EnableNotificationPacket->EnableInfo.LoggerId != LoggerId )
{
v53 = 0x4719A4EB910C653Di64 - *(_QWORD *)&v8->Guid.Data1;
if( *(_QWORD *)&v8->Guid.Data1 == 0x4719A4EB910C653Di64 )
v53 = 0x91ECBAE3884509B9ui64 - *(_QWORD *)v8->Guid.Data4;
if( !v53 )
{
updated = -1073741053;
goto LABEL_14;
}
}
}
}
}
else
{
if( PrivateSession || IsEnabled != 1 )
{
updated = -1073741163;
v8 = 0i64;
goto LABEL_14;
}
v8 = EtwpAddGuidEntry(SiloState, (_GUID *)&EnableNotificationPacket->gap0[40], (_ETW_GUID_TYPE)ControlCode);
if( !v8 )
{
updated = -1073741801;
goto LABEL_14;
}
}
v20 = (_ETHREAD *)KeGetCurrentThread();
--v20->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(&v8->Lock, 0i64);
v19 = LoggerContext;
v21 = 1;
v8->LockOwner = (_ETHREAD *)KeGetCurrentThread();
HIBYTE(ControlCode_3) = 1;
if( v19 && (v19->Flags & 0x40) != 0 )
{
updated = -1073741162;
goto LABEL_33;
}
v22 = v83;
if( v83 )
{
updated = EtwpAcquireTokenAccessInformation(v19);
if( updated )
goto LABEL_33;
}
v23 = SessionInfo.PrivateSession;
EnableNotificationPacket->LegacyProviderEnabled = IsEnabled;
v24 = EnableNotificationPacket->EnableInfo.LoggerId;
EnableNotificationPacket->LegacyEnableContext.LoggerId = v24;
EnableNotificationPacket->LegacyEnableContext.Level = EnableNotificationPacket->EnableInfo.Level;
EnableNotificationPacket->LegacyEnableContext.EnableFlags = EnableNotificationPacket->EnableInfo.MatchAnyKeyword;
MatchAnyKeyword = EnableNotificationPacket->EnableInfo.MatchAnyKeyword;
if( v23 )
{
EnableNotificationPacket->LegacyEnableContext.InternalFlag = 1;
EnableNotificationPacket->LegacyEnableContext.LoggerId = v24 & 0x7FFF;
}
if( !MatchAnyKeyword )
EnableNotificationPacket->EnableInfo.MatchAnyKeyword = -1i64;
if( !EnableNotificationPacket->EnableInfo.Level )
EnableNotificationPacket->EnableInfo.Level = -1;
if( IsEnabled != 2 && !v23 )
{
updated = EtwpUpdateGuidEnableInfo(v8, EnableNotificationPacket, MatchAnyKeyword, v102, (UINT8 *)&ControlCode_3);
if( updated < 0 )
{
LABEL_33:
v8->LockOwner = 0i64;
ExReleasePushLockEx((_DWORD)v8 + 408, 0);
KeLeaveCriticalRegion();
goto LABEL_34;
}
*(_OWORD *)&EnableNotificationPacket->EnableInfo.IsEnabled = *(_OWORD *)&v8->ProviderEnableInfo.IsEnabled;
*(_OWORD *)&EnableNotificationPacket->EnableInfo.MatchAnyKeyword = *(_OWORD *)&v8->ProviderEnableInfo.MatchAnyKeyword;
if( (EnableNotificationPacket->EnableInfo.EnableProperty & 4) != 0 )
{
_m_prefetchw(&v19->832);
bf_0 = v19->$B4A554AA980A5EA7570A49F99BAE17BC::_bf_0;
do
{
v67 = bf_0;
bf_0 = _InterlockedCompareExchange((volatile signed __int32 *)&v19->832, bf_0 | 0x2000, bf_0);
}
while( v67 != bf_0 );
if( (bf_0 & 0x2000) == 0 )
EtwpReferenceStackLookasideList();
v19 = LoggerContext;
}
}
if( v8->RegListHead.Flink == &v8->RegListHead && (v8->HostEntry || v8->SiloGuidList.Flink == &v8->SiloGuidList) )
{
updated = 0;
goto LABEL_33;
}
if( EnableNotificationPacket->gap0[12] )
{
updated = EtwpCreateUmReplyObject(v8, &Handle, &RegEntryPtr);
if( updated < 0 )
goto LABEL_33;
*(_QWORD *)&EnableNotificationPacket->gap0[24] = RegEntryPtr;
}
if( EtwpBuildNotificationPacket(v8, EnableNotificationPacket, 0xFFu, &NotificationPacket) < 0 )
{
v3 = NotificationPacket;
updated = -1073741801;
}
else
{
NotificationSize = NotificationPacket->NotificationSize;
p_NotificationSize = &NotificationPacket->NotificationSize;
v28 = EtwpAllocDataBlock(NotificationSize, NotificationPacket, &OutDataBlock);
v9 = OutDataBlock;
if( v28 < 0 )
goto LABEL_127;
v29 = *(_DWORD *)GuidEnableMask;
EnableInfo = v8->EnableInfo;
v31 = OutDataBlock;
v32 = 0;
*(_QWORD *)&v88[1] = OutDataBlock;
do
{
if( EnableInfo->IsEnabled )
v29 = (unsigned __int8)v29 | (1 << v32);
++v32;
++EnableInfo;
}
while( v32 < 8u );
*(_DWORD *)GuidEnableMask = v29;
v33 = NotificationPacket;
ControlCode_1 = 0;
p_Lock = 0i64;
if( !v8->HostEntry )
{
Flink = (_ETW_GUID_ENTRY *)v8->SiloGuidList.Flink;
if( Flink != (_ETW_GUID_ENTRY *)&v8->SiloGuidList )
p_Lock = &Flink[-1].Lock;
}
v35 = (__int64)v8;
v94 = v8;
while( 1 )
{
v36 = *(__int64 **)(v35 + 56);
v101 = (__int64 *)(v35 + 56);
v92 = v36;
if( v36 != (__int64 *)(v35 + 56) )
{
while( 1 )
{
v99 = v31;
v98 = v31;
if( v22 )
{
v37 = v36 - 2;
v68 = (_ETHREAD *)KeGetCurrentThread();
--v68->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)(v37[4] + 408), 0i64);
v19 = LoggerContext;
v9 = OutDataBlock;
v33 = NotificationPacket;
*(_QWORD *)(v37[4] + 416) = KeGetCurrentThread();
v36 = v92;
ControlCode_2 = 1;
}
else
{
v37 = v36;
}
v92 = (__int64 *)*v36;
IsRegEntryAllowed = EtwpIsRegEntryAllowed(
(_ETW_REG_ENTRY *)v37,
v19,
&SessionInfo,
EnableNotificationPacket,
(_ETW_FILTER_STRING_TOKEN **)v102,
ControlCode_1);
v39 = 0i64;
if( IsRegEntryAllowed )
{
DataBlock = v33;
if( !SessionInfo.PrivateSession )
{
v40 = v88[0];
if( v88[0] != 2 )
{
if( ControlCode_1 )
{
if( v83 )
v41 = *((_BYTE *)v37 + 103);
else
v41 = *((_BYTE *)v37 + 102);
}
else if( v83 )
{
v41 = *((_BYTE *)v37 + 101);
}
else
{
v41 = *((_BYTE *)v37 + 100);
}
v42 = v88[0];
LOBYTE(v39) = ControlCode;
LODWORD(FilterInfo) = v88[0];
EtwpUpdateRegEntryEnableMask((_ETW_REG_ENTRY *)v37, (UINT8)v19, ControlCode_3, v39);
LODWORD(NotificationBlockPtr) = v42;
LOBYTE(FilterInfo) = ControlCode_1;
v43 = EtwpCalculateUpdateNotification(
(_ETW_REG_ENTRY *)v37,
ControlCode_3,
v41,
GuidEnableMask[0],
ControlCode,
(UINT64)FilterInfo,
NotificationBlockPtr);
v9 = OutDataBlock;
if( !v43 )
{
v31 = *(_ETWP_NOTIFICATION_HEADER **)&v88[1];
if( !OutDataBlock )
{
v9 = *(_ETWP_NOTIFICATION_HEADER **)&v88[1];
OutDataBlock = *(_ETWP_NOTIFICATION_HEADER **)&v88[1];
}
goto LABEL_73;
}
if( OutDataBlock )
{
v58 = OutDataBlock;
DataBlock = OutDataBlock;
if( OutDataBlock != *(_ETWP_NOTIFICATION_HEADER **)&v88[1] )
{
EtwpUnreferenceDataBlock(*(_ETWP_NOTIFICATION_HEADER **)&v88[1]);
v58 = v9;
}
v59 = (__int64)v58;
if( v58 == v98 )
v59 = (__int64)v99;
*(_QWORD *)&v88[1] = v59;
}
else
{
v9 = *(_ETWP_NOTIFICATION_HEADER **)&v88[1];
OutDataBlock = *(_ETWP_NOTIFICATION_HEADER **)&v88[1];
}
v40 = v88[0];
}
if( (unsigned int)(v40 - 1) > 1 )
goto LABEL_69;
v44 = *((_WORD *)v37 + 49);
if( (v44 & 8) == 0 && (v44 & 0x20) == 0 && (v19->Flags & 0x2000000) == 0 )
goto LABEL_69;
if( (v44 & 1) == 0 )
{
if( ExAcquireRundownProtection((_EX_RUNDOWN_REF *)(v37[10] + 1112)) )
{
v54 = v37[10];
memset(&ApcState, 0, sizeof(ApcState));
LODWORD(v55) = PsGetProcessServerSilo(v54);
LODWORD(v56) = PsAttachSiloToCurrentThread(v55);
v57 = v56;
KeStackAttachProcess((PRKPROCESS)v37[10], &ApcState);
EtwpProviderArrivalCallback(v19, 1, (_ETW_REG_ENTRY *)v37);
KeUnstackDetachProcess(&ApcState);
PsDetachSiloFromCurrentThread(v57);
ExReleaseRundownProtection((_EX_RUNDOWN_REF *)(v37[10] + 1112));
}
goto LABEL_69;
}
v65 = 0i64;
memset(&v103, 0, sizeof(v103));
if( (v44 & 0x10) != 0 )
{
SessionById = (_ADAPTER_OBJECT *)MmGetSessionById(*((unsigned int *)v37 + 14));
v65 = SessionById;
if( SessionById )
{
if( MmAttachSession(SessionById, &v103) >= 0 )
goto LABEL_115;
LABEL_137:
MmQuitNextSession(v65);
}
}
else
{
LABEL_115:
EtwpProviderArrivalCallback(v19, 0, (_ETW_REG_ENTRY *)v37);
if( v65 )
{
MmDetachSession(v65, &v103);
goto LABEL_137;
}
}
LABEL_69:
v45 = DataBlock;
LABEL_70:
v46 = EtwpSendDataBlock((_ETW_REG_ENTRY *)v37, v45);
v31 = *(_ETWP_NOTIFICATION_HEADER **)&v88[1];
if( v46 >= 0 && (*((_BYTE *)v37 + 98) & 2) != 0 )
++v91;
goto LABEL_73;
}
ProcessId = (unsigned int)PsGetProcessId((_EPROCESS *)v37[10]);
if( !EtwpDemuxPrivateTraceHandle(
(PLEARNING_MODE_DATA *)ProcessId,
EnableNotificationPacket->EnableInfo.LoggerId & 0x7FFF,
(UINT16 *)v87) )
{
v71 = v87[0];
if( v87[0] != v9->SourceGuid[1].Data3 )
{
if( EtwpAllocDataBlock(*p_NotificationSize, v33, &OutDataBlock) < 0 )
{
v9 = *(_ETWP_NOTIFICATION_HEADER **)&v88[1];
if( ControlCode_2 )
{
*(_QWORD *)(v37[4] + 416) = 0i64;
ExReleasePushLockEx(v37[4] + 408, 0);
KeLeaveCriticalRegion();
}
LABEL_127:
updated = -1073741801;
LABEL_85:
v3 = NotificationPacket;
goto LABEL_86;
}
EtwpUnreferenceDataBlock(*(_ETWP_NOTIFICATION_HEADER **)&v88[1]);
v9 = OutDataBlock;
*(_QWORD *)&v88[1] = OutDataBlock;
OutDataBlock->SourceGuid[1].Data3 = v71 | 0x8000;
LOWORD(v9->SourceGuid[3].Data1) = v71;
}
v45 = v9;
goto LABEL_70;
}
}
LABEL_73:
if( ControlCode_2 )
{
*(_QWORD *)(v37[4] + 416) = 0i64;
ExReleasePushLockEx(v37[4] + 408, 0);
KeLeaveCriticalRegion();
ControlCode_2 = 0;
}
v36 = v92;
v22 = v83;
if( v92 == v101 )
{
v35 = (__int64)v94;
break;
}
}
}
if( (_ETW_GUID_ENTRY *)v35 != v8 )
{
*(_QWORD *)(v35 + 416) = 0i64;
ExReleasePushLockEx(v35 + 408, 0);
KeLeaveCriticalRegion();
}
v47 = p_Lock;
if( !p_Lock )
break;
v72 = (_ETHREAD *)KeGetCurrentThread();
ControlCode_1 = 1;
v94 = (_ETW_GUID_ENTRY *)p_Lock;
--v72->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(v47 + 51, 0i64);
v19 = LoggerContext;
v73 = 0i64;
v9 = OutDataBlock;
v33 = NotificationPacket;
v47[52]._bf_0 = (__int64)KeGetCurrentThread();
if( (_ETW_GUID_ENTRY *)(v47[2]._bf_0 - 16) != v8 )
v73 = v47[2]._bf_0 - 16;
p_Lock = (_EX_PUSH_LOCK *)v73;
v35 = (__int64)v47;
v22 = v83;
}
updated = 0;
v48 = v91;
*(_QWORD *)&EnableNotificationPacket->gap0[24] = Handle;
*(_DWORD *)&EnableNotificationPacket->gap0[20] = v48;
if( !v19 )
goto LABEL_85;
v49 = v88[0];
if( v88[0] > 1u )
goto LABEL_85;
v50 = (const _EVENT_DESCRIPTOR *)ETW_EVENT_PROVIDER_ENABLED;
if( v88[0] != 1 )
v50 = &ETW_EVENT_PROVIDER_DISABLED;
if( !EtwEventEnabled(*(&ExBootDevicesRemovedEvent + 241), v50) )
goto LABEL_85;
v74 = &EnableNotificationPacket->gap0[40];
if( v49 == 1 )
EtwpEventWriteProviderEnabled(
(__int64)v74,
v50,
v51,
&v19->LoggerName.Length,
(unsigned __int64)&EnableNotificationPacket->gap0[40],
EnableNotificationPacket->EnableInfo.MatchAnyKeyword,
EnableNotificationPacket->EnableInfo.MatchAllKeyword,
EnableNotificationPacket->EnableInfo.EnableProperty,
EnableNotificationPacket->EnableInfo.Level);
else
EtwpEventWriteTemplateSessAndProv(
(__int64)v74,
v50,
v51,
2,
&v19->LoggerName.Length,
(unsigned __int64)&EnableNotificationPacket->gap0[40]);
v3 = NotificationPacket;
LABEL_86:
if( v9 )
EtwpUnreferenceDataBlock(v9);
v21 = HIBYTE(ControlCode_3);
}
if( v3 )
EtwpUnreferenceDataBlock(v3);
if( v21 == 1 )
goto LABEL_33;
LABEL_34:
if( v19 )
EtwpReleaseLoggerContext(v19, 0);
if( RegEntryPtr )
HalPutDmaAdapter((PADAPTER_OBJECT)RegEntryPtr);
if( v8 )
EtwpUnreferenceGuidEntry(v8);
EtwpFreeFilterInfo(v102);
return updated;
}Referenced by:
EtwpEnableTrace
NtTraceControl