IovUnloadDrivers
INT64 __stdcall IovUnloadDrivers(){
DRIVER_OBJECT **v1;
unsigned int v2;
DRIVER_OBJECT **v3;
char v4;
char v5;
DRIVER_OBJECT **v6;
DRIVER_OBJECT **v7;
DRIVER_OBJECT *v8;
DRIVER_OBJECT **v9;
struct _DMA_ADAPTER *v10;
LARGE_INTEGER Interval;
if( !PopShutdownCleanly )
return 3221225473i64;
IovDriverListHead = 0i64;
v1 = 0i64;
v2 = ObEnumerateObjectsByType();
while( 1 )
{
v3 = (DRIVER_OBJECT **)IovDriverListHead;
if( !IovDriverListHead )
break;
IovDriverListHead = *(PVOID *)IovDriverListHead;
if( IovpUnloadDriver(v3[1]) == 259 )
{
*v3 = (DRIVER_OBJECT *)v1;
v1 = v3;
}
else
{
HalPutDmaAdapter((PADAPTER_OBJECT)v3[1]);
ExFreePoolWithTag(v3, 0);
}
}
do
{
v4 = 0;
v5 = 0;
v6 = 0i64;
while( 1 )
{
v7 = v1;
if( !v1 )
break;
v8 = v1[1];
v1 = (DRIVER_OBJECT **)*v1;
if( (v8->Flags & 1) != 0 )
{
HalPutDmaAdapter((PADAPTER_OBJECT)v8);
ExFreePoolWithTag(v7, 0);
v5 = 1;
}
else
{
*v7 = (DRIVER_OBJECT *)v6;
v6 = v7;
}
}
if( v5 )
{
Interval.QuadPart = -100000000i64;
ZwDelayExecution(0, &Interval);
v4 = 1;
}
v1 = v6;
}
while( v4 == 1 && v6 );
while( 1 )
{
v9 = v1;
if( !v1 )
break;
v10 = (struct _DMA_ADAPTER *)v1[1];
v1 = (DRIVER_OBJECT **)*v1;
HalPutDmaAdapter(v10);
ExFreePoolWithTag(v9, 0);
}
return v2;
}Referenced by:
IoShutdownSystem