ObLogSecurityDescriptor
NTSTATUS __stdcall ObLogSecurityDescriptor(
VOID *InputSecurityDescriptor,
VOID **OutputSecurityDescriptor,
UINT64 RefBias){
unsigned __int64 v4;
char *v5;
char *v6;
unsigned __int64 v7;
_ETHREAD *CurrentThread;
CHAR *CacheEntry;
_EX_PUSH_LOCK *v10;
volatile signed __int64 *p_bf_0;
signed __int64 v12;
unsigned int Size;
unsigned int a4;
a4 = RefBias;
Size = RtlLengthSecurityDescriptor((INT64)InputSecurityDescriptor);
v4 = 0i64;
v5 = (char *)InputSecurityDescriptor;
v6 = (char *)InputSecurityDescriptor + (Size & 0xFFFFFFF8);
if( InputSecurityDescriptor < v6 )
{
do
{
v7 = *(_QWORD *)v5 ^ v4;
v5 += 16;
v4 = __ROL8__(v7, 3);
}
while( v5 < v6 );
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
CacheEntry = 0i64;
v10 = (_EX_PUSH_LOCK *)((char *)&ObsSecurityDescriptorCache + 16 * (unsigned __int8)v4);
--CurrentThread->Tcb.KernelApcDisable;
LABEL_4:
p_bf_0 = &v10[1]._bf_0;
ExAcquirePushLockSharedEx(v10, 0i64);
while( 1 )
{
v12 = *p_bf_0;
if( *p_bf_0 )
break;
LABEL_9:
if( !CacheEntry )
{
if( _InterlockedCompareExchange64(&v10->_bf_0, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v10);
KeAbPostRelease(v10);
KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
CacheEntry = ObpCreateCacheEntry(InputSecurityDescriptor, Size, v4, a4);
if( !CacheEntry )
return -1073741670;
--CurrentThread->Tcb.KernelApcDisable;
goto LABEL_4;
}
*(_QWORD *)CacheEntry = v12;
p_bf_0 = (volatile signed __int64 *)_InterlockedCompareExchange64(p_bf_0, (signed __int64)CacheEntry, v12);
if( (volatile signed __int64 *)v12 == p_bf_0 )
{
if( _InterlockedCompareExchange64(&v10->_bf_0, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v10);
KeAbPostRelease(v10);
KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
*OutputSecurityDescriptor = CacheEntry + 32;
return 0;
}
}
while( *(_QWORD *)(v12 + 16) != v4 )
{
if( *(_QWORD *)(v12 + 16) > v4 )
goto LABEL_9;
LABEL_8:
p_bf_0 = (volatile signed __int64 *)v12;
v12 = *(_QWORD *)v12;
if( !v12 )
goto LABEL_9;
}
if( *(_DWORD *)(v12 + 24) != Size || memcmp(InputSecurityDescriptor, (const VOID *)(v12 + 32), Size) )
goto LABEL_8;
if( _InterlockedExchangeAdd64((volatile signed __int64 *)(v12 + 8), a4) <= 0 )
__fastfail(0xEu);
if( _InterlockedCompareExchange64(&v10->_bf_0, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v10);
KeAbPostRelease(v10);
KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
*OutputSecurityDescriptor = (VOID *)(v12 + 32);
if( CacheEntry )
ExFreePoolWithTag(CacheEntry, 0x6353624Fu);
return 0;
}Referenced by:
EtwpAllocGuidEntry
EtwpInitializeLoggerSecurityDescriptor
EtwpUpdateLoggerSecurityDescriptor
ExpWnfCreateNameInstance
IopGetSetSecurityObject
IopSetDeviceSecurityDescriptor
ObAssignObjectSecurityDescriptor
ObSetSecurityDescriptorInfo
ObpInitObjectTypeSD
SeDefaultObjectMethod