Page 83 - 4989
P. 83

Коли нижній драйвер відправляє пакет запиту на завершення
                  (викликом IoCompleteRequest), підсистема вводу/виводу починає
                  переглядати  стек  всередині  цього  пакета  від  кінця  до  початку.
                  Якщо  в  якійсь  позиції  стека  визначена  функція  завершення,

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

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

                  завершений.  Ця  можливість  реалізована  для  того,  щоб  драйвер-
                  фільтр міг виконати будь-які дії над пакетом запиту після того, як
                  той  буде  оброблений  у  нижньому  драйвері.  Після  такої

                  «додаткової обробки» пакет знову повинен бути відправлений на
                  завершення.



                        8.3.3  Основні точки входу драйвера

                        Точки входу  драйвера – це функції, які визначені у драйвері і

                  викликаються операційною системою при настанні тих чи інших
                  подій. До основних точок входу належать:
                        - DriverEntry;
                        - DriverUnload;

                        - AddDevice;
                        - функції для обробки пакетів IRP;
                        - процедури обробки переривань.

                        Процедура  DiverEntry  повинна  бути  присутня  в  будь-якому
                  драйвері.  На  дану  процедуру  покладено  функцію  початкової
                  ініціалізації  і  визначення  інших  точок  входу  в  драйвер.  Вона
                  виконується  в  момент  завантаження  драйвера.  Для  реєстрації

                  точок входу в драйвер DriverEntry повинна заповнити відповідні
                  поля  в  структурі  об'єкта  драйвера.  Покажчик  на  цю  структуру
                  передається в функцію.

                        Поле DriverUnload необхідно заповнити адресою процедури,
                  що викликається при вивантаженні драйвера.
                        Поле  DriverExtension->  AddDevice  необхідно  заповнити
                  адресою процедури AddDevice.


                                                                 83
   78   79   80   81   82   83   84   85   86   87