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