Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- NTSTATUS __stdcall IovUnloadDrivers()
- {
- NTSTATUS result; // er12@3
- PDRIVER_OBJECT driverObject; // rdi@4 MAPDST
- _DEVICE_OBJECT *DeviceObject; // rsi@7 MAPDST
- char have_next_driver; // bp@16
- char have_next_device; // al@16
- PBOOLEAN unloadDriver; // [sp+30h] [bp-78h]@8
- _LARGE_INTEGER Interval; // [sp+38h] [bp-70h]@22
- struct _WORK_QUEUE_ITEM WorkItem; // [sp+40h] [bp-68h]@12
- PVOID Object; // [sp+60h] [bp-48h]@12
- __int64 v16; // [sp+68h] [bp-40h]@12
- __int64 v17; // [sp+70h] [bp-38h]@12
- if ( !PopShutdownCleanly )
- return 0xC0000001; // STATUS_UNSUCCESSFUL
- IovDriverListHead = 0i64;
- driverObject = 0i64;
- result = ObEnumerateObjectsByType(IoDriverObjectType, IovpBuildDriverObjectList, 0i64);
- while ( 1 )
- {
- driverObject = IovDriverListHead;
- if ( IovDriverListHead )
- IovDriverListHead = *IovDriverListHead;
- if ( !driverObject )
- break;
- DeviceObject = driverObject->DeviceObject;
- if ( !DeviceObject->Queue.Wcb.DeviceRoutine )
- goto LABEL_14;
- ObfReferenceObject(driverObject->DeviceObject);
- if ( IopCheckUnloadDriver(DeviceObject, &unloadDriver) < 0 && (ObfDereferenceObject(DeviceObject), unloadDriver) )
- {
- if ( *(*MK_FP(__GS__, 392i64) + 104i64) == PsInitialSystemProcess )// IovpUnloadDriver(driverObject)
- {
- (DeviceObject->Queue.Wcb.DeviceRoutine)(DeviceObject);
- }
- else
- {
- v17 = &v16;
- LOBYTE(Object) = 0;
- v16 = &v16;
- BYTE2(Object) = 6;
- HIDWORD(Object) = 0;
- WorkItem.WorkerRoutine = IopLoadUnloadDriver;
- WorkItem.Parameter = &WorkItem;
- WorkItem.List.Flink = 0i64;
- ExQueueWorkItem(&WorkItem, DelayedWorkQueue);
- KeWaitForSingleObject(&Object, 0, 0, 0, 0i64);
- }
- ObMakeTemporaryObject(DeviceObject);
- ObfDereferenceObject(DeviceObject);
- LABEL_14:
- ObfDereferenceObject(driverObject->DeviceObject);
- ExFreePoolWithTag(driverObject, 0);
- }
- else
- {
- *&driverObject->Type = driverObject;
- }
- }
- do
- {
- have_next_driver = 0;
- driverObject = 0i64;
- have_next_device = 0;
- while ( driverObject )
- {
- DeviceObject = driverObject->DeviceObject;
- driverObject = *&driverObject->Type;
- if ( DeviceObject->NextDevice & 1 )
- {
- ObfDereferenceObject(DeviceObject);
- ExFreePoolWithTag(driverObject, 0);
- have_next_device = 1;
- }
- else
- {
- *&driverObject->Type = driverObject;
- }
- }
- if ( have_next_device )
- {
- Interval.QuadPart = -100000000i64;
- ZwDelayExecution(0i64, &Interval);
- have_next_driver = 1;
- }
- }
- while ( have_next_driver == 1 && driverObject );
- while ( driverObject )
- {
- DeviceObject = driverObject->DeviceObject;
- driverObject = *&driverObject->Type;
- ObfDereferenceObject(DeviceObject);
- ExFreePoolWithTag(driverObject, 0);
- }
- return result;
- }
Advertisement
Add Comment
Please, Sign In to add comment