Меняем порядок загрузки драйверов Windows.

для раздела Блоги



{бесплатное приложение к статье SiliconImage vs. StarForce}

ПРИСКАЗКА


На практике у некоторых продвинутых пользователей или ковыряльщиков софта/железа иногда возникает необходимость изменить очередность загрузки тех или иных драйверов.

Вот и у меня возникла такая потребность при исследовании антистарфоровских возможностей контроллера 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\<имя драйвера>]



  • За принадлежность драйвера к той или иной группе отвечает строковая переменная "Group".



    В данном примере драйвер 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! Пользуясь случаем, еще раз выражаю этому человеку, который первым же своим сообщением в форуме помог разрешить серьезную проблему, свой искренний РЕСПЕКТ!.



    Обсудить эту и другие статьи/записи с моей персональной страницы можно в соответствующей ветке конференции.

    Telegram-канал @overclockers_news - это удобный способ следить за новыми материалами на сайте. С картинками, расширенными описаниями и без рекламы.
    Оценитe материал

    Возможно вас заинтересует

    Популярные новости

    Сейчас обсуждают