ObFastReferenceObject
CHAR *__fastcall ObFastReferenceObject(INT64 *a1){
signed __int64 v2;
signed __int64 v3;
signed __int64 v4;
unsigned int v5;
CHAR *v6;
INT64 v8;
signed __int64 v9;
signed __int64 v10;
signed __int64 v11;
ULONG_PTR BugCheckParameter4;
_m_prefetchw(a1);
v2 = *a1;
if( (*a1 & 0xF) != 0 )
{
do
{
v3 = _InterlockedCompareExchange64(a1, v2 - 1, v2);
if( v2 == v3 )
break;
v2 = v3;
}
while( (v3 & 0xF) != 0 );
}
v4 = v2;
v5 = v2 & 0xF;
v6 = (CHAR *)(v4 & 0xFFFFFFFFFFFFFFF0ui64);
if( v5 > 1 )
return v6;
if( v5 )
{
ObReferenceObjectExWithTag(v6, 0xFui64);
_m_prefetchw(a1);
v9 = *a1;
while( (v9 & 0xF) == 0 )
{
if( v6 != (CHAR *)(v9 & 0xFFFFFFFFFFFFFFF0ui64) )
break;
v10 = v9;
v9 = _InterlockedCompareExchange64(a1, v9 + 15, v9);
if( v10 == v9 )
return v6;
}
ObpTraceObjectDereferenceIfActive((INT64)(v6 - 48), (_BYTE *)0xF, 1953261124i64, v8, BugCheckParameter4);
v11 = _InterlockedExchangeAdd64((volatile signed __int64 *)v6 - 6, 0xFFFFFFFFFFFFFFF1ui64) - 15;
if( v11 <= 0 )
{
if( *((_QWORD *)v6 - 5) )
KeBugCheckEx(
0x18u,
ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ (unsigned __int8)*(v6 - 24) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)v6 - 48) >> 8)],
(ULONG_PTR)v6,
6ui64,
*((_QWORD *)v6 - 5));
if( v11 < 0 )
KeBugCheckEx(0x18u, 0i64, (ULONG_PTR)v6, 5ui64, v11);
ObpDeferObjectDeletion((INT64)(v6 - 48));
}
return v6;
}
return 0i64;
}Referenced by:
CcReferenceSharedCacheMapFileObject
ExpGetProcessInformation
MiLogPageAccess
NtOpenProcessTokenEx
ObOpenObjectByNameEx
ObOpenObjectByPointer
PfQuerySuperfetchInformation
PsImpersonateClient
PsReferenceEffectiveToken
PsReferencePrimaryToken
PspReferenceSystemDll
SeCaptureSubjectContext
SeCaptureSubjectContextEx
SeCreateClientSecurity
SeCreateClientSecurityEx