- 1
- 2
pIrp):
mov ebx,pIrp
mov eax,(_IRP ptr [ebx]).Tail.Overlay.CurrentStackLocation ; Восстанавливаем указатель на структуру IO_STACK_LOCATION
mov pIrpStack,eax
mov ebx,pIrpStack
mov al,(IO_STACK_LOCATION ptr [ebx]).MajorFunction ; al – Код сообщения
Дальше отрабатываем запросы по-разному.
Для IRP_MJ_CREATE и IRP_MJ_CLOSEобработка фиктивная. Мы просто возвращаем код успеха STATUS_SUCCESS в регистреeax.
Для IRP_MJ_DEVICE_CONTROL мы должны получить данные о длине входного и выходного буферов приложения пользователя, восстановить указатель на промежуточный системный буфер и адрес переменной, в которую будет записана длина информационного пакета, передаваемого из драйвера приложению пользователя.
Мы размещаем эти данные в локальных переменных, чтобы потом вызвать вторичную функцию DeviceIoControlHandler, где и будет выполнена обработка.
Часть 4. Детализация.
Детализация заключается в размещении пользовательского кода во вторичной процедуре обработчика IRP_MJ_DEVICE_CONTROL. Мы будем отрабатывать 2 запроса: IOCTL_USER_REQUEST_1 – отправка переданной строки в отладочный вывод, и IOCTL_USER_REQUEST_2 – перевод литер переданной строки в нижний регистр. Коды запросов объявлены в файле-включении ioctlcodes.inc В принципе, реализация этих вещей довольно проста и не требует комментариев.Часть 5. Компиляция и сборка.
Для компиляции программы следует выполнить командный файл assemble.cmd. Его содержимое: ..\..\bin\ml.exe –coff –Fl –c –Foasmdrv.obj main.asm В результате мы получим листинг main.lst и объектный модульasmdrv.obj. Дальше мы должны собрать бинарник драйвера из объектного модуля. Для этой цели существует команда link.cmd: ..\..\bin\link.exe @linkcmd.rsp в файле linkcmd.rsp размещены настройки линкера. Полный список выглядит так: -MACHINE:IX86 -STACK:32768,4096 -OPT:REF -OPT:ICF -INCREMENTAL:NO -FORCE:MULTIPLE -RELEASE -DEFAULTLIB:wdm.lib -DRIVER -ALIGN:0x20 -SUBSYSTEM:NATIVE -BASE:0x10000 -ENTRY:DriverEntry@8 -OUT:disk1\asmdrv.sys asmdrv.obj В результате сборки мы получаем файлAsmDrv.sys в подкаталоге Disk1.Часть 6. Как правильно установить драйвер.
Чтобы установить драйвер в системе, нам потребуется специальный конфигурационный файл, хранящий некоторые дополнительные сведения о драйвере, важные для системы. Это так называемый inf-файл. Опять-таки, к счастью для вас, я уже написал этот файл – asmdrv.inf. Вы можете открыть его для просмотра и изучить. Файл находится в подкаталоге Disk1 проекта. Ну что же? – Пробуем установиться. Открываем Панель управления, запускаем Мастер установки оборудования и указываем ему путь к файлу asmdrv.inf в режиме ручного выбора. Завершаем установку. Windows 98 на этом месте может попросить перезагрузки. Не отказывайте ей :) Windows 2000/XP запускает драйвер сразу. Вы можете проконтролировать установку, убедившись в наличии устройства "Простейший WDM драйвер на Ассемблере" в списке менеджера устройств. Поздравляю, если вы всё сделали правильно, наш драйвер – о, чудо! – работает.Часть 7. Тестовая программа.
Проект тестовой программы расположен в подкаталоге TestApp. Откройте его в Delphi и перекомпилируйте. В результате вы получите файл AsmDrvTest.exe, который нужно будет запустить. В принципе, это одна из самых простых программ в мире. Она занимается отправкой драйверу AsmDrv.sys запросов IOCTL_USER_REQUEST_1 и _2по требованию пользователя, передавая драйверу строку символов. Работу этой программы рекомендуется изучить самостоятельно. Одновременно с тестовой программой используйте утилиту DbgView для просмотра отладочного вывода.Часть 8. Напоследок.
Мы убедились ещё раз, что не боги горшки обжигают. Следует ли писать драйверы WDM на ассемблере? – Зависит от желания и возможностей. Однако вопрос оставлю открытым. В любом случае, мне интересно было бы узнать, использовал ли кто-нибудь этот пример для создания своего драйвера? Пишите.- 1
- 2