ObDereferenceSecurityDescriptor
VOID __stdcall ObDereferenceSecurityDescriptor(VOID *SecurityDescriptor, UINT64 Count){
int v2;
volatile signed __int64 *v3;
signed __int64 v4;
__int64 v5;
signed __int64 v6;
signed __int64 v7;
_ETHREAD *CurrentThread;
_EX_PUSH_LOCK *v9;
_EX_PUSH_LOCK *v10;
__int64 v11;
volatile signed __int64 *i;
v2 = Count;
v3 = (volatile signed __int64 *)((char *)SecurityDescriptor - 32);
_m_prefetchw((char *)SecurityDescriptor - 24);
v4 = *((_QWORD *)SecurityDescriptor - 3);
v5 = (unsigned int)Count;
v6 = v4 - (unsigned int)Count;
if( v6 <= 0 )
{
LABEL_4:
if( v6 )
__fastfail(0xEu);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v9 = (_EX_PUSH_LOCK *)((char *)&ObsSecurityDescriptorCache + 16 * (unsigned __int8)*((_DWORD *)v3 + 4));
--CurrentThread->Tcb.KernelApcDisable;
v10 = v9 + 1;
ExAcquirePushLockExclusiveEx(v9, 0i64);
v11 = _InterlockedExchangeAdd64(v3 + 1, -v2) - v5;
if( v11 > 0 )
{
if( (_InterlockedExchangeAdd64(&v9->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v9);
KeAbPostRelease(v9);
KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
}
else
{
if( v11 )
__fastfail(0xEu);
for( i = (volatile signed __int64 *)v10->_bf_0; i != v3; i = (volatile signed __int64 *)*i )
v10 = (_EX_PUSH_LOCK *)i;
v10->_bf_0 = *(__int64 *)v3;
if( (_InterlockedExchangeAdd64(&v9->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v9);
KeAbPostRelease(v9);
KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
ExFreePoolWithTag((PVOID)v3, 0x6353624Fu);
}
}
else
{
while( 1 )
{
v7 = v4;
v4 = _InterlockedCompareExchange64(v3 + 1, v6, v4);
if( v7 == v4 )
break;
v6 = v4 - (unsigned int)Count;
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