EtwpRegisterUMGuid
NTSTATUS __fastcall EtwpRegisterUMGuid(_ETW_SILODRIVERSTATE *SiloState, _GUID *Guid, UINT64 a3, CHAR a4, INT64 a5){
unsigned int Data1;
unsigned int v8;
bool v9;
__int64 v10;
_BOOL4 v12;
_ETW_GUID_ENTRY *GuidEntryByGuid;
void *SecurityDescriptor;
int v15;
_ETHREAD *v16;
int SchematizedFilterSize;
unsigned int v18;
UINT8 *v19;
_ETW_REG_ENTRY *v20;
UINT8 *v21;
_ETW_GUID_ENTRY *HostEntry;
unsigned __int8 v23;
UINT8 v24;
__int64 v25;
int v26;
__int64 v27;
__int64 v28;
_ETW_GUID_ENTRY *v29;
_ETHREAD *CurrentThread;
_KPROCESSOR_MODE AccessMode;
unsigned __int8 EnableMask;
int AccessStatus;
unsigned int GrantedAccess[2];
_ETW_REG_ENTRY *RegEntry;
PVOID v37;
_SECURITY_SUBJECT_CONTEXT SubjectContext;
unsigned __int8 HostEnableMask;
__int64 v40;
Data1 = Guid[1].Data1;
GrantedAccess[1] = *(_DWORD *)&Guid[1].Data2;
v8 = a3;
v10 = *(_QWORD *)&Guid->Data1 - SecurityProviderGuid;
v9 = *(_QWORD *)&Guid->Data1 == (_QWORD)SecurityProviderGuid;
v37 = 0i64;
RegEntry = 0i64;
HostEnableMask = 0;
if( v9 )
v10 = *(_QWORD *)Guid->Data4 - *((_QWORD *)&SecurityProviderGuid + 1);
if( !v10 )
return -1073741790;
v12 = Data1 - 2 > 1;
GuidEntryByGuid = EtwpFindGuidEntryByGuid(SiloState, Guid, (_ETW_GUID_TYPE)v12);
if( !GuidEntryByGuid )
{
GuidEntryByGuid = EtwpAddGuidEntry(SiloState, Guid, (_ETW_GUID_TYPE)v12);
if( !GuidEntryByGuid )
return -1073741801;
}
SecurityDescriptor = GuidEntryByGuid->SecurityDescriptor;
AccessStatus = 0;
GrantedAccess[0] = 0;
memset(&SubjectContext, 0, sizeof(SubjectContext));
SeCaptureSubjectContext((INT64)&SubjectContext);
LOBYTE(AccessMode) = 1;
SeAccessCheck(
SecurityDescriptor,
&SubjectContext,
0,
2048,
0,
0i64,
(PGENERIC_MAPPING)&EtwpGenericMapping,
AccessMode,
GrantedAccess,
&AccessStatus);
SeReleaseSubjectContext(&SubjectContext);
v15 = AccessStatus;
if( AccessStatus >= 0 )
{
if( GuidEntryByGuid->HostEntry )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(&GuidEntryByGuid->HostEntry->Lock, 0i64);
GuidEntryByGuid->HostEntry->LockOwner = (_ETHREAD *)KeGetCurrentThread();
}
v16 = (_ETHREAD *)KeGetCurrentThread();
--v16->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(&GuidEntryByGuid->Lock, 0i64);
GuidEntryByGuid->LockOwner = (_ETHREAD *)KeGetCurrentThread();
*(_DWORD *)a5 = 160;
SchematizedFilterSize = EtwpGetSchematizedFilterSize(GuidEntryByGuid, 0xFFu);
v18 = 160;
if( SchematizedFilterSize )
{
v18 = SchematizedFilterSize + 176;
*(_DWORD *)a5 = SchematizedFilterSize + 176;
}
if( v18 > v8 )
{
v15 = -1073741789;
}
else
{
v15 = EtwpAddUmRegEntry(GuidEntryByGuid, (__int64)&RegEntry, &v37);
if( v15 >= 0 )
{
if( a4 )
_InterlockedOr16((volatile signed __int16 *)&RegEntry->98, 0x100u);
v20 = RegEntry;
*(_QWORD *)Guid[1].Data4 = v37;
if( GuidEntryByGuid->ProviderEnableInfo.IsEnabled )
{
LOBYTE(v19) = 1;
EtwpUpdateEnableMask(GuidEntryByGuid, (v20->Flags & 8) != 0, 0, v19);
}
EnableMask = v20->EnableMask;
EtwpApplyScopeFilters(v20, (v20->Flags & 8) != 0, 0, 0i64);
HostEntry = GuidEntryByGuid->HostEntry;
if( HostEntry )
{
if( HostEntry->ProviderEnableInfo.IsEnabled )
{
LOBYTE(v21) = 1;
EtwpUpdateEnableMask(HostEntry, (v20->Flags & 8) != 0, 1, v21);
}
LOBYTE(v21) = 1;
HostEnableMask = v20->HostEnableMask;
EtwpApplyScopeFilters(v20, (v20->Flags & 8) != 0, 0, v21);
}
if( (v20->Flags & 8) != 0 )
{
v20->EnableMask = EnableMask;
v23 = HostEnableMask;
v20->HostEnableMask = HostEnableMask;
}
else
{
v20->EnableMask &= EnableMask;
v20->HostEnableMask &= HostEnableMask;
v23 = v20->HostEnableMask;
}
v24 = v20->EnableMask;
if( v24 || v23 )
{
EtwpComputeRegEntryEnableInfo(v20, (_TRACE_ENABLE_INFO *)&Guid[7]);
*(_DWORD *)Guid[9].Data4 = GuidEntryByGuid->LastEnable._bf_b & 1;
LOWORD(v40) = GuidEntryByGuid->LastEnable.LoggerId;
WORD1(v40) = GuidEntryByGuid->LastEnable.Level;
HIDWORD(v40) = GuidEntryByGuid->LastEnable.EnableFlags.anonymous_0.LowPart;
v25 = v40;
}
else
{
v25 = 0i64;
Guid[7] = 0i64;
Guid[8] = 0i64;
*(_DWORD *)Guid[9].Data4 = 0;
}
*(_QWORD *)&Guid[9].Data1 = v25;
*(_DWORD *)a5 = 160;
v26 = EtwpGetSchematizedFilterSize(GuidEntryByGuid, v24);
if( v26 )
{
*(_DWORD *)a5 = v26 + 176;
*(_DWORD *)Guid[10].Data4 = v26;
*(_DWORD *)&Guid[10].Data4[4] = 0x80000000;
*(_QWORD *)&Guid[10].Data1 = 136i64;
EtwpCopySchematizedFilters(&Guid[11], (__int64)GuidEntryByGuid, v24);
v26 = 1;
}
*(_DWORD *)&Guid[9].Data4[4] = v26;
*(_DWORD *)&Guid[2].Data4[4] = *(_DWORD *)a5;
EtwpTrackProviderRegistration(v20);
if( EtwEventEnabled(*(&ExBootDevicesRemovedEvent + 241), &ETW_EVENT_PROVIDER_REGISTER) )
EtwpEventWriteTemplateSessAndProv(v27, &ETW_EVENT_PROVIDER_REGISTER, v28, 1, 0i64, (unsigned __int64)Guid);
}
}
GuidEntryByGuid->LockOwner = 0i64;
ExReleasePushLockEx((_DWORD)GuidEntryByGuid + 408, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
v29 = GuidEntryByGuid->HostEntry;
if( v29 )
{
v29->LockOwner = 0i64;
ExReleasePushLockEx((ULONG_PTR)&GuidEntryByGuid->HostEntry->Lock, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
}
if( RegEntry )
HalPutDmaAdapter((PADAPTER_OBJECT)RegEntry);
}
EtwpUnreferenceGuidEntry(GuidEntryByGuid);
return v15;
}Referenced by:
NtTraceControl