1

Тема: AHK: Отключение USB дисков при загрузке системы.

В журнале событий при каждой загрузке Win7 появляется ошибка на сата контроллере - "Event ID 11, Disk: The driver detected a controller error".
Опытным путем выяснил, что причина этого в том, что при загрузке винды подключен usb hdd.
Пробовал менять драйверы, отключать загрузку с usb в биосе - ничего не помогает.
Решил тогда отключать usb hdd при загрузке виндовса, а включать через 10 секунд и деактивировать/активировать USB устройства.

deviceDescription := "USB Mass Storage Device"

#NoTrayIcon
#SingleInstance force
OnMessage(0x11, "WM_QUERYENDSESSION")
OnExit, ExitSub
RegRead, OutputVar, HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\USBSTOR, Start
if (OutputVar != 3)
{
   sleep 10000
   RegWrite, REG_DWORD, HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\USBSTOR, Start, 3
   hModule := DllCall("LoadLibrary", "Str", "setupapi.dll", "Ptr")
   info := DllCall("setupapi.dll\SetupDiGetClassDevs", "Ptr", 0, "Str", "USB", "Ptr", 0, "UInt", 0x00000002|0x00000004, "Ptr")   ; DIGCF_PRESENT | DIGCF_ALLCLASSES
   if (info = -1)
   {
      Msgbox % "SetupDiGetClassDevs failed: " A_LastError
      ExitApp
   }
   VarSetCapacity(SP_DEVINFO_DATA, 24+A_PtrSize, 0)
   NumPut(24+A_PtrSize, SP_DEVINFO_DATA, 0, "UInt")
   Loop
   {
      If !DllCall("setupapi.dll\SetupDiEnumDeviceInfo", "Ptr", info, "UInt", A_Index-1, "Ptr", &SP_DEVINFO_DATA)
      {
         If (A_LastError != 259) ;ERROR_NO_MORE_ITEMS
         {
            MsgBox % "SetupDiEnumDeviceInfo failed: " A_LastError
            ExitApp
         }
         break
      }
      VarSetCapacity(buf, 512, 0)
      VarSetCapacity(strsz, 4, 0)
      r := DllCall("setupapi.dll\SetupDiGetDeviceRegistryPropertyW", "ptr", info, "ptr", &SP_DEVINFO_DATA, "uint", SPDRP_DEVICEDESC := 0, "ptr", 0, "ptr", &buf, "uint", 512, "ptr", &strsz)
      if !r and (A_LastError != 13)   ; ERROR_INVALID_DATA
      {
         Msgbox % "SetupDiGetDeviceRegistryProperty failed: " A_LastError
         ExitApp
      }
      description := StrGet(&buf, NumGet(strsz, "uint"))
      if (description = deviceDescription)
      {
         VarSetCapacity(status, 4, 0)
         VarSetCapacity(error, 4, 0)
         if r := DllCall("setupapi.dll\CM_Get_DevNode_Status", "ptr", &status, "ptr", &error, "uint", NumGet(SP_DEVINFO_DATA, 20 ,"uint"), "uint", 0)
         {
            Msgbox % "CM_Get_DevNode_Status failed: " r
            ExitApp
         }
         flags := NumGet(status,0,"uint")
         if (flags & 0x00000400) ; DN_HAS_PROBLEM
         {
            loop 2
            {
               VarSetCapacity(ClassInstallParams, 20, 0)
               Numput(8, ClassInstallParams, 0, "uint")
               Numput(DIF_PROPERTYCHANGE := 0x12, ClassInstallParams, 4, "uint")
               Numput(3 - A_Index, ClassInstallParams, 8, "uint")
               Numput(DICS_FLAG_GLOBAL := 1, ClassInstallParams, 12, "uint")
               Numput(0, ClassInstallParams, 16, "uint")
               if !DllCall("setupapi.dll\SetupDiSetClassInstallParams", "ptr", info, "ptr", &SP_DEVINFO_DATA, "ptr", &ClassInstallParams, "uint", 20)
               {
                  Msgbox % "SetupDiSetClassInstallParams failed: " A_LastError
                  ExitApp
               }
               if !DllCall("setupapi.dll\SetupDiChangeState", "ptr", info, "ptr", &SP_DEVINFO_DATA)
               {
                  Msgbox % "SetupDiChangeState failed: " A_LastError
                  ExitApp
               }
            }
         }
      }   
   }
}
return

ExitSub:
DllCall("setupapi.dll\SetupDiDestroyDeviceInfoList", "ptr", info)
DllCall("FreeLibrary", "Ptr", hModule)
ExitApp


WM_QUERYENDSESSION()
{
   RegWrite, REG_DWORD, HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\USBSTOR, Start, 4
   Return true
}

Тема для обсуждения