IopCheckUnloadDriver

NTSTATUS __stdcall IopCheckUnloadDriver(_DRIVER_OBJECT *driverObject, UINT8 *unloadDriver){
  INT64 v2; 
  UINT8 v5; 
  _DEVICE_OBJECT *DeviceObject; 
  NTSTATUS v7; 
  unsigned int Flags; 
  UINT8 v9; 

  v5 = KeAcquireQueuedSpinLock(10i64, (INT64)unloadDriver, v2);
  DeviceObject = driverObject->DeviceObject;
  v7 = 0;
  if( !DeviceObject && (driverObject->Flags & 1) != 0 )
    goto LABEL_15;
  Flags = driverObject->Flags;
  if( (Flags & 0x80u) == 0 && DeviceObject && (DeviceObject->DeviceObjectExtension->ExtensionFlags & 1) != 0 )
    goto LABEL_15;
  if( (Flags & 0x10) == 0 )
  {
    v7 = -1073741808;
LABEL_15:
    KeReleaseQueuedSpinLock(LockQueueIoDatabaseLock, v5);
    ObfDereferenceObjectWithTag(driverObject, 0x746C6644ui64);
    return v7;
  }
  *unloadDriver = 1;
  v9 = 1;
  while( DeviceObject )
  {
    DeviceObject->DeviceObjectExtension->ExtensionFlags |= 1u;
    if( DeviceObject->ReferenceCount || DeviceObject->AttachedDevice )
    {
      *unloadDriver = 0;
      v9 = 0;
    }
    else
    {
      v9 = *unloadDriver;
    }
    DeviceObject = DeviceObject->NextDevice;
  }
  if( (driverObject->Flags & 0x80u) != 0 && driverObject->DeviceObject )
  {
    *unloadDriver = 0;
    v9 = 0;
  }
  if( v9 )
    driverObject->Flags |= 1u;
  KeReleaseQueuedSpinLock(LockQueueIoDatabaseLock, v5);
  return -1073741823;
}

Referenced by:

IopUnloadDriver
IovpUnloadDriver