EtwpReferenceLoggerSecurityDescriptor
VOID *__stdcall EtwpReferenceLoggerSecurityDescriptor(_WMI_LOGGER_CONTEXT *LoggerContext){
signed __int64 Object;
signed __int64 v3;
int v4;
volatile signed __int64 *v5;
signed __int64 v7;
signed __int64 v8;
_ETHREAD *CurrentThread;
_m_prefetchw(&LoggerContext->SecurityDescriptor);
Object = (signed __int64)LoggerContext->SecurityDescriptor.Object;
if( (Object & 0xF) != 0 )
{
do
{
v3 = _InterlockedCompareExchange64(
(volatile signed __int64 *)&LoggerContext->SecurityDescriptor,
Object - 1,
Object);
if( Object == v3 )
break;
Object = v3;
}
while( (v3 & 0xF) != 0 );
}
v4 = Object & 0xF;
if( (Object & 0xF) != 0 )
{
v5 = (volatile signed __int64 *)(Object & 0xFFFFFFFFFFFFFFF0ui64);
if( v4 == 1 )
{
if( _InterlockedExchangeAdd64(v5 - 3, 0xFui64) <= 0 )
__fastfail(0xEu);
_m_prefetchw(&LoggerContext->SecurityDescriptor);
v7 = (signed __int64)LoggerContext->SecurityDescriptor.Object;
while( (unsigned __int64)(v7 & 0xF) + 15 <= 0xF && v5 == (volatile signed __int64 *)(v7 & 0xFFFFFFFFFFFFFFF0ui64) )
{
v8 = v7;
v7 = _InterlockedCompareExchange64((volatile signed __int64 *)&LoggerContext->SecurityDescriptor, v7 + 15, v7);
if( v8 == v7 )
return(VOID *)v5;
}
ObDereferenceSecurityDescriptor((VOID *)v5, 0xFui64);
}
}
else
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)&ExBootDevicesRemovedEvent + 263, 0i64);
v5 = (volatile signed __int64 *)(LoggerContext->SecurityDescriptor.Value & 0xFFFFFFFFFFFFFFF0ui64);
if( _InterlockedExchangeAdd64(v5 - 3, 1ui64) <= 0 )
__fastfail(0xEu);
if( _InterlockedCompareExchange64((_QWORD *)&ExBootDevicesRemovedEvent + 263, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((_EX_PUSH_LOCK *)&ExBootDevicesRemovedEvent + 263);
KeAbPostRelease((char *)&ExBootDevicesRemovedEvent + 2104);
KeLeaveCriticalRegion();
}
return(VOID *)v5;
}Referenced by:
EtwQueryPerformanceTraceInformation
EtwpCheckLoggerControlAccess