ObDereferenceObjectEx

NTSTATUS __stdcall ObDereferenceObjectEx(VOID *Object, UINT64 Count){
  __int64 v2; 
  _OBJECT_HEADER *v3; 
  void *BugCheckParameter4; 

  v2 = (int)Count;
  v3 = (_OBJECT_HEADER *)((char *)Object - 48);
  ObpTraceObjectDereferenceIfActive((_OBJECT_HEADER *)((char *)Object - 48), (unsigned int)Count, 0x746C6644ui64);
  BugCheckParameter4 = (void *)(_InterlockedExchangeAdd64(&v3->PointerCount, -(int)v2) - v2);
  if( (__int64)BugCheckParameter4 <= 0 )
  {
    if( v3->HandleCount )
      KeBugCheckEx(
        0x18u,
        (PVOID)ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ v3->TypeIndex ^ (unsigned __int64)BYTE1(v3)],
        Object,
        (PVOID)6,
        v3->NextToFree);
    if( (__int64)BugCheckParameter4 < 0 )
      KeBugCheckEx(0x18u, 0i64, Object, (PVOID)5, BugCheckParameter4);
    ObpDeferObjectDeletion(v3);
  }
  return(int)BugCheckParameter4;
}

Referenced by:

MiCreateImageOrDataSection
PspClearProcessThreadCidRefs