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