Стаття як писати драйвера (частина 2)

Перш, ніж хапатися за опис самого драйвера, давайте визначимося з типами існуючих драйверів.

За існуючим в DDK поділу сам Microsoft поділяє драйвера на наступні типи:
  • Kernel-Mode Drivers;
  • Kernel Streaming Drivers;
  • Graphics Drivers;
  • Network Drivers;
  • Virtual Device Drivers.

З графічними і мережевими драйверами більш менш зрозуміло за назвою.

Віртуальні VDD відносяться до пристроїв, які потребують роботі під MS-DOS.
А ось два перших типи ми розберемо трохи докладніше.

На малюнку видно структуру всіх драйверів типу Kernel-Mode Drivers. В ієрархії цієї системи розрізняють драйвера для роботи на верхньому рівні (high-level), проміжні (intermediate) і низького рівня (low-level).

До першого належать драйвера файловий систем (FAT, NTFS), до другого - драйвера фільтри, драйвера віртуальних дисків, I / O пристроїв, а до третього - драйвера безпосередньо працюють на рівні переривань.

Трохи лірики. По суті все драйвера, працюють на рівні kernel, тому такий розподіл, особисто я, вважаю невиправданим, але раз творці кажуть "є контакт", нам доведеться "є контакт".

Більш детальну інформацію по розділенню на типи, і їх опис можна знайти в Help DDK йде в поставці DDK, і встановлюється разом з цим пакетом.

Відступимо від абстрактної класифікації, і перейдемо до більш земних речей. Наведемо середньостатистичну структуру драйвера.

Кожен драйвер є набором функцій, що вбудовуються при інсталяції в структуру Windows машини, і виконуваних при виникненні певної події. По суті - це функції кінцевого автомата Windows які повинні відповідати певним форматом.

У кожному драйвері є вхідні точка, відповідна функції main (), в чудовому С, WinMain () в Windows. Функція викликається при старті системи автоматично в момент ініціалізації обслуговуючої частини Windows до якої належить цей драйвер.
Функції виходу немає.

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

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

Відкинувши таким чином драйвера, який прив'язані до залізницею ми зупинимося на типі Network - мережевих драйвери.

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

Змінюється тільки назва.
  • Miniport drivers;
  • Protocol drivers;
  • Intermediate drivers.

Структура мережевої частини драйверного поголів'я, схожа на пиріг. Давайте подивимося як це виглядає.

На малюнку чітко видно, як структура NDIS (Network Driver Interface Specification) пронизує всі шари драйверного пирога.

Тепер давайте уявимо як проходить пакет від користувальницької аплікації до посилці через модем або мережеву карту в мережу. Всі клієнти Microsoft, такі як браузер IE, або Outlook, користуються одним і тим же шаром бібліотек, що відгукуються на ім'я транспортні бібліотеки.

Головним в цьому сімействі є бібліотека сокетів. Про те як вона працює ви прочитаєте в наших випусках присвячених Winsock. У будь-якому випадку бібліотека, оформивши запит відправляє його в NDIS, і про нього зовсім забуває. У структурі нашого пирога, головним керуючим ланкою є саме NDIS. Цей цербер розподіляє кому і як передати пакет. Власне драйвер в мережі вбудований в NDIS надає управлінцю всі необхідні прототипи функцій. Почавши з першого типу, протокольного, пакет проходить через шар проміжних драйверів і потрапляє в драйвер модему (Miniport - це слово я на російський зміг перевести в контексті, нехай так і залишиться).

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

Для нас важливо, що проміжний драйвер не прив'язаний ні до обладнання, ні до якогось стандарту Windows, але відповідає своєю структурою будь-якого мережевого драйверу.

Тому в якості прикладу ми виберемо саме його.

У наступній частині я більш детально розберу, як працює вся система мережевих драйверів, з упором в бік проміжного типу драйверів. І торкнуся сам текст драйвера з конкретними прикладами. Ми напишемо функцію входу в драйвер.

Схожі статті