Пишем драйвер Windows на ассемблере
- Название:Пишем драйвер Windows на ассемблере
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Пишем драйвер Windows на ассемблере краткое содержание
Пишем драйвер Windows на ассемблере - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Сначала мы должны определить код запроса – он будет один из трёх: IRP_MJ_CREATE, IRP_MJ_CLOSEили IRP_MJ_DEVICE_CONTROL.
Мы получаем этот код из структуры IO_STACK_LOCATION, указатель на которую мы получаем из структуры IRP(в свою очередь, указатель на irp был передан нам в пераметре 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 на ассемблере? –
Зависит от желания и возможностей.
Однако вопрос оставлю открытым.
В любом случае, мне интересно было бы узнать, использовал ли кто-нибудь этот пример для создания своего драйвера? Пишите.
Интервал:
Закладка: