Людське обличчя драйвера, windows it pro
Однією з невід'ємних частин операційної системи Windows є драйвери. У загальному випадку драйвер - це спеціальне програмне забезпечення, яке забезпечує роботу зовнішніх пристроїв, а також деякої базової функціональності операційної системи.
Надіслати заявку на отримання матеріалів
Однією з невід'ємних частин операційної системи Windows є драйвери. У загальному випадку драйвер - це спеціальне програмне забезпечення, яке забезпечує роботу зовнішніх пристроїв, а також деякої базової функціональності операційної системи.
Драйвери використовуються не тільки як механізм управління апаратними пристроями, але і як складова частина прикладного програмного забезпечення. Зокрема, до подібних рішень відносяться різні віртуальні дисководи, технології захисту від копіювання, механізми шифрування, антивірусне програмне забезпечення та багато іншого. У своїй статті я хотів би прояснити питання про те, як драйвери завантажуються в систему, як працюють і що робити, якщо раптом вони починають давати збій. Додаткова інформація наведена в урізанні «Література».
Спочатку давайте розглянемо загальні моменти, що стосуються взаємовідносин між операційною системою і драйверами, з точки зору їх подальшого адміністрування.
Перш за все варто зауважити, що, незважаючи на те що драйвер - це звичайна програма, в операційній системі Windows вона виповнюється особливим чином і до неї пред'являються специфічні вимоги. В основному це стосується контексту роботи драйверів - вони в більшості своїй працюють в нульовому кільці захисту процесора.
На нульовому рівні розташовано ядро системи, її керуючі структури даних. Крім того, тут розташовані драйвери. Саме з цієї причини при написанні драйверів потрібно дотримуватися обережності і дуже уважно ставитися до коду. Невірно написаний драйвер може пошкодити системні дані ядра або інші драйвери, що призведе до появи «блакитного екрана» BSOD. Цей режим в термінах Windows називається режимом ядра (kernel-mode).
Наступним важливим елементом взаємодії між системою і драйверами є порядок їх завантаження. З цієї точки зору драйвери можна розділити на що завантажуються в процесі запуску операційної системи, так звані драйвери етапу BOOT-START, і завантажувані після старту ядра драйвери етапу SYSTEM-START.
BOOT-START. Ці драйвери необхідні для процесу завантаження і ініціалізації операційної системи. До таких драйверів, наприклад, відносяться драйвери файлових систем і драйвери шин. Ці драйвери завантажуються в пам'ять завантажувачем до запуску ядра операційної системи. Спочатку завантажувач Новомосковскет гілка реєстру SYSTEM. У цій галузі здійснюється пошук драйверів, які мають значення START, рівне нулю, що означає SERVICE_BOOT_START. Ці драйвери завантажуються, а инициализирует їх диспетчер введення / виведення після старту ядра.
SYSTEM-START. Ці драйвери завантажуються і не започатковано PnP-менеджером (див. Врізку «PnP-менеджер») після того, як будуть ініційовані драйвери етапу boot-start та побудовано дерево пристроїв. Крім того, після ініціалізації драйверів пристроїв PnP-менеджер завантажує і ініціалізує драйвери, помічені як SYSTEM-START, але до сих пір не завантажені. Ці драйвери не відносяться до будь-яких пристроїв або створюють неперечісляемие в дереві пристроїв елементи.
Згідно MSDN, на базовому рівні драйвери поділяються на два рівня:
драйвери для користувача рівня - виконуються в режимі користувача і надають інтерфейс між додатками і драйверами рівня ядра. До них відносяться драйвери принтерів і драйвери віртуальних пристроїв;
З точки зору документації MSDN драйвери рівня ядра діляться на наступні шари, опишемо їх на прикладі драйверів файлових систем.
1. Драйвери високого рівня. До них відносяться драйвери файлових систем, які підтримують файлові системи, наприклад FAT, NTFS, CDFS. Драйвери високого рівня завжди залежать від драйверів нижніх рівнів.
2. Драйвери проміжного рівня. До них відносяться драйвери, що забезпечують підтримку віртуальних дисків і віддзеркалення. Драйвери проміжного рівня залежать від драйверів нижнього рівня. Крім того, вони поділяються на такі підкласи:
функціональні драйвери - керують конкретним типом пристроїв. Драйвери шин надають пристрою функціональним драйверам через диспетчер PnP;
драйвери фільтрів доповнюють функціональний драйвер. Можна сказати, розширюють його функціональність. Можуть знаходитися як до, так і після свого функціонального драйвера, в черзі обробки запиту до цього драйверу. Вони можуть бути як безпосередньо фільтрами даного функціонального драйвера, так і фільтрами класу драйверів.
3. Драйвери нижнього рівня. Контролюють введення / виведення шини, до якої підключено периферійний пристрій. Тут також існують різні види драйверів.
Драйвери шин - керують логічними або фізичними шинами, такими як PCI, USB. Драйвери шин відповідають за розпізнавання пристроїв, підключених безпосередньо до цих шинам, оповіщення диспетчера PnP про ці пристрої і управління параметрами електроживлення шини.
Драйвери, які не підтримують WDM.
Вся ця структура зображена на малюнку.
Основним механізмом управління процесом завантаження і налаштування драйверів є реєстр. У реєстрі зберігається вся системна інформація, яка описувала драйвери, процес їх завантаження, послідовність завантаження і конфігурація. Налаштування драйверів і правила їх завантаження описані в наступних розділу реєстру:
HKLMSYSTEMCURRENTCONTROLSETENUM. В цьому розділі реєстру зберігається список устаткування, яке коли-небудь було виявлено або встановлено в системі. На першому рівні цього розділу описані перераховані вище шини. У підрозділі кожної шини - виявлені на ній пристрою. Всередині підрозділів пристроїв можна знайти різні параметри драйвера пристроїв, таких як DeviceDesc, FriendlyName. Параметр Driver є посиланням на розділ HKLMSYSTEMCURRENTCONTROLSETSERVICES, в якому описаний файл драйвера.
Тут є і необов'язкові параметри, UpperFilters і LowerFilters, в яких описані драйвери-фільтри, що належать даному драйверу.
HKLMSYSTEMCURRENTCONTROLSETCONTROLCLASS. В цьому розділі реєстру описані всі класи пристроїв, присутні в системі. Параметри класів можуть бути наступними:
(Default) - описує дружнє ім'я класу;
Class - описує ім'я класу;
EnumPropPages32 - описує бібліотеку, яка надає графічний інтерфейс настройки драйвера. Тут може міститися ім'я бібліотеки і ім'я точки входу;
Install32 - бібліотека, яка забезпечує установку драйверів даного класу;
Icon - ідентифікатор ресурсів в бібліотеці установки, який вказує на значок, який застосовується скрізь, де наводиться інформація про даному класі.
Є ще кілька необов'язкових параметрів, найбільш важливими з яких в контексті даної статті є:
UpperFilters і LowerFilters. Тут описані імена драйверів-фільтрів, які прив'язані до даного класу. Менеджер PnP завантажує ці драйвери для кожного пристрою, що відноситься до цього класу.
HKLMSYSTEMCURRENTCONTROLSETSERVICES. У цьому розділі описано сам файл драйвера. В ньому є:
ImagePath - шлях до виконуваного образу драйвера;
Type - тип драйвера: 1 - режим ядра, 2 - призначений для користувача режим;
Start - тип завантаження: 0 - boot-start, 1 - system-start, 2 - auto, 3 - manual, 4 - disabled. Тип завантаження прив'язаний не тільки до драйверів, а й до системних служб. Параметри 0 і 1 відносяться до драйверів;
ErrorControl - значення 1 говорить про те, що в разі помилки при завантаженні система повинна записати помилку в журнал і видати повідомлення про неї.
Зауважу, що тут описані не тільки драйвери, але і служби, які виконуються в системі.
Процес завантаження драйверів
Взагалі цей процес багаторівневий, він стосується багатьох компонентів системи, зокрема PnP-менеджера. Тут ми будемо розглядати його лише щодо завантаження драйверів.
Звичайний режим. Повернення до нормального режиму на те і звичайний, що в ньому завантажуються всі драйвери, які вказані в реєстрі. Відбувається це так:
драйвер шини, виявивши пристрій, передає його унікальний ідентифікатор PnP-менеджеру;
PnP-менеджер, отримавши цей ідентифікатор, знаходить в розділі HKLMSYSTEMCURRENTCONTROLSETENUM відповідне йому пристрій і визначає, які файли потрібно завантажити, використовуючи посилання на ключі HKLMSYSTEMCURRENTCONTROLSETSERVICES і HKLMSYSTEMCURRENTCONTROLSETCONTROLCLAS;
завантажується драйвер, вказаний в параметрі LowerFilter самого драйвера пристрою;
завантажується драйвер, вказаний в параметрі LowerFilter класу пристроїв, до яких відноситься драйвер
завантажується драйвер самого пристрою - функціональний драйвер;
завантажується драйвер, вказаний в параметрі UpperFilter самого драйвера пристроїв;
завантажується драйвер, вказаний в параметрі UpperFilter класу пристроїв, до яких відноситься драйвер.
Ця послідовність завантаження впливає на послідовність обробки запитів до драйверів. Запити обробляються в порядку, зворотному завантаженні, тобто починаючи від UpperFilter-драйверів.
Безпечний режим. У безпечному режимі алгоритм завантаження такої ж. Виняток становить розділ HKLMSYSTEMCURRENTCONTROLSET CONTROLSAFEBOOT. Цей розділ має два підрозділи: Minimal і Network. Їх назва говорить сама за себе. При завантаженні в звичайному захищеному режимі завантажуються тільки драйвери, які є в списку підрозділу Minimal. Коли ж ви вибираєте параметр завантаження з підтримкою мережевих драйверів, використовується список підрозділу Network.
Залишається додати, що різні шкідливі програми можуть прописати свої драйвери в цей розділ, і, отже, просто перезавантаживши комп'ютер в безпечному режимі, ви не позбудетеся від них.
Андрій Вернигора ([email protected]) - адміністратор баз даних і системний адміністратор на одному з підприємств компанії «Укртранснафта». Має сертифікат MCP
Walter. O. Programming the Microsoft Windows Driver Model. 2nd ed.
PnP-менеджер - це компонент операційної системи, який відповідає за виявлення змін в апаратне забезпечення та реагування системи на них. Простіше кажучи, якщо ви підключаєте нове обладнання, за його виявлення, настройку та завантаження драйверів відповідає саме він. Основні завдання, які виконує PnP-менеджер, такі:
розпізнає встановлені пристрої, перераховує пристрої, встановлені в систему під час завантаження і в процесі роботи;
розподіляє між пристроями такі ресурси системи, як переривання, пам'ять, шини і пристрої введення / виводу;
завантажує драйвери пристроїв;
забезпечує оповіщення додатків про появу / вилучення пристроїв.
Поділіться матеріалом з колегами і друзями