IovpUnloadDriver

NTSTATUS __stdcall IovpUnloadDriver(DRIVER_OBJECT *DriverObject){
  bool v1; 
  struct _WORK_QUEUE_ITEM WorkItem; 
  struct _KEVENT Event; 
  DRIVER_OBJECT *v6; 
  UINT8 unloadDriver; 
  v1 = DriverObject->DriverUnload == 0i64;
  unloadDriver = 0;
  if( v1 )
    return -1073741808;
  ObfReferenceObject(DriverObject);
  if( IopCheckUnloadDriver(DriverObject, &unloadDriver) >= 0 )
    return 259;
  HalPutDmaAdapter((PADAPTER_OBJECT)DriverObject);
  if( !unloadDriver )
    return 259;
  if( *((PEPROCESS *)KeGetCurrentThread() + 23) == PsInitialSystemProcess )
  {
    DriverObject->DriverUnload(DriverObject);
  }
  else
  {
    memset((INT64)&WorkItem, 0i64);
    KeInitializeEvent(&Event, NotificationEvent, 0);
    WorkItem.List.Flink = 0i64;
    WorkItem.WorkerRoutine = (void(__fastcall *)(void *))IopLoadUnloadDriver;
    v6 = DriverObject;
    WorkItem.Parameter = &WorkItem;
    ExQueueWorkItem(&WorkItem, DelayedWorkQueue);
    KeWaitForSingleObject(&Event, Executive, 0, 0, 0i64);
  }
  ObMakeTemporaryObject(DriverObject);
  HalPutDmaAdapter((PADAPTER_OBJECT)DriverObject);
  return 0;
}

Referenced by:

IovUnloadDrivers