ObpReferenceSecurityDescriptor
VOID *__stdcall ObpReferenceSecurityDescriptor(_OBJECT_HEADER *ObjectHeader){
signed __int64 SecurityDescriptor;
signed __int64 v3;
signed __int64 v4;
unsigned int v5;
volatile signed __int64 *v6;
signed __int64 v8;
signed __int64 v9;
_ETHREAD *CurrentThread;
_m_prefetchw(&ObjectHeader->SecurityDescriptor);
SecurityDescriptor = (signed __int64)ObjectHeader->SecurityDescriptor;
if( (SecurityDescriptor & 0xF) != 0 )
{
do
{
v3 = _InterlockedCompareExchange64(
(volatile signed __int64 *)&ObjectHeader->SecurityDescriptor,
SecurityDescriptor - 1,
SecurityDescriptor);
if( SecurityDescriptor == v3 )
break;
SecurityDescriptor = v3;
}
while( (v3 & 0xF) != 0 );
}
v4 = SecurityDescriptor;
v5 = SecurityDescriptor & 0xF;
v6 = (volatile signed __int64 *)(v4 & 0xFFFFFFFFFFFFFFF0ui64);
if( v5 <= 1 && v6 )
{
if( v5 == 1 )
{
if( _InterlockedExchangeAdd64(v6 - 3, 0xFui64) <= 0 )
__fastfail(0xEu);
}
else
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockSharedEx(&ObjectHeader->Lock, 0i64);
v6 = (volatile signed __int64 *)((unsigned __int64)ObjectHeader->SecurityDescriptor & 0xFFFFFFFFFFFFFFF0ui64);
if( _InterlockedExchangeAdd64(v6 - 3, 0x10ui64) <= 0 )
__fastfail(0xEu);
if( _InterlockedCompareExchange64(&ObjectHeader->Lock._bf_0, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(&ObjectHeader->Lock);
KeAbPostRelease(&ObjectHeader->Lock);
KeLeaveCriticalRegion();
}
_m_prefetchw(&ObjectHeader->SecurityDescriptor);
v8 = (signed __int64)ObjectHeader->SecurityDescriptor;
while( (v8 & 0xF) == 0 )
{
if( v6 != (volatile signed __int64 *)(v8 & 0xFFFFFFFFFFFFFFF0ui64) )
break;
v9 = v8;
v8 = _InterlockedCompareExchange64((volatile signed __int64 *)&ObjectHeader->SecurityDescriptor, v8 + 15, v8);
if( v9 == v8 )
return(VOID *)v6;
}
ObDereferenceSecurityDescriptor((VOID *)v6, 0xFui64);
}
return(VOID *)v6;
}Referenced by:
ObQuerySecurityDescriptorInfo
ObpAdjustCreatorAccessState
ObpGetObjectSecurity