Меняем порядок загрузки драйверов Windows.
реклама
На практике у некоторых продвинутых пользователей или ковыряльщиков софта/железа иногда возникает необходимость изменить очередность загрузки тех или иных драйверов.
Вот и у меня возникла такая потребность при исследовании антистарфоровских возможностей контроллера SiliconImage SiI0680. В статье, посвященной этим исследованиям, я посетовал на то, что операционная система (посредством своих драйверов, естественно) обнаруживает изучаемый мною контроллер раньше, чем драйвер WpcrSet успевает изменить его (контроллера) идентификационные PCI-регистры.
И вот наконец-то найдено решение этой проблемы! Ура!
Огромную роль в этом сыграло сообщение участника форума Cuddles, который не поленился даже зарегестрироваться на форуме дабы наставить нас на путь истинный !
Большое ему человеческое СПАСИБО!
Собственно, Cuddles дал наводку на официальный мелкософтовсий документ, в котором подробно описывается варианты изменения приоритета загрузки драйверов.
Вот этот документ: How To Control Device Driver Load Order (на инглише).
Эта заметка задумывалась как практическая иллюстрация изложенного в микрософтовской статье материала.
Итак, в той статье говорится, что:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder]
мультистроковая переменная "List":
Чем выше расположена группа в этом списке, тем больше ее приоритет при загрузке.
Этот список, если возникнет большая необходимость, можно самостоятельно модифицировать: добавить новые группы, поменять порядок следования групп и т.д.
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<имя драйвера>]
В данном примере драйвер PCI шины принадлежит группе драйверов "Boot Bus Extender".
Так, хорошо. С разделением на группы понятно: чем выше приоритет группы, тем ранше запустятся драйвера из этой группы.
А если рассмотреть два драйвера из одной группы, то какой из них будет загружен раньше ?
Очередность загрузки внутри групп определяется двоичным параметром " Tag".
Если этот параметр отсутствует, то драйвер будет загружен в самую последнюю очередь.
Что можно сказать про параметр "Tag" ?
1. Обычно он представлен неким числом. Причем, если вдруг понадобится добавить тэг драйверу, у которого его нет, то значение этого тэга нельзя брать, что называется, "от балды". Но об этом дальше.
2. Руководствуясь только числовым значением параметра "Tag" нельзя судить о степени приоритетности драйвера.
Допустимые значения тэгов и их приоритет задаются двоичными переменными по названию группы драйверов в ветке:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GroupOrderList]
Пример ( для группы драйверов "Boot Bus Extender"):
Двоичная переменная представляет из себя набор двойных слов (по 4 байта каждое).
Первое слово (выделено на рисунке красной рамкой) задает общую длину переменной (количество двойных слов)
Остальные двойные слова как раз и являются тэгами.
Тэг, равный единице, выделен зеленой рамкой, двойке -- синей.
Закономерность тут простая:
Чем левее расположен тэг тем выше его приоритет в группе.
Тем выше приоритет драйвера, у которого такой тэг имеется.
На приведенном выше рисунке видно, что приоритет тэга 01 выше, чем у тэга 02. Самым высоким приоритетом в этой группе обладает тэг 08 (выделен желтой рамкой).
Кстати, в группе драйверов могут встречаться драйвера с одинаковыми тэгами.
Как в таком случае определяется очередность -- мне не известно.
Итак.
Условно представим, что у нас есть:
1) драйвер A, принадлежащий группе драйверов Gr1
2) драйвер В, принадлежащий группе драйверов Gr2
3) приоритет Gr1 > Gr2
Из пункта (3) следует, что приоритет драйвера A выше, чем у B, т.е. драйвер A будет загружен раньше драйвера B.
Нам нужно добиться, чтобы драйвер B грузился раньше A.
Возможные варианты (первые два, пришедшие в голову):
1) изменить приоритет групп драйверов в списке ServiceGroupOrder > List
a) либо повысить приоритет Gr2 (сделать выше, чем у Gr1)
b) (зеркальный вариант) либо понизить приоритет Gr1 (сделать ниже, чем у Gr2)
Оба варианта одинаково плохи, особенно, если каждая из групп содержит больше одного драйвера. Ведь не всегда с уверенностью можно сказать, как на такое перемещение отреагируют остальные драйвера группы.
2) переместить один из драйверов в другую группу:
a) переместить драйвер B в группу Gr1 и присвоить ему более приоритетный Tag, чем у драйвера A.
b) (зеркальный вариант) переместить драйвер B в группу Gr2 и присвоить ему менее приоритетный Tag, чем у драйвера A.
ИМХО, самый оптимальный вариант 2a. Ему я и буду следовать на практике.
Настало время перейти к практике.
Как я уже упоминал в самом начале статьи, весь сыр-бор был затеян из-за того, что драйвера винды определяли IDE-контроллер раньше, чем драйвер WpcrSet успевал изменить его идентификационные регистры, что приводило к некоторым неудобствам.
Как оказалось, под термином " драйвера винды" скрывался вполне конкретный " Драйвер PCI шины". ( Вы, наверное, догадались, что не зря он присутствует почти на всех вышеприведенных скриншотах ;-))
Иначе говоря, возникла острая необходимость в запуске драйвера WpcrSet раньше драйвера PCI.
Настройки драйвера PCI:
1. Драйвер принадлежит группе " Boot Bus Extender".
2. Параметр Tag у драйвера равен двум (02h).
Настройки драйвера WpcrSet по-умолчанию:
Видно, что:
1. Драйвер принадлежит группе " Extended Base".
2. У драйвера напрочь отсутствует параметр Tag, что говорит о его наименьшем приоритете даже в пределах родной группы.
На следующем этапе выясняем, приоретет какой группы (Boot Bus Extender / Extended Base) выше:
System Reserved
Boot Bus Extender
System Bus Extender
SCSI miniport
Port
Primary Disk
[...]
NetworkProvider
RemoteValidation
NetDDEGroup
Parallel arbitrator
Extended Base
PCI Configuration
MS Transactions
Видно, что группа Boot Bus Extender вторая от начала, а Extended Base -- третья с конца. Следовательно приоритет Boot Bus Extender гораздо выше.
Поэтому первым делом переносим драйвер WpcrSet в группу Boot Bus Extender. Для этого меняем параметр " Group" с Extended Base на Boot Bus Extender:
Теперь требуется выставить Tag для драйвера WpcrSet. Причем такой, чтобы его приоритет был выше приоритета тэга драйвера PCI (Tag=02h).
Для этого смотрим на содержимое переменной " Boot Bus Extender" в разделе [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GroupOrderList]
Видно, что приоритет тэгов 01h,06h,07h,09h,0Ah,0Bh,0Ch,0Dh,0Eh,08h выше приоритета тэга 02h. Поэтому в качесве тэга для WpcrSet можно выбрать один из вышеперечисленных. Но не будем жадничать (и рисковать ), возьмем Tag=01h.
-
Note: На практике могла возникнуть ситуация, когда тэг драйвера PCI оказался бы наиболее приоритетным. т.е. самым левым в списке. Тогда перед ним нам пришлось бы добавить еще дополнительный тэг. При этом первое двойное слово в списке, задающее количество тэгов, пришлось бы увеличить на единицу.
Создадим в разделе WpcrSet параметр типа DWORW и занесем в него шестнадцатиричное значение =1:
Ну, вот и все. Настройки WpcrSet теперь выглядят так:
Теперь, перекрестясь , можно перезагружать компьютер и наблюдать за изменениями.
Note: Искренне надеюсь, что перед тем, как лезть в реестр, вы предварительно забакапились. Ибо еще раз повторяю: я снимаю с себя всю ответственность за то, что вы учините со своим компьютером, начитавшись моих "статей"!
Не знаю, как у Вас, а у меня все прошло просто замечательно. Драйвер WpcrSet стартовал раньше остальных драйверов и сделал свое черное дело точно и главное вовремя .
Так что на сегодняшний день вопрос о порядке старта драйверов в системе можно считать разрешенным.
Так что "полуавтоматический способ", описанный в статье SiliconImage vs. StarForce, стал, наконец, полностью атоматическим !
Теперь владельцы контроллера на чипе SiliconImage SiI0680, один раз настроив WpcrSet (забив регистры и изменив порядок старта драйверов) могут надолго забыть о просьбах старморса переставить диск в другой привод! Также они спокойно могут использовать RMPS диски !
Стоят ли эти бонусы времени, затраченного на понимание материала двух статей, решать Вам самим.
-
NOTE: (для ленивых) описанные в статье манипуляции с реестром можно заменить одним REG-файлом следующего содержания:
REGEDIT4
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\WPCRSET]
"Group"="Boot Bus Extender"
"Tag"=dword:00000001
Минусы способа с использованем REG-файла.
В 90% случаев способ с приведенным регфайлом прокатит.
Но никто не гарантирует что:
* у тэга=1 приоритет выше, чем у тэга PCI драйвера;
* что тэг=1 вообще продекларирован в GroupOrderList.
Так что не забывайте об этих ограничениях.
Регфайл выложил так же в своем файловом архиве, т.е. здесь (0.8Кб)
ЗЫ: Чуть не забыл! Существует хорошая программа для контролирования порядка загрузки драйверов Windows.
Называется она LoadOrder (17Кб, автор Bryce Cogswell, сайт)
Так что тем, кто задумает претворить в жизнь описанные в этой статье рекомендации, программа LoadOrder позволит проконтролировать правильность своих действий.
К сожалению, программа не позовляет изменить существующий порядок загрузки, только отобразить. Но и это, согласитесь, уже неплохо.
Короче, рекомендую
За наводку на столь полезную тулзу СПАСИБО все тому же участнику форума Cuddles! Пользуясь случаем, еще раз выражаю этому человеку, который первым же своим сообщением в форуме помог разрешить серьезную проблему, свой искренний РЕСПЕКТ!.
Обсудить эту и другие статьи/записи с моей персональной страницы можно в соответствующей ветке конференции.
реклама
Лента материалов
Соблюдение Правил конференции строго обязательно!
Флуд, флейм и оффтоп преследуются по всей строгости закона!
Комментарии, содержащие оскорбления, нецензурные выражения (в т.ч. замаскированный мат), экстремистские высказывания, рекламу и спам, удаляются независимо от содержимого, а к их авторам могут применяться меры вплоть до запрета написания комментариев и, в случае написания комментария через социальные сети, жалобы в администрацию данной сети.
Сейчас обсуждают