ObFastReplaceObject
UINT64 __fastcall ObFastReplaceObject(_EX_FAST_REF *FastRef, VOID *Object, UINT64 a3){
INT64 v3;
__int64 v6;
unsigned __int64 v7;
unsigned int v8;
unsigned __int64 v9;
signed __int64 v10;
ULONG_PTR BugCheckParameter4;
if( Object )
ObReferenceObjectExWithTag(Object, 0xFui64);
v6 = _InterlockedExchange64(
(volatile __int64 *)FastRef,
((unsigned __int64)Object | 0xF) & -(__int64)(Object != 0i64));
v7 = v6 & 0xFFFFFFFFFFFFFFF0ui64;
if( (v6 & 0xFFFFFFFFFFFFFFF0ui64) != 0 )
{
v8 = v6 & 0xF;
if( v8 )
{
v9 = v7 - 48;
ObpTraceObjectDereferenceIfActive(v7 - 48, (_BYTE *)v8, 1953261124i64, v3, BugCheckParameter4);
v10 = _InterlockedExchangeAdd64((volatile signed __int64 *)(v7 - 48), -v8) - v8;
if( v10 <= 0 )
{
if( *(_QWORD *)(v9 + 8) )
KeBugCheckEx(
0x18u,
ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ *(unsigned __int8 *)(v9 + 24) ^ (unsigned __int64)BYTE1(v9)],
v7,
6ui64,
*(_QWORD *)(v9 + 8));
if( v10 < 0 )
KeBugCheckEx(0x18u, 0i64, v7, 5ui64, v10);
ObpDeferObjectDeletion(v7 - 48);
}
}
}
return v7;
}Referenced by:
CcChangeBackingFileObject
CcDeleteSharedCacheMap
MiCreateImageFileMap
MiCreateImageOrDataSection
MiSegmentDelete
MmChangeSectionBackingFile
PsShutdownSystem
SeDeassignPrimaryToken
SeExchangePrimaryToken