Драйвер №3 и тестовое приложение
Создание символической ссылки на имя объекта-устройство, вывод трассировочной информации с помощью функции DbgPrint()
Имя проекта – simple3
Описание файла simple3.C
От simple2 текст будет отличаться следующим образом:
1) При успешном создании объекта-устройство создается символическая ссылка на его имя с помощью функции IoCreateSymbolicLink():
NTSTATUS IoCreateSymbolicLink(IN PUNICODE_STRING SymbolicLinkName,
IN PUNICODE_STRING DeviceName);
Имя символической ссылки “\DosDevices\Simple3Link” должно быть инициализировано функцией RtlInitUnicodeString().
2) В случае неудачи создания символической ссылки объект-устройство должен быть удален с помощью функции IoDeleteDevice().
3) В функции – точке входа выгрузки драйвера, перед удалением устройства должна быть удалена символическая ссылка с помощью функции IoDeleteSymbolicLink():
NTSTATUS IoDeleteSymbolicLink(PUNICODE_STRING SymbolicLinkName);
SymbolicLinkName должна быть инициализирована с помощью RtlInitUnicodeString() в то же значение, что и в функции DriverEntry().
4) Во все 4 функции драйвера (DriverEntry, Create, Close и Unload) в начало и конец должна быть добавлена выдача трассировочной информации. Кроме того, такая выдача должна быть добавлена в блоки проверки условий успеха/неудачи создания устройства и символической ссылки.
Для этого:
После директивы #include <ntddk.h> добавить
#if DBG
#define DebugPrint(x) DbgPrint x
#else
#define DebugPrint(x)
#endif
В коде программы вызывать
DebugPrint((trace_info));
где trace_info – текстовая строка, например, вида “simple3: Entering DriverEntry\n”. Формат функции DbgPrint соответствует функции printf().
Тестовое приложение
После создания драйвера simple3 должно быть создано тестовое приложение simple3app. Оно должно использовать функцию CreateFile() для открытия устройства с именем “\\.\Simple3Link”, т.е. с именем символической ссылки на имя устройства. В случае успеха и неудачи открытия файла должны выводиться соответствующие сообщения.
Для создания проекта тестового приложения в той же рабочей области, где находится проект драйвера, щелкнуть правой кнопкой мыши в окне диспетчера проектов в закладке “File Wiew” на самой верхней строчке ( “Workspace ‘Simple3’: 1 project(s)” ). В появившемся меню выбрать пункт “Add New Project to Workspace…”. Тип проекта – Win32 console application, имя проекта – simpl3app, проект на базе приложения Hello, World.
В заголовочном файле StdAfx.h не забыть добавить подключение заголовочного файла windows.h (основной заголовочный файл для приложений Windows).
Проверка работоспособности драйвера
Для установления драйвера в системе будет использована утилита Monitor.
В меню “File\Open Driver…” указать местоположение файла драйвера simple3.sys.
При выборе кнопки “Start Driver” должна появиться трассировочная информация для функции драйвера DriverEntry. Проконтролировать успешность создания объекта-устройство и символической ссылки на его имя. В случае ошибки исправить драйвер.
Если драйвер запущен успешно, запустить тестовое приложение. Оно должно сообщить об успехе открытия файла, при этом должна появиться трассировочная информация для функции – обработчика запроса в/в IRP_MJ_CREATE. При закрытии приложением описателя файла либо явно с помощью вызова CloseHandle() либо неявно при закрытии приложения должна появиться трассировочная информация для функции – обработчика запроса в/в IRP_MJ_CLOSE.
При выборе кнопки “Stop Driver” должна появиться трассировочная информация для функции - обработчика запроса в/в DriverUnload.
При повторном нажатии кнопки “Start Driver” проконтролировать правильность работы функции DriverEntry. Распространенная ошибка – забыть уничтожить символическую ссылку в DriverUnload. В этом случае DriverEntry отработает с ошибкой.
Остановить драйвер, удалить его из системы с помощью кнопки “Remove service entry”
При испытании драйвера проконтролировать создание и уничтожение ключей реестра для драйвера с помощью приложения regedit.exe (ключ реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Simple3), а также создание и уничтожение объектов драйвер, устройство и символическая ссылка в пространстве имен диспетчера объектов с помощью утилиты WinObj (директории \??, \Driver, \Device, найти элемент \DosDevices).