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