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

WINAPI), які включені в деякі бібліотеки динамічної компоновки, наприклад, в kernel32.dll. Тут потрібно відзначити наступний важливий момент: всі пристрої, з якими взаємодіє операційна система, представлені в ній як файли, причому це відносить ся не тільки до файлів в їх традиційному уявленні як про певним чином скомпонованим групам даних на жорсткому диску, але і до всіх апаратним пристроям. Так, наприклад, паралельний порт ПК в операційній системі Windows може бути пред ставлена ​​як файл з ім’ям «LPT1», послідовного порту може бути присвоєно ім’я

«COM1» і т. д. Розглянемо, наприклад, як здійснюється взаємодія програми користувача з друкуючим пристроєм, приєднаним до порту LPT1.

Це дуже важливий момент в нашому міркуванні для розуміння всього подальшого мате ріалу. Припустимо, нам потрібно надрукувати з нашої програми символ на принтері. Схема взаємодії додатка і пристрою друку у спрощеному вигляді показана на рис. 7.3:

Рис. 7.3

Взаємодія програми користувача і пристрою друку

Схема взаємодії користувача програми та пристрої введення виводу (принтера) є вельми показовою і відноситься до всіх пристроїв операційної системи. Перше, що повинна зробити програма, перед тим як виконувати операції введення виведення з пристроєм – відкрити його, що і виконує системна функція CreateFile () (1). Ця функція завжди повинна виконуватися при зверненні до об’єкта файлової системи, будь то дисковий файл або пристрій введення виведення. В якості першого параметра ця функція приймає ім’я пристрою (в даному прикладі, це «LPT1»). Ця функція належить до приклад ному інтерфейсу програмування (так званому інтерфейсу WINAPI), який являє ся своєрідним мостом між додатком користувача й системою. Тут є один важливий нюанс – функції WINAPI дозволяють звернутися з програми, яка працює в режи ме користувача, до системних функцій, які працюють в режимі ядра.

В даному випадку, функція WINAPI CreateFile () звертається до Менеджеру введення виведення операційної системи, який знаходиться на виконавчому рівні і формує запити

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

При успішному завершенні функції CreateFile () додаток отримує дескриптор (описа тель) відкритого об’єкта файлової системи і всі наступні операції з пристроєм осу ються з використанням цього дескриптора. Драйвер пристрою отримує пакет за проса, відповідний функції відкриття файлу і виконує відповідні дії по ініціалізації пристрою (у багатьох випадках, при відкритті закриття пристрою ніякої апаратної ініціалізації не виконується і драйвер просто повертає статус успішного завершення).

На другому кроці програма повинна записати байт даних в пристрій друку. Це ви виконується за допомогою функції WINAPI WriteFile () (2). Як і у випадку з функцією CreateFile (), ланцюжок звернень та ж – Менеджер введення виведення-драйвер-пристрій. Різниця в тому, що в цьому випадку Менеджер введення виведення операційної системи формує пакет запиту запису даних з відповідною ініціалізацією областей віртуальної пам’яті для пере дачі даних.

Нарешті, після закінчення роботи з пристроєм слід закрити його дескриптор, викорис чаплі WINAPI функцію CloseHandle (3), яка закриває сеанс роботи з пристроєм, видаляючи дескриптор і виділені пристрою ресурси.

Це дуже спрощений приклад взаємодії програми користувача та пристрої введення виводу, але все ж він дає певне уявлення про механізми такого взаємо дії. Таким чином, для взаємодії з пристроєм введення виведення програма користувача так чи інакше буде використовувати функції WINAPI CreateFile (), WriteFile (), ReadFile () і CloseHandle () або їх модифіковані версії. При цьому послідовність операцій в простому циклі обміну даними так:

1) функція CreateFile () відкриває пристрій вводу-виводу (воно має до цього мо менту існувати в системі). Результатом виконання цієї функції буде деск ріптор пристрою, з яким будуть виконуватися всі операції обміну даними (чте ня і запис);

2) за допомогою функцій ReadFile () і WriteFile () здійснюються необхідні операції (читання / запису). Результатом роботи цих функцій є кількість прочитаних (ReadFile ()) або записаних (WriteFile ()) байтів;

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

Замість функцій ReadFile () і WriteFile () можна використовувати WINAPI функцію DeviceIoControl (). За допомогою цієї функції можна послати пристрою код який або операції, не тільки за писи або читання даних, але також будь-який інший код, на який пристрій може реагування вать. Це розширює можливості операцій введення виводу, але вимагає, щоб драйвер пристрою міг обробляти такі коди. В наших подальших прикладах ми будемо викорис зовать саме функцію DeviceIoControl ().

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

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