vices ), а потім знову перезавантажитися. br/>
1.2 Драйвери віртуальних пристроїв Windows
До цих пір ми розробляли драйвер режиму ядра, який може робити те, що не можна на рівні користувача, зокрема, працювати з портами в/вив. Такий драйвер називається драйвером ядра, але не драйвером пристрою, тому що не передаються дані між програмою користувача і пристроєм (Драйвер адже зазвичай навіщо потрібен? Щоб організовувати обмін даними між додатком користувача та пристроєм). p align="justify"> Зараз ми будемо розробляти драйвери пристроїв, які передають дані туди і назад між додатком користувача та пристроєм.
В
Коли додатку потрібно операція в/вив, то відбувається звернення до драйвера. Для цього додаток може давати запит на читання даних з пристрою або запис даних на пристрій. А якщо потрібно якесь інше дію, наприклад, опитування або управління пристроєм, або що-небудь інше, то для цього використовується т.зв. IOCTL-інтерфейс (Device In-Out Control). p align="justify"> Ми будемо розглядати саме такий випадок для віртуальних пристроїв, тому що найчастіше, навіщо потрібно віртуальний пристрій у драйвері? Щоб можна було передавати йому дані, які драйвер може якось обробити (як не можна у додатку) і повернути в додаток результат. Згадаймо, що звичайний драйвер ядра, розглянутий раніше, нічого не брав з програми і нічого туди не повертав, а просто робив дії, недоступні додатком. p align="justify"> Коли додатку потрібно операція в/вив, то відбувається звернення до драйвера. Для цього може використовуватися т.зв. IOCTL-інтерфейс (Device In-Out Control). p align="justify"> Зухвала додаток виконує наступні дії:
) Відкриття файлу та отримання його дескриптора: CreateFile, посилання на пристрій,
GENERIC_READ + GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL
В результаті, якщо все сталося успішно, ми отримуємо дескриптор пристрою.
) Посилка драйверу коду дії (що робити, драйвер може реалізовувати багато різних дій): DeviceIoControl, дескриптор, код дії, адресу вхідного буфера, розмір вхідних даних, адреса вихідного буфера, розмір вихідних даних, адреса буфера для реальної кількості байтів
) Закриття файлу і, відповідно, звільнення дескріптора.CloseHandle дескриптор пристрою
Щоб передавати дані, модулі (додаток і драйвер) повинні домовитися про протокол взаємодії (коди дій, структура буферів - вхідних і вихідних).
В
Такий же код дії використовується і в додатку, і в драйвері.
Код дії в додатку і в драйвері можна записувати в 16-ричном вигляді, а можна використовувати макрос CTL_CODE, як це зроблено в прикладі лаб. роботи у файлі common.inc.
Розглянемо приклад коду дії з драйвера віртуального пристрою, який використовуєтьс...