IopCheckUnloadDriver

NTSTATUS __stdcall IopCheckUnloadDriver(DRIVER_OBJECT *driverObject, UINT8 *unloadDriver){
  KIRQL v4; 
  _DEVICE_OBJECT *DeviceObject; 
  NTSTATUS v6; 
  unsigned int Flags; 
  UINT8 v8; 
  v4 = KeAcquireQueuedSpinLock(0xAui64);
  DeviceObject = driverObject->DeviceObject;
  v6 = 0;
  if( !DeviceObject && (driverObject->Flags & 1) != 0 )
    goto LABEL_15;
  Flags = driverObject->Flags;
  if( (Flags & 0x80u) == 0 && DeviceObject && (*(_DWORD *)(*((_QWORD *)DeviceObject + 39) + 32i64) & 1) != 0 )
    goto LABEL_15;
  if( (Flags & 0x10) == 0 )
  {
    v6 = -1073741808;
LABEL_15:
    KeReleaseQueuedSpinLock(0xAui64, v4);
    ObfDereferenceObjectWithTag(driverObject, 0x746C6644ui64);
    return v6;
  }
  *unloadDriver = 1;
  v8 = 1;
  while( DeviceObject )
  {
    *(_DWORD *)(*((_QWORD *)DeviceObject + 39) + 32i64) |= 1u;
    if( *((_DWORD *)DeviceObject + 1) || *((_QWORD *)DeviceObject + 3) )
    {
      *unloadDriver = 0;
      v8 = 0;
    }
    else
    {
      v8 = *unloadDriver;
    }
    DeviceObject = (_DEVICE_OBJECT *)*((_QWORD *)DeviceObject + 2);
  }
  if( (driverObject->Flags & 0x80u) != 0 && driverObject->DeviceObject )
  {
    *unloadDriver = 0;
    v8 = 0;
  }
  if( v8 )
    driverObject->Flags |= 1u;
  KeReleaseQueuedSpinLock(0xAui64, v4);
  return -1073741823;
}

Referenced by:

IopUnloadDriver
IovpUnloadDriver