оботи драйвера створюються і застосовуються такі об'єкти:
об'єкт драйвера;
об'єкти пристроїв;
символьні посилання на пристрої, які доступні з режиму користувача.
Етапи роботи драйвера.
) Створення об'єкта драйвера. Створюється при завантаженні драйвера на етапі його запуску. У цей момент запускається функція DriverEntry і заповнюється масив MajorFunction, а також покажчик на об'єкт пристрою і назад. p align="justify"> До складу об'єкта пристрою входять:
посилання на об'єкт драйвера, який обробляє запити до пристрою;
тип пристрою.
) Створення символьного посилання на пристрій. Для того щоб об'єкт "пристрій" став доступний кодом режиму користувача, драйвер повинен створити в доступному йому (коду режиму користувача) каталозі "??" Ще один об'єкт - символьне посилання (symbolic link). Драйвер shablon.sys створює символьне посилання "slshablon" на свій пристрій "devshablon" в каталозі "??", Значенням якої є рядок " Device devshablon". p align="justify"> Таким чином, вже при завантаженні драйвера (у нашому випадку, на етапі завантаження ОС) ми маємо три об'єкти в пам'яті: драйвер " Driver shablon", пристрій " Device shablon" і символьне посилання на пристрій "?? slshablon".
) Відкриття. Далі під час запуску програми викликається CreateFile. Там є посилання на пристрій. Зі структури об'єкта пристрою DEVICE_OBJECT витягуються відомості про обслуговуючий його драйвері. Диспетчер введення-виведення формує пакет запиту вводу-виводу IRP типу IRP_MJ_CREATE і направляє його драйверу. Так драйвер дізнається про те, що код режиму користувача намагається отримати доступ до його пристрою. Якщо драйвер не має нічого проти, то він повертає код успіху. У нашого драйвера є спеціальна процедура диспетчеризації, яка реагує на це IRP - DispatchCreateClose (там поєднана процедура для відкриття і закриття пристрою). У ній в полі Io.Status.Status передається STATUS_SUCCESS, а в Io.Status.Information - 0, тому в цьому випадку нічого не потрібно передавати. Така відповідь від драйвера є сигналом диспетчеру об'єктів про створення віртуального файлу. При цьому в таблиці описателей (handle table) процесу створюється новий елемент з покажчиком на об'єкт "файл", і коду режиму користувача повертається новий дескриптор. p align="justify"> Якщо все ОК, то ми зберігаємо дескриптор файлу, повернений CreateFile, у змінній hDevice.
) Операції в/вив. Тепер ми маємо можливість здійснювати операції керування цим пристроєм за допомогою виклику функцій DeviceIoControl. Оскільки драйвер пристрою може в принципі виконувати багато різних завдань, необхідно якось диференціювати запити. Для цього й призначений другий параметр dwIoControlCode, званий керуючим кодом ввод...