EtwpAddGuidEntry
_ETW_GUID_ENTRY *__stdcall EtwpAddGuidEntry(_ETW_SILODRIVERSTATE *SiloState, _GUID *Guid, _ETW_GUID_TYPE GuidType){
__int64 v3;
_ETW_GUID_ENTRY *GuidEntryByGuid;
_ETW_GUID_ENTRY *v7;
_ETW_HASH_BUCKET *v9;
_LIST_ENTRY *v10;
_LIST_ENTRY *p_SiloGuidList;
_LIST_ENTRY *v12;
_LIST_ENTRY *Flink;
_ETHREAD *CurrentThread;
_EX_PUSH_LOCK *p_BucketLock;
_ETW_GUID_ENTRY *i;
_LIST_ENTRY *v17;
_LIST_ENTRY *Blink;
_LIST_ENTRY *v19;
v3 = GuidType;
GuidEntryByGuid = 0i64;
v7 = EtwpAllocGuidEntry((_GUID *)SiloState);
if( !v7 )
return 0i64;
if( SiloState != (_ETW_SILODRIVERSTATE *)EtwpHostSiloState )
{
GuidEntryByGuid = EtwpFindGuidEntryByGuid((_ETW_SILODRIVERSTATE *)EtwpHostSiloState, Guid, (_ETW_GUID_TYPE)v3);
if( !GuidEntryByGuid )
{
GuidEntryByGuid = EtwpAddGuidEntry((_ETW_SILODRIVERSTATE *)EtwpHostSiloState, Guid, (_ETW_GUID_TYPE)v3);
if( !GuidEntryByGuid )
{
--v7->RefCount;
EtwpFreeGuidEntry(v7);
return 0i64;
}
}
}
v9 = &SiloState->EtwpGuidHashTable[((unsigned __int8)Guid->Data1 ^ (unsigned __int8)(*(_DWORD *)&Guid->Data2 ^ *(_DWORD *)Guid->Data4 ^ *(_DWORD *)&Guid->Data4[4])) & 0x3F];
v10 = &v9->ListHead[v3];
if( GuidEntryByGuid )
{
KeEnterCriticalRegion();
ExAcquirePushLockExclusiveEx(&GuidEntryByGuid->Lock, 0i64);
p_SiloGuidList = &GuidEntryByGuid->SiloGuidList;
GuidEntryByGuid->LockOwner = (_ETHREAD *)KeGetCurrentThread();
v12 = &v7->SiloGuidList;
v7->HostEntry = GuidEntryByGuid;
Flink = GuidEntryByGuid->SiloGuidList.Flink;
if( Flink->Blink != &GuidEntryByGuid->SiloGuidList )
goto LABEL_33;
v12->Flink = Flink;
v7->SiloGuidList.Blink = p_SiloGuidList;
Flink->Blink = v12;
p_SiloGuidList->Flink = v12;
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
p_BucketLock = &v9->BucketLock;
ExAcquirePushLockExclusiveEx(&v9->BucketLock, 0i64);
for( i = (_ETW_GUID_ENTRY *)v10->Flink; ; i = (_ETW_GUID_ENTRY *)i->GuidList.Flink )
{
if( i == (_ETW_GUID_ENTRY *)v10 )
goto LABEL_23;
if( *(_QWORD *)&Guid->Data1 == *(_QWORD *)&i->Guid.Data1
&& *(_QWORD *)Guid->Data4 == *(_QWORD *)i->Guid.Data4
&& EtwpReferenceGuidEntry(i) )
{
break;
}
}
if( i )
{
if( (_InterlockedExchangeAdd64(&p_BucketLock->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(p_BucketLock);
KeAbPostRelease(p_BucketLock);
KeLeaveCriticalRegion();
if( !GuidEntryByGuid )
goto LABEL_30;
v17 = v7->SiloGuidList.Flink;
if( v17->Blink == &v7->SiloGuidList )
{
Blink = v7->SiloGuidList.Blink;
if( Blink->Flink == &v7->SiloGuidList )
{
Blink->Flink = v17;
v17->Blink = Blink;
v7->HostEntry = 0i64;
goto LABEL_27;
}
}
LABEL_33:
__fastfail(3u);
}
LABEL_23:
v19 = v10->Flink;
if( v10->Flink->Blink != v10 )
goto LABEL_33;
v7->GuidList.Flink = v19;
i = v7;
v7->GuidList.Blink = v10;
v19->Blink = &v7->GuidList;
v10->Flink = &v7->GuidList;
v7 = 0i64;
if( (_InterlockedExchangeAdd64(&p_BucketLock->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(p_BucketLock);
KeAbPostRelease(p_BucketLock);
KeLeaveCriticalRegion();
LABEL_27:
if( !GuidEntryByGuid )
goto LABEL_30;
GuidEntryByGuid->LockOwner = 0i64;
ExReleasePushLockEx((_DWORD)GuidEntryByGuid + 408, 0);
KeLeaveCriticalRegion();
if( v7 )
{
EtwpUnreferenceGuidEntry(GuidEntryByGuid);
LABEL_30:
if( v7 )
{
--v7->RefCount;
EtwpFreeGuidEntry(v7);
}
}
return i;
}Referenced by:
EtwpAddGuidEntry
EtwpAddRegEntryToGroup
EtwpEnableGuid
EtwpRegisterProvider
EtwpRegisterUMGuid