У попередніх главах цієї книги для управління різними пристроями ми використання чи вільно поширюване програмне забезпечення, куди входив драйвер PortTalk.sys і програма allowio.exe. В цій главі ми розглянемо питання створення власних драйві рів пристроїв в операційних системах Windows, а також створимо драйвер для управління аналого цифровим перетворювачем, підключеним до паралельного порту ПК.

Розробка драйверів для Windows (як, втім, і для інших операційних систем) оповита якимось містичним ореолом таємничості і вважається чимось із розряду «чорної магії». Більшість програмістів і користувачів вважають, що це надзвичайно працю ное заняття і доступно далеко не кожному. У певному сенсі це справді так, якщо ви збираєтеся розробити, наприклад, драйвер звукової або відеокарти.

Тим не менш, розробити нескладний драйвер для звичайного пристрою з розряду до машнього або лабораторної електроніки може навіть користувач середньої руки, досить добре володіє основами програмування на мові C (оскільки всі драйвери разра ться з використанням мови C) і має хороше уявлення про принципи організації операційних систем Windows. При розробці драйверів слід завжди по мнить, що вони працюють в режимі ядра і при неправильному функціонуванні миттєво можуть призвести операційну систему до краху («синій екран смерті»).

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

Для розробки драйверів ми будемо застосовувати стандартне вільно поширює моє програмний засіб, випущене фірмою Microsoft – Windows DDK (Driver Develop ment Kit). Цей програмний пакет можна закачати з сайту Microsoft. До його складу включена велика документація разом з прикладами розробок драйверів.

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

2000/XP/2003/Vista.

Почнемо з того, що визначимо, що собою представляє драйвер пристрою, і як він взаимодействия з операційною системою. У спрощеному вигляді таку схему взаємодії можна представити наступною схемою (Рис. 7.1):

Рис. 7.2

Помилка програми при спробі запису

в паралельний порт

Команди асемблера in і out є «привілейованими» інструкціями процесора Intel і можуть виконуватися тільки програмами, що працюють на рівні ядра системи, поет му користувацька програма і завершується аварійним чином.

До ресурсів системи безпосередньо можуть звертатися деякі системні програми і більшість драйверів пристроїв. Для того щоб користувацька програма могла рабо тать з привілейованими інструкціями процесора і звертатися безпосередньо до апарат ним ресурсів системи, потрібно дати їй доступ на рівні ядра, знявши біт захисту в контексті процесу. Ці функції для прикладів у попередніх розділах виконували драйвер PortTalk.sys і програма allowio.exe.

Є й інший шлях для роботи з пристроями користувача – написати самому драйвер пристрою і звертатися до нього з програми користувача. Саме цей шлях і буде тут описаний. Для того щоб реалізувати таку можливість потрібно зробити два кроки:

1) написати драйвер пристрою;

2) написати програму, яка б зверталася до драйвера пристрою для виконання операцій введення висновку.

Перш ніж реалізувати подібний проект, потрібно вивчити деякі ключові аспекти взаємодії програми користувача і драйвера пристрою, а також базові принципи пи розробки драйверів пристроїв.

Джерело: Магда Ю. С. Комп’ютер в домашній лабораторії. – М.: ДМК Пресс, 2008. – 200 с.: Іл.