ObpReferenceSecurityDescriptor
volatile INT64 *__fastcall ObpReferenceSecurityDescriptor(INT64 a1){
signed __int64 v2;
signed __int64 v3;
signed __int64 v4;
unsigned int v5;
volatile INT64 *v6;
signed __int64 v8;
signed __int64 v9;
_ETHREAD *CurrentThread;
_m_prefetchw((const void *)(a1 + 40));
v2 = *(_QWORD *)(a1 + 40);
if( (v2 & 0xF) != 0 )
{
do
{
v3 = _InterlockedCompareExchange64((volatile signed __int64 *)(a1 + 40), v2 - 1, v2);
if( v2 == v3 )
break;
v2 = v3;
}
while( (v3 & 0xF) != 0 );
}
v4 = v2;
v5 = v2 & 0xF;
v6 = (volatile INT64 *)(v4 & 0xFFFFFFFFFFFFFFF0ui64);
if( v5 <= 1 && v6 )
{
if( v5 == 1 )
{
if( _InterlockedExchangeAdd64(v6 - 3, 0xFui64) <= 0 )
__fastfail(0xEu);
}
else
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockSharedEx(a1 + 16, 0i64);
v6 = (volatile INT64 *)(*(_QWORD *)(a1 + 40) & 0xFFFFFFFFFFFFFFF0ui64);
if( _InterlockedExchangeAdd64(v6 - 3, 0x10ui64) <= 0 )
__fastfail(0xEu);
if( _InterlockedCompareExchange64((volatile signed __int64 *)(a1 + 16), 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)(a1 + 16));
KeAbPostRelease((PVOID)(a1 + 16));
KeLeaveCriticalRegion();
}
_m_prefetchw((const void *)(a1 + 40));
v8 = *(_QWORD *)(a1 + 40);
while( (v8 & 0xF) == 0 )
{
if( v6 != (volatile INT64 *)(v8 & 0xFFFFFFFFFFFFFFF0ui64) )
break;
v9 = v8;
v8 = _InterlockedCompareExchange64((volatile signed __int64 *)(a1 + 40), v8 + 15, v8);
if( v9 == v8 )
return v6;
}
ObDereferenceSecurityDescriptor((PVOID)v6, 0xFui64);
}
return v6;
}Referenced by:
ObQuerySecurityDescriptorInfo
ObpAdjustCreatorAccessState
ObpGetObjectSecurity