ign="justify"> · Керування введенням / вівідом ( IO Control, IOCTL ). За помощью цього інтерфейсу драйвер может пересілаті дані та команда, спеціфічні для приладнав. У Win32-системах Керування здійснюється функцією DeviceIoControl ().
Такоже драйвер є Єдиним путем Додати в систему код, что працює в Нульовий кльці, тому написання драверій можна розглядаті як способ доступу до внутрішніх функцій та структур Даних операційної системи, что розміщені в режімі ядрі.
Взаємодія драйверів между собою та програмами режиму користувача базується на вікорістанні технології IRP.
3.2 Пакети вводу-виводу (I / O request packet, IRP)
пакет-структура Даних Windows, что Забезпечує обмін Даними между драйверами, а такоже между драйвером та програмою корістувацького режиму. З точки зору архітектури будь-який драйвер є учасником вводу-виводу, Незалежності від того, чи керує ВІН прістроєм. Такоже Неможливо пряма Взаємодія между драйвером та програмою корістувацького режиму. Вона зводіться до ПОСИЛАННЯ коду IOCTL, Який виробляти до того, что диспетчер вводу / виводу формує на его основе IRP пакет. У самому драйвері візначені Функції, что реагують на тип запиту пакета.
3.3 Структура IRP пакету
пакет Складається з двох частин: постійної та стеку вводу-виводу.
У Постійній частіні зберігається інформація, что НЕ змінюється при передачі по стеку прістроїв б або не потребує Збереження. Стеком прістріїв назівається набор прістроїв, что повінні опрацювати поточний IRP пакет. Від прибудують до прибудують пакет передається послідовно. Постійна частина Включає в себе інформацію, яка НЕ ??змінюється во время проходження пакету б або не винна зберігатіся в процесі роботи Виконання пакету. Найбільш ВАЖЛИВО є наступні поля:
· MdlAddress-вказівкнік на буфер запиту. Ссілається на пам'ять, де описів запит.
· Flags-зберігає прапори, что опісують процес вводу-виводу.
· IoStatus-блок стану вводу-виводу, что опісує стан Завершення ОБРОБКИ IRP. Колі IRP завершень, драйвер поміщує в поле loStatus.Status стан Завершення Операції, а в поле loStatus.Information - Додатковий інформацію, якові нужно Передат назад ініціатору запиту.
· Cancel, CancelRoutine-поля Використовують, ЯКЩО IRP может буті Скасований в процесі ОБРОБКИ. Cancel - поле типу BOOLEAN, значення Якого встановлюється диспетчером вводу / виводу. Встановлення цього поля в TRUE означає, что Операція вводу-виводу булу відмінена. CancelRoutine - вказівнік на функцію драйвера, Що буде віклікана диспетчером вводу-виводу для коректної відміні IRP.
· UserBuffer-Віртуальна адресою буферу Даних ініціатора запиту вводу-виводу.
Стек вводу-виводу в IRP містіть інформацію відносно запиту вводу-виводу для конкретного драйверу. Размещения стеку візначається структурою IO_STACK_LOCATION. Для визначення размещения стеку всередіні заданого IRP, драйвер может вікорістаті функцію IoGetCurrentlrpStackLocation, что поверне покажчик на поточний стек. Розглянемо основні поля стеку вводу-виводу:
· MajorFunction-вказівнік на головний код Функції ввод...