суббота, 26 сентября 2009 г.

Переключение режима SATA на установленной Windows XP или Vista

Тема необычна для данного блога, но я решил об этом написать, т.к. проблема популярна и злободневна.
Мы уже знаем о том, что существуют некоторые трудности установки Windows XP на современные ноутбуки (и не только) имеющие на борту не IDE как раньше, а SATA контроллеры дисков. Для того, чтобы установить XP на такое железо нужно иметь floppy привод или же править образ установщика системы и вживлять в него нужные драйвера. Но что, если у нас нет такой возможности или же система уже установлена в режиме SATA Compatible?
Небольшое отступление. На большинстве ноутбуков в BIOS можно включить режим совместимости SATA со стандартным IDE контроллером. В этом случае любая система загрузится и установится, но к постоянному использованию этот режим не рекомендуется, т.к. работает достаточно медленно.
Подход, который я опишу, не является самым простым, но он затрагивает суть проблемы и на основании этого кто-то сможет оптимизировать решение проблемы для себя.

Сначала решение кажется простым. Устанавливаем систему режиме Compatible, затем заменяем стандартный драйвер IDE нужным SATA драйвером (через диспетчер устройств), перезагружаемся, переключаем режим SATA в Enhanced, грузимся снова, и... получаем BSOD.
И здесь мы задаёмся вопросом: почему? Ответ таится в особенностях загрузки системы. Первыми загружаются так называемые Critical Devices и драйвер контроллера жёстких диска обязательно должен быть в этом списке (для меня остаётся загадкой, почему замена драйвера контроллера не приводит к автоматическому добавлению его в этот список).
Итак, второй этап, нужно добавить драйвер контроллера в Critical Devices. Список этих устройств находится в реестре. Ниже шаблон записи в реестре для контроллера жёстких дисков:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_xxxx&dev_xxxx&cc_xxxx]
"Service"="xxxxx"
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"

где:
ven_xxxx - код производителя, dev_xxxx - код устройства (подсмотреть здесь и здесь)
cc_xxxx - класс устройсва (IDE - 0101, SATA - 0106, остальные здесь )
Service - имя драйвера в системе (его можно узнать из inf-файла устанавливаемого драйвера в строке AddService = xxxxx,...)
ClassGUID - идентификатор класса устройств в Windows (4D36E96A-E325-11CE-BFC1-08002BE10318 - контроллер жёстких дисков, весь список смотреть вот тут)

С ClassGUID и Service всё понятно, а вот как узнать ven_xxxx, dev_xxxx и cc_xxxx? С этой целью можно воспользоваться LiveCD с Linux или FreeBSD (на ноутбуке с которым я проводил эксперименты, а это был ASUS K50IN, загружается Ubuntu 8.04 и Ubuntu 9.10). Переключаем режим SATA в Enhanced (идентификаторы в режиме Compatible и Enhanced отличаются, именно из-за этого вся кутерьма) и загружаемся с LiveCD. Запускаем lspci и ищем наш контроллер. В случае с K50IN это
00:0b.0 SATA controller: nVidia Corporation MCP79 AHCI Controller (rev b1)

Теперь берём адрес устройства 00:0b.0, определяем нужные нам идентификаторы с помощью lspci -ns 00:0b.0 и получаем
00:0b.0 0106: 10de:0ab9 (rev b1)

где:
10de - ven_xxxx
0ab9 - dev_xxxx
0106 - cc_xxxx

Подставляем значения и получаем reg-файл для добавления в реестр:
---------------------------------------------------------------
REGEDIT4

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_10de&dev_0ab9&cc_0106]
"Service"="nvgts"
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
---------------------------------------------------------------

добавляем это в реестр, перезагружаемся, включаем Enhanced и... работает!

Теперь кратко:
0. Создаём reg-файл используя LiveCD (загружаться нужно в режиме Enhanced).
1. Устанавливаем систему в режиме Compatible.
2. Заменяем стандартный драйвер контроллера жёстких дисков, на драйвер прилагающийся к ноутбуку или материнской плате используя оснастку диспетчера устройств (Device Manager).
3. Не перезагружаясь добавляем уже полученный нами reg-файл.
4. Перезагружаемся и переключаем включаем в BIOS режим SATA Enhanced.

PS: всё это должно работать так же и в Windows Vista'

Update: Обратил внимание, что некоторые "правильные" драйверы сами добавляют необходимую запись в ветку реестра CriticalDeviceDatabase при установке. В этом случае создавать и добавлять файл реестра необязательно. Но так делают не все, нужно проверять :)

Update2: Если вы заменили драйвер, переключились в AHCI и получили синий экран (в силу каких либо причин, например, с выбором драйвера ошиблись), отключите режим AHCI и при загрузке системы виберите "Последнюю удачную конфигурацию".

7 комментариев:

FoX-Sempai комментирует...

Долго страдал фигней пытаясь без лайв сиди узнать коды устройств, так и неполучилось, помог вотетот парнишка:
http://forums.amd.com/game/messageview.cfm?catid=261&threadid=105410&enterthread=y

PS: у меня Asus K50AB

GiNeR комментирует...

Без LiveCD посмотреть ID не получится. Можно ещё воспользоваться HDT или netboot.me если есть подключение к интернет: http://www.netboot.me/gettingstarted (включает в себя HDT)

Анонимный комментирует...

на k50id указанные коды подошли.

Анонимный комментирует...

Чувак!!! РЕСПЕКТ тебе и УВАЖУХА!!! я 4 дня рыл инфу в сети... уже на RW дистрибутив винды нЛайт'ом приготовил...

в общем ОГРОМНОЕ СПАСИБО!!!

Илья комментирует...

Шикарно! Почти разобрал образ нлайтом, но тут на эту статью наткнулся )) На Asus 61IC все подошло не меняя.

Спасибо громадное.

Анонимный комментирует...

Для ноута MSI CR500 все цифры оказались те же,только результат при включеном ahci - циклический ребут винды

Анонимный комментирует...

...а вот как узнать ven_xxxx, dev_xxxx и cc_xxxx?

Все очень просто узнается в свойствах устройства. Достаточно изменить реестр по приведенной методике и загрузится в безопасном режиме в AHCI. А вот с реестром, в зависимости от производителя контроллера, придется пошаманить. Пока все эксперименты закончились удачно. В любом случае автору респект зато что подсказал начальный путь.