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