IopDecrementDeviceObjectRefCount

VOID __fastcall IopDecrementDeviceObjectRefCount(_DEVICE_OBJECT *DeviceObject, UINT8 LockRequired){
  int *p_ReferenceCount; 
  NTSTATUS v4; 
  _DRIVER_OBJECT *DriverObject; 

  p_ReferenceCount = &DeviceObject->ReferenceCount;
  if( LockRequired )
    v4 = IopInterlockedDecrementUlong(LockQueueIoDatabaseLock, (INT64 *)&DeviceObject->ReferenceCount);
  else
    v4 = --*p_ReferenceCount;
  if( v4 < 0 )
  {
    DriverObject = DeviceObject->DriverObject;
    if( DriverObject )
    {
      IoAddTriageDumpDataBlock(DriverObject, (_BYTE *)0x150);
      IoAddTriageDumpDataBlock(
        DeviceObject->DriverObject->DriverName.Buffer,
        (_BYTE *)DeviceObject->DriverObject->DriverName.Length);
    }
    KeBugCheckEx(0x18u, 0i64, DeviceObject, (PVOID)6, (PVOID)*p_ReferenceCount);
  }
}

Referenced by:

IopCompleteUnloadOrDelete
IopDeleteFile