Міняємо порядок завантаження драйверів windows

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

Ось і у мене виникла така потреба при дослідженні антістарфоровскіх можливостей контролера SiliconImage SiI0680. У статті. присвяченій цим дослідженням, я поскаржився на те, що операційна система (за допомогою своїх драйверів, природно) виявляє досліджуваний мною контролер раніше, ніж драйвер WpcrSet встигає змінити його (контролера) ідентифікаційні PCI-регістри.

І ось нарешті знайдено рішення цієї проблеми! Ура!

Величезну роль в цьому зіграло повідомлення учасника форуму Cuddles. який не полінувався навіть реєструватися на форумі щоб наставити нас на шлях істинний.

Велике йому людське СПАСИБО!

Власне, Cuddles дав наводку на офіційний мелкософтовсій документ, в якому детально описується варіанти зміни пріоритету завантаження драйверів.

Ось цей документ: How To Control Device Driver Load Order (на інгліш).

Ця замітка замислювалася як практична ілюстрація викладеного в мікрософтовской статті матеріалу.

Отже, в тій статті йдеться про те, що:

  • Всі безліч драйверів розподіляється на групи.

  • У кожної групи драйверів свій пріоритет при завантаженні. Тобто драйвера з групи з великим пріоритетом запускаються раніше драйверів з груп з меншим пріоритетом.

    мультістроковая змінна "List":

    Міняємо порядок завантаження драйверів windows

    Чим вище розташована група в цьому списку, тим більше її пріоритет при завантаженні.

    Цей список, якщо виникне велика необхідність, можна самостійно модифікувати: додати нові групи, поміняти порядок проходження груп і т.д.

  • Самі драйвера представлені в реєстрі записами в розділах:

    [HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ <имя драйвера> ]

    Міняємо порядок завантаження драйверів windows

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

    Міняємо порядок завантаження драйверів windows

    В даному прикладі драйвер PCI шини належить групі драйверів "Boot Bus Extender".

    Так добре. З поділом на групи зрозуміло: чим вище пріоритет групи, тим ранше запустяться драйвера з цієї групи.

    А якщо розглянути два драйвера з однієї групи, то який із них буде завантажений раніше.

    Черговість завантаження всередині груп визначається двійковим параметром "Tag".

    Міняємо порядок завантаження драйверів windows

    Якщо цей параметр відсутній, то драйвер буде завантажений в найостаннішу чергу.

    Що можна сказати про параметр "Tag"?

    1. Зазвичай він представлений якимсь числом. Причому, якщо раптом знадобиться додати тег драйверу, який його не має, то значення цього тега можна брати, як то кажуть, "від балди". Але про це далі.

    2. Керуючись тільки числовим значенням параметра "Tag" не можна судити про ступінь пріоритетності драйвера.

    Допустимі значення тегів і їх пріоритет задаються двійковими змінними за назвою групи драйверів в гілці:

    Міняємо порядок завантаження драйверів windows

    Приклад (для групи драйверів "Boot Bus Extender"):

    Міняємо порядок завантаження драйверів windows

    Двійкова змінна представляє з себе набір подвійних слів (по 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:

    Міняємо порядок завантаження драйверів windows

    1. Драйвер належить групі "Boot Bus Extender".

    2. Параметр Tag у драйвера дорівнює двом (02h).

    Налаштування драйвера WpcrSet за замовчуванням:

    Міняємо порядок завантаження драйверів windows

    1. Драйвер належить групі "Extended Base".

    2. У драйвера геть відсутня параметр Tag. що говорить про його найменшому пріоритеті навіть в межах рідної групи.


    На наступному етапі з'ясовуємо, пріоретет якої групи (Boot Bus Extender / Extended Base) вище:

    Міняємо порядок завантаження драйверів windows

    Видно, що група Boot Bus Extender друга від початку, а Extended Base - третя з кінця. Отже пріоритет Boot Bus Extender набагато вище.

    Тому перш за все переносимо драйвер WpcrSet в групу Boot Bus Extender. Для цього міняємо параметр "Group" з Extended Base на Boot Bus Extender.

    Міняємо порядок завантаження драйверів windows

    Тепер потрібно виставити Tag для драйвера WpcrSet. Причому такий, щоб його пріоритет був вище пріоритету тега драйвера PCI (Tag = 02h).

    Для цього дивимося на вміст змінної "Boot Bus Extender" в розділі [HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ GroupOrderList]

    Міняємо порядок завантаження драйверів windows

    Видно, що пріоритет тегів 01h, 06h, 07h, 09h, 0Ah, 0Bh, 0Ch, 0Dh, 0Eh, 08h вище пріоритету тега 02h. Тому в качесве тега для WpcrSet можна вибрати один з перерахованих вище. Але не будемо скупитися (і ризикувати), візьмемо Tag = 01h.

      Note: На практиці могла виникнути ситуація, коли тег драйвера PCI виявився б найбільш пріоритетним. тобто самим лівим в списку. Тоді перед ним нам довелося б додати ще додатковий тег. При цьому перше подвійне слово в списку, що задає кількість тегів, довелося б збільшити на одиницю.

    Створимо в розділі WpcrSet параметр типу DWORW і занесемо в нього шестнадцатиричное значення = 1:

    Міняємо порядок завантаження драйверів windows

    Ну от і все. Налаштування WpcrSet тепер виглядають так:

    Міняємо порядок завантаження драйверів windows

    Тепер, перехрестившись, можна перезавантажувати комп'ютер і спостерігати за змінами.

    Note: Щиро сподіваюся, що перед тим, як лізти в реєстр, ви попередньо забакапілісь. Бо ще раз повторюю: я знімаю з себе всю відповідальність за те, що ви учинити зі своїм комп'ютером, начитавшись моїх "статей"!

    Не знаю, як у Вас, а у мене все пройшло просто чудово. Драйвер WpcrSet стартував раніше за інших драйверів і зробив свою чорну справу точно і головне вчасно.

    Так що на сьогоднішній день питання про порядок старту драйверів в системі можна вважати дозволеним.

    Хочу відзначити той факт, що в статті «Міняємо порядок завантаження драйверів» не сказано про те, що параметри Tag, ServiceGroupOrder працюють тільки зі службами (драйверами), що мають тип запуску Boot (0) або System (1).
    Для типу Automatic порядок завантаження не обмовляється.
    Зокрема, саме тому VmWare сервіс vmx86 після установки останнього Vmware Server не давав мені завантажитися, падаючи через деякий час після появи запрошення введення пароля.

    Схожі статті