ObDereferenceSecurityDescriptor

VOID __stdcall ObDereferenceSecurityDescriptor(PVOID SecurityDescriptor, UINT64 a2){
  int v2; 
  volatile signed __int64 *v3; 
  signed __int64 v4; 
  __int64 v5; 
  signed __int64 v6; 
  signed __int64 v7; 
  _ETHREAD *CurrentThread; 
  volatile INT64 *v9; 
  volatile signed __int64 *v10; 
  __int64 v11; 
  volatile signed __int64 *i; 
  v2 = a2;
  v3 = (volatile signed __int64 *)((char *)SecurityDescriptor - 32);
  _m_prefetchw((char *)SecurityDescriptor - 24);
  v4 = *((_QWORD *)SecurityDescriptor - 3);
  v5 = (unsigned int)a2;
  v6 = v4 - (unsigned int)a2;
  if( v6 <= 0 )
  {
LABEL_4:
    if( v6 )
      __fastfail(0xEu);
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    v9 = &ObsSecurityDescriptorCache[2 * (unsigned __int8)*((_DWORD *)v3 + 4)];
    --*((_WORD *)CurrentThread + 242);
    v10 = v9 + 1;
    ExAcquirePushLockExclusiveEx((UINT64)v9, 0i64);
    v11 = _InterlockedExchangeAdd64(v3 + 1, -v2) - v5;
    if( v11 > 0 )
    {
      if( (_InterlockedExchangeAdd64(v9, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock(v9);
      KeAbPostRelease((PVOID)v9);
      KeLeaveCriticalRegionThread((__int64)CurrentThread);
    }
    else
    {
      if( v11 )
        __fastfail(0xEu);
      for( i = (volatile signed __int64 *)*v10; i != v3; i = (volatile signed __int64 *)*i )
        v10 = i;
      *v10 = *v3;
      if( (_InterlockedExchangeAdd64(v9, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock(v9);
      KeAbPostRelease((PVOID)v9);
      KeLeaveCriticalRegionThread((__int64)CurrentThread);
      ExFreePoolWithTag((PVOID)v3, 0x6353624Fu);
    }
  }
  else
  {
    while( 1 )
    {
      v7 = v4;
      v4 = _InterlockedCompareExchange64(v3 + 1, v6, v4);
      if( v7 == v4 )
        break;
      v6 = v4 - (unsigned int)a2;
      if( v6 <= 0 )
        goto LABEL_4;
    }
  }
}

Referenced by:

EtwpDereferenceLoggerSecurityDescriptor
EtwpFreeGuidEntry
EtwpFreeLoggerContext
EtwpReferenceLoggerSecurityDescriptor
EtwpUpdateLoggerSecurityDescriptor
ExpWnfCreateNameInstance
ExpWnfDeleteNameInstance
IopCompleteUnloadOrDelete
IopGetSetSecurityObject
IopSetDeviceSecurityDescriptor
ObDeassignSecurity
ObQuerySecurityDescriptorInfo
ObReleaseObjectSecurity
ObSetSecurityDescriptorInfo
ObpAdjustCreatorAccessState
ObpCreateHandle
ObpReferenceSecurityDescriptor
SepAppendAceToTokenObjectAcl