пятница, 27 мая 2011 г.

Безопасное извлечение устройств в Windows Vista, 7 и Server 2008

Сначала небольшая история, которая привела к данному вопросу. Был у меня внешний жесткий диск Transcend и была операционная система Windows XP. При «безопасном извлечении устройства» все происходило, как полагалось и указывалось в инструкции: светодиод на диске гас, и, соответственно, его можно было извлекать. 
Однако, после установки Windows 7,  опять же при «безопасном извлечении», не происходило ровным счетом ничего – диод светился (хоть и не моргал), что, согласно инструкции к диску означало, что диск отсоединять нельзя. Шпиндель диска при этом, естественно, продолжал, как ни в чем не бывало, вращаться, что уверенно можно было определить по вибрации корпуса.
Такая ситуация меня несколько напрягала, поэтому я решил написать в службу поддержки Transcend и спросить совета. Через несколько дней пришло письмо  на ломаном английском (не совсем понятно почему, т.к. писал я на русском, очевидно надеясь получить ответ на нем же). При этом меня явно поняли не до конца на той стороне, т.к. письмо начиналось «Your issue might be also caused by insufficient power during data trasfer», далее предлагалось воспользоваться входящим в комплект двойным USB-кабелем, и в завершение меня напугали «The long period of the insufficient power supply could make the moror of the HDD malfunctioned». Да, неисправность «морора» это серьезно. Нужно было что-то делать.
 Погуглив вышел на статью «USB Port Remains Active for Disabled or Safely Removed USB Device», в которой как раз описывается моя ситуация. Далее следует мой вольный выборочный перевод, с небольшими дополнениями

Симптомы
Если к компьютеру под управлением OC Windows Vista, 7, Server 2008 подсоединено USB-устройство, и затем вы отключаете это устройство через «Диспетчер устройств» или «Безопасное извлечение устройств и дисков» могут наблюдаться следующие симптомы: 
  •  USB-устройство продолжает проявлять активность (например, индикаторы продолжают светиться);
  • USB-устройство продолжает получать USB-пакеты и продолжает потреблять энергию соответствующую активному состоянию устройства;
  • Физическое извлечение устройства, отключенного через «Диспетчер устройств» или «Безопасное извлечение устройств и дисков» может, в некоторых случаях, приводить к ошибке в активной передаче на другое USB-устройство.
Эти симптомы не проявляются на компьютерах под управлением Windows XP или Windows Server 2003 при сходных условиях.

Причины
Когда USB-устройство отключается в «Диспетчере устройств» или через «Безопасное извлечение устройств и дисков» выдается запрос удаления устройства (PnP IRP IRP_MN_REMOVE_DEVICE) осуществляющий «Мягкое удаление» (Soft Removal). Таким образом, USB-устройство будет помечено как отключенное для Plug and Play, хотя оно еще не отключено физически.
В Windows XP и Windows Server 2003, когда USB-устройство помечается как отключенное, USB-порт, к которому оно подключено, деактивируется, и трафик больше не будет поступать устройству.
В Windows Vista, 7, Server 2008, когда USB-устройство помечается как отключенное, USB-порт, к которому оно подсоединено, не деактивируется. В подобном случае как раз и возникают проблемы описанные выше.

Решение
Для решения данной проблемы, необходимо внести соответствующие изменения в реестр, которые заставят Windows Vista, 7 и Server 2008, вернуться к схеме поведения применявшейся в Windows XP и Server 2003 – деактивации USB-порта.
Важно: все следующие изменения вы делаете на свой страх и риск. Ни компании Microsoft, ни автор статьи, ни кто бы то ни было еще, не несут ответственности за ваши действия. Перед выполнением рекомендуется сделать резервную копию реестра.
Существует два пути осуществления данной настройки.

Глобальные настройки (простой и быстрый способ):
  • В ветке реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\usbhub создаем новый раздел HubG;
  • В новом разделе создаем параметр типа DWORD с названием «DisableOnSoftRemove» и значением равным 1;
  • Перезагружаемся.
Настройки под конкретное устройство (гибкий, но чуть более долгий способ):
  • В ветке реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\UsbFlags ищем ветку соответствующую нужному устройству. Название ветки будет вида vvvvpppprrrr. Значения можно посмотреть:  «Диспетчер устройств» => Контроллеры USB => Запоминающее устройство для USB => Свойства => Сведения => ИД оборудования => USB\VID_vvvv&PID_pppp&REV_rrrr. Если такой ветки по какой-то причине нет, то создайте ее.
  • В этом разделе создаем параметр типа DWORD с названием «DisableOnSoftRemove» и значением равным 1.
  • Перезагружаемся.
Следует помнить, что хотя и не известно никаких последствий деактивации порта в ОС Windows Vista, 7 и 2008, это поведение не является для них стандартным и подобная конфигурация не тестировалась также тщательно, как исходная. Таким образом, подобные изменения могут повлиять на стабильность определения USB-устройств и операции управления энергопотреблением.
Вот такое вот решение проблемы предлагают нам ребята из Microsoft. Использовать его или нет – каждый должен решать сам. Я лично использую вариант с глобальными настройками, и, по крайней мере, до сих пор, каких бы то ни было анормальностей не замечал. Мой жесткий диск, при этом, отключается совершенно стандартно – индикатор гаснет, диск останавливается.

P.S. Это одна из моих статей не прошедших песочницу на хабре.

Комментариев нет:

Отправить комментарий