У нас: 141825 рефератів
Щойно додані Реферати Тор 100
Скористайтеся пошуком, наприклад Реферат        Грубий пошук Точний пошук
Вхід в абонемент



Дипломна робота - Антивірусні системи
95
покажчик на вихідний буфер;*

DWORD nOutBufferSize – розмір вихідного буфера;*

LPDWORD lpBytesReturned – покажчик на змінну, що одержує розмір інформації, поміщеної у вихідний буфер, у байтах. Якщо розміру вихідного буфера не досить для одержання хоча б частини інформації, виконання запиту не вдається, виклик функції GetLastError повертає ERROR_INSUFFICIENT_BUFFER. Якщо ж частина інформації удалося розмістити у вихідному буфері, виконання запиту не вдається, але виклик функції GetLastError повертає ERROR_MORE_DATA.*

LPOVERLAPPED lpOverlapped – покажчик на OVERLAPPED структуру. Якщо об'єкт пристрою був відкритий із вказівкою прапора FILE_FLAG_OVERLAPPED, те після виклику функції DeviceIoControl керування повернеться негайно, а при завершенні операції буде установлений у стан, що сигналізує, об'єкт події. Якщо ж прапор FILE_FLAG_OVERLAPPED зазначений не був, то керування повернеться в програму користувача тільки після завершення обробки запиту або виникнення помилки.

У результаті виклику додатком рівня користувача DeviceIoControl функції драйверу приходить IRP пакет, що має наступний старший код: IRP_MJ_DEVICE_CONTROL. Функція, що обробляє такі IRPs, витягає CTL_CODE і обробляє дане керуюче повідомлення відповідної образом.

3.3.6 Загрузка та вигрузка драйверу

Фільтр-драйвер завантажує операційна система (на базі ядра Windows NT) на етапі свого завантаження. У процесі завантаження фільтра-драйвера диспетчер вводу/виводу (I/O Manager) викликає функцію DriverEntry, яка робить ініціалізацію драйвера. Після успішної ініціалізації фільтр-драйвер буде прикріплений як мінімум до однієї файлової системи (файлова система системного тому). До нього відразу ж почнуть приходити пакети з запитами на ввід-вивід (вірніше, менеджер вводу-виводу буде викликати певні робочі процедури для певних IRPs. Так само в процесі роботи драйвера до нього будуть приходити запити від користувальницького додатку, для якого менеджер вводу-виводу буде викликати функцію, що обробляє керуючі повідомлення. Вивантаження даного фільтра-драйвера відбувається тільки при завершенні роботи операційної системи.

3.3.7 Ініціалізація драйверу

По суті, об'єкт драйвера (покажчик на який менеджер вводу-виводу передає як перший параметр при виклику функції DriverEntry) – це структура, деякі поля якої ініціалізує диспетчер вводу-виводу, деякі поля - функція ініціалізації драйвера. Єдине, на що авторові даної роботи хотілося б звернути увагу, - це те, що для підтримки операційної системи Windows 2000 Professional необхідно було ввести механізм (трохи відрізняється від реалізованого в Windows XP Professional) приєднання фільтруючих об'єктів пристрою нашого драйвера до об'єктів пристроїв файлових систем, що представляють собою для операційної системи змонтовані томи. Справа в тому, що функція IoRegisterFsRegistrationChange [7, 13] в Windows 2000 працює по-іншому, чим в Windows XP. Тобто після виклику даної функції в Windows 2000 драйвер буде одержувати повідомлення про реєстрацію файлових систем у якості активних файлових систем, а в WinXP після виклику даної функції такі повідомлення прийдуть від всіх файлових систем (навіть від тих, які зареєструвалися ще до завантаження драйвера). Для виходу із ситуації, що створилася, була написана функція FindFileSystems, що викликається перед викликом функції IoRegisterFsRegistrationChange (для операційної системи Windows 2000). Дана функція використається в DriverEntry. Для того щоб не пропустити ні однієї файлової системи, функція перебирає вміст директорії “\FileSystems” глобального простору імен менеджера об'єктів. При цьому для кожного драйвера файлової системи потрібно одержати покажчик на об'єкт драйвера, за допомогою якого потрібно одержати покажчики на об'єкти пристроїв, що належать даній файловій системі. Тепер, одержавши покажчик на об'єкт пристрою локальної файлової системи, можливо прикріпитися зверху до стеку драйверів даної файлової системи й одержувати запити (IRPs), адресовані файлової системи. Для того щоб прикріпити наш об'єкт фільтр-пристрою (Filter Device Object - FiDO) до об'єкта пристрою файлової системи використається функція AttachToFsDO. Функція повертає код помилки або код STATUS_SUCCESS.

3.3.8 Операції, що потребують блокування

Однією із завдань даного драйвера є блокування файлів. Дана функціональність реалізована за допомогою обробки запиту зі старшим кодом IRP_MJ_CREATE, IRP_MJ_WRITE, IRP_MJ_READ. При обробці будь-якого запиту на створення або відкриття фільтр-драйвер додає до списку запитів, з якого буде читати запити клієнтський додаток. Далі клієнт сканує файл і якщо він заражений доповідає про це драйверу, який повертає код помилки доступу (ACCESS_DENIED). У противному випадку, драйвер пересилає даний запит нижче по стеку (наприклад, файловій системі, до якої він причепився).

Наступним завданням є повідомлення про створення процесів ОС. Драйвер регіструє спеціальний callback, який буде викликатися кожен раз коли створюється новий процес. Регістрація здійснюється за допомогою функції PsSetLoadImageNotifyRoutine. Далі драйвер додає цю подію по списку та діє як при обробці файлових запитів.

3.3.9 Реалізація обробки керуючих повідомлень

За допомогою коду керування (CTL_CODE) клієнтський додаток повідомляє механізму IOCTL (а вірніше, функції DeviceIoControl) про те, яка функція повинна бути виконана відносно пристрою від імені користувальницького додатка. При цьому перше, що робить функція DeviceIoControl - одержує покажчик на комірку стеку вводу-виводу з пакета IRP (I/O stack location - одна позиція в змінюваній частині IRP), що має наступний старший код IRP_MJ_DEVICE_CONTROL, за допомогою функції IoGetCurrentIrpStackLocation [7 - 13]. Потім визначає код керування: витягає його з осередку стека вводу-виводу оброблюваного IRP. Буфер вхідних даних містить будь-які додаткові дані, які можуть знадобитися пристрою для того, щоб обробити запит користувальницького додатка. Якщо в результаті обробки запиту пристрій генерують які-небудь дані, ці дані розміщаються в буфері вихідних даних. Про результат виконання операції IOCTL користувальницький додаток довідається за допомогою коду стану.

3.3.10 Механізм налагодження фільтра-драйвера

Перед тим як прийняти рішення щодо методу налагодження фільтра-драйвера були розглянуті наявні дебагери [7, 9, 11]. Виявилося, що одні дебагери вимагають два комп'ютери, інші - певні файли (наприклад, налагоджувальні символи). І було прийнято рішення розробити свій


Сторінки: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19