Page 83 - 4989
P. 83
Коли нижній драйвер відправляє пакет запиту на завершення
(викликом IoCompleteRequest), підсистема вводу/виводу починає
переглядати стек всередині цього пакета від кінця до початку.
Якщо в якійсь позиції стека визначена функція завершення,
управління передається їй. Відпрацювавши, функція повертає
результат, який сигналізує про успіх, помилку або необхідність
подальшої обробки запиту. При перших двох варіантах
підсистема вводу/виводу переходить до наступної позиції стека і
продовжує перегляд, поки не буде досягнуто його початок; після
цього запит завершується нормальним чином. При третьому ж
варіанті перегляд стека негайно припиняється і запит не буде
завершений. Ця можливість реалізована для того, щоб драйвер-
фільтр міг виконати будь-які дії над пакетом запиту після того, як
той буде оброблений у нижньому драйвері. Після такої
«додаткової обробки» пакет знову повинен бути відправлений на
завершення.
8.3.3 Основні точки входу драйвера
Точки входу драйвера – це функції, які визначені у драйвері і
викликаються операційною системою при настанні тих чи інших
подій. До основних точок входу належать:
- DriverEntry;
- DriverUnload;
- AddDevice;
- функції для обробки пакетів IRP;
- процедури обробки переривань.
Процедура DiverEntry повинна бути присутня в будь-якому
драйвері. На дану процедуру покладено функцію початкової
ініціалізації і визначення інших точок входу в драйвер. Вона
виконується в момент завантаження драйвера. Для реєстрації
точок входу в драйвер DriverEntry повинна заповнити відповідні
поля в структурі об'єкта драйвера. Покажчик на цю структуру
передається в функцію.
Поле DriverUnload необхідно заповнити адресою процедури,
що викликається при вивантаженні драйвера.
Поле DriverExtension-> AddDevice необхідно заповнити
адресою процедури AddDevice.
83