ObDereferenceObjectEx
NTSTATUS __stdcall ObDereferenceObjectEx(PVOID Object, UINT64 a2){
INT64 v2;
__int64 v3;
char *v4;
__int64 v6;
ULONG_PTR BugCheckParameter4;
v3 = (int)a2;
v4 = (char *)Object - 48;
ObpTraceObjectDereferenceIfActive(
(INT64)Object - 48,
(_BYTE *)(unsigned int)a2,
1953261124i64,
v2,
BugCheckParameter4);
v6 = _InterlockedExchangeAdd64((volatile signed __int64 *)v4, -(int)v3) - v3;
if( v6 <= 0 )
{
if( *((_QWORD *)v4 + 1) )
KeBugCheckEx(
0x18u,
ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ (unsigned __int8)v4[24] ^ (unsigned __int64)BYTE1(v4)],
(ULONG_PTR)Object,
6ui64,
*((_QWORD *)v4 + 1));
if( v6 < 0 )
KeBugCheckEx(0x18u, 0i64, (ULONG_PTR)Object, 5ui64, v6);
ObpDeferObjectDeletion((INT64)v4);
}
return v6;
}Referenced by:
MiCreateImageOrDataSection
PspClearProcessThreadCidRefs