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