EtwpReferenceLoggerSecurityDescriptor
volatile INT64 *__fastcall EtwpReferenceLoggerSecurityDescriptor(INT64 a1){
signed __int64 v2;
signed __int64 v3;
int v4;
volatile INT64 *v5;
signed __int64 v7;
signed __int64 v8;
_ETHREAD *CurrentThread;
_m_prefetchw((const void *)(a1 + 800));
v2 = *(_QWORD *)(a1 + 800);
if( (v2 & 0xF) != 0 )
{
do
{
v3 = _InterlockedCompareExchange64((volatile signed __int64 *)(a1 + 800), v2 - 1, v2);
if( v2 == v3 )
break;
v2 = v3;
}
while( (v3 & 0xF) != 0 );
}
v4 = v2 & 0xF;
if( (v2 & 0xF) != 0 )
{
v5 = (volatile INT64 *)(v2 & 0xFFFFFFFFFFFFFFF0ui64);
if( v4 == 1 )
{
if( _InterlockedExchangeAdd64(v5 - 3, 0xFui64) <= 0 )
__fastfail(0xEu);
_m_prefetchw((const void *)(a1 + 800));
v7 = *(_QWORD *)(a1 + 800);
while( (unsigned __int64)(v7 & 0xF) + 15 <= 0xF && v5 == (volatile INT64 *)(v7 & 0xFFFFFFFFFFFFFFF0ui64) )
{
v8 = v7;
v7 = _InterlockedCompareExchange64((volatile signed __int64 *)(a1 + 800), v7 + 15, v7);
if( v8 == v7 )
return v5;
}
ObDereferenceSecurityDescriptor((PVOID)v5, 0xFui64);
}
}
else
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockSharedEx((UINT64)&EtwpSecurityLock, 0i64);
v5 = (volatile INT64 *)(*(_QWORD *)(a1 + 800) & 0xFFFFFFFFFFFFFFF0ui64);
if( _InterlockedExchangeAdd64(v5 - 3, 1ui64) <= 0 )
__fastfail(0xEu);
if( _InterlockedCompareExchange64((volatile signed __int64 *)&EtwpSecurityLock, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)&EtwpSecurityLock);
KeAbPostRelease(&EtwpSecurityLock);
KeLeaveCriticalRegion();
}
return v5;
}Referenced by:
EtwQueryPerformanceTraceInformation
EtwpCheckLoggerControlAccess