– означає що у черзі драйверу немає заблокованих операцій;
нотифікація про створення нового процесу – приходить кожен раз, коли визивається функція NtCreateProcess;
нотифікація про файлову операцію – приходить кожен раз, коли визивається функція NtCreateFile.
3 Перевірка файлів які були передані із нотифікацією. Результатом перевірки можуть бути 2 значення:
об’єкт заражено – в цьому разі доступ до об’єкту блокується(операція повертає помилку);
об’єкт не заражено – операція завершується без помилки.
Мал. 3.3.1 Алгоритм роботи інформаційної системи
3.3.4 Обробка IRPs
IRP - структура даних, що представляє запит на ввід-вивід і здійснюючий контроль за обробкою даного запиту. IRP складається із заголовка і однієї або більше комірок стеку. У даній структурі залежно від типу запиту (вірніше як мінімум від старшого коду IRP_MJ_XXX) зберігаються покажчики на ті або інші структури даних. Для докладного ознайомлення з IRPs див. [lit ref]. Фільтр-драйвер файлових систем для того, щоб мати можливість обробляти за своїм розсудом IRPs, адресовані об'єктам пристроїв файлових систем, повинен вставити свій фільтруючий об'єкт пристрою в стек драйвера файлової системи (підставою даного стека є сам об'єкт пристрою файлової системи, іншу частину стека становлять об'єкти пристроїв, що причепили себе до нього; див. [lit ref]).
Будь-який об'єкт пристрою при одержанні IRP може виконувати наступні дії:*
переслати пакет драйверу, що стоїть нижче за ієрархією, (якщо драйвер існує), при цьому може встановити функцію завершальної обробки (Completion Routine - дана функція буде викликана менеджером вводу-виводу, коли драйвером, що стоїть нижче за ієрархією, буде завершена обробка даного пакета; ця складна тема докладно описана в [7, 9]).*
завершити обробку даного пакета;*
створити новий пакет запиту на ввід-вивід і переслати його драйверу, що стоїть нижче за ієрархією;*
змінити існуючий IRP і переслати його драйверу, що стоїть нижче за ієрархією;
Для фільтра-драйвера файлових систем при обробці багатьох пакетів (наприклад, IRP_MJ_CREATE, IRP_MJ_CLOSE, IRP_MJ_READ, IRP_MJ_WRITE та ін.) дуже важливим є файловий об'єкт (file object - докладний опис можна знайти в [7, 9, 10]). Файловий об'єкт - представлення менеджером вводу/виводу в пам'яті екземпляра відкритого об'єкта (файлу, директорії, пристрою, тому). Файловий об'єкт це ядерний еквівалент хендлу (handle), створеного в результаті успішної операції створення або відкриття. Всі запити на ввод/вивід, адресовані фізичному диску або логічному тому, вимагають файлового об'єкта. Відповідальність по створенню й підтримці файлового об'єкту лежить на менеджері вводу-виводу й драйвері файлової системи рівня ядра. Структура “файловий об'єкт” створюється (і частково заповнюється) менеджером вводу-виводу перед тим, як він відправить запит на відкриття або створення (IRP_MJ_CREATE) драйверу файлової системи. Драйвер файлової системи, одержавши покажчик на файловий об'єкт, обробляє даний запит і у випадку успіху ініціалізує деякі поля файлового об'єкту.[7] Файловий об'єкт використається багатьма функціями фільтра-драйвера для обробки необхідних запитів. Але є пакет запиту на ввід-вивід (старший код IRP_MJ_DEVICE_CONTROL), в центрі якого стоїть не файловий об'єкт, а керуюче повідомлення.
3.3.5 Обробка керуючих повідомлень
Під керуючими повідомленнями мається на увазі IOCTL (I/O Control code - керуючий код вводу-виводу). IOCTL дозволяє звертатися до драйвера з запитами, що відрізняються від операцій читання й запису в пристрій (хоча й вони легко реалізуються через IOCTL запити). Завдяки IOCTL додатки рівня користувача одержують можливість взаємодіяти із драйверами рівня ядра. Користувальницький додаток для того, щоб послати яку-небудь команду драйверу рівня ядра (або фільтру-драйверу), повинен спочатку відкрити об'єкт пристрою, створеного цим драйвером, за допомогою функції Win32 CreateFile [8]. Потім користувальницький додаток за допомогою функції Win32 DeviceIoControl [7, 8, 9] посилає драйверу CTL_CODE (див. Мал. 3.3).
Мал. 3.3 Схема CTL_CODE
CTL_CODE [8] має у своєму складі, крім коду запитуваної операції, додаткове обмеження на мінімальний рівень прав користувача, при якому операційна система передасть запит драйверу, що забезпечує додатковий захист. Крім того, в CTL_CODE вказується тип пристрою, якому посилає запит, і методи передачі буферів (вхідного й вихідного) між додатком користувача й драйвером режиму ядра.
Загальний прапор встановлюється тільки для нових типів пристроїв FILE_DEVICE_XXX при створенні власних повідомлень. Приватний прапор встановлюється при створенні набору власних повідомлень для повідомлень, що входять у цей набір. Тип пристрою відповідає типу пристрою, що був зазначений для даного драйвера у функції створення керуючого об'єкта пристрою IoCreateDevice [7, 9] при ініціалізації драйвера функцією DriverEntry [7, 9]. Код операції визначає запитувану операцію. Рівень прав користувача приймає одне з наступних значень [7, 9]:*
FILE_ANY_ACCESS, диспетчер вводу-виводу посилає IRP від будь-якого користувача що має хендл цільового об'єкта пристрою;*
FILE_READ_DATA, диспетчер вводу-виводу посилає IRP від будь-якого користувача, що має, принаймні, права читання;*
FILE_WRITE_DATA, диспетчер вводу-виводу посилає IRP від будь-якого користувача, що має, принаймні, права запису;*
(FILE_READ_DATA | FILE_WRITE_DATA), диспетчер вводу-виводу посилає IRP від будь-якого користувача, що має права запису й читання. Метод передачі буферів визначається однієї з наступних констант [7, 8, 9]:*
METHOD_BUFFERED, якщо відбувається передача невеликих обсягів інформації. У цьому випадку IRP буде містити покажчик на буфер в користувальницькому просторі й покажчик на буфер у системному просторі;*
METHOD_IN_DIRECT або METHOD_OUT_DIRECT, якщо драйвер по даному запиту зчитує або записує велика кількість інформації із пристрою, використовуючи DMA або PIO, і повинен швидко завершити операцію;*
METHOD_NEITHER, драйвер може одержувати цей запит, тільки виконуючись у контексті потоку, що послали даний запит. Запити користувача драйверу посилає Win32 функція DeviceIoControl [8], що має наступні параметри:*
HANDLE hDevice – описатель об'єкта пристрою, раніше відкритий з допомогою функції CreateFile;*
DWORD dwIoControlCode – CTL_CODE запитуваної операції; * LPVOID lpInBuffer – покажчик на вхідний буфер;*
DWORD nInBufferSize – розмір вхідного буфера;*
LPVOID lpOutBuffer –