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