Хелпикс

Главная

Контакты

Случайная статья





Описание проектов



Описание проектов

1) Драйвер-передатчик последовательного порта с циклическим опросом состояния в режиме ядра.

На базе примера “portio” WDK (winddk\src\general\portio). Драйвер устанавливает параметры порта (скорость, режим обмена) (обработчик EvtDeviceAdd). Программа в режиме пользователя передает блок данных драйверу при помощи API WriteFile. Драйвер получает блок данных (обработчик EvtIoWrite) и каждый байт блока данных записывается в регистр передатчика, готовность передачи перед отправкой байта опрашивается драйвером в непрерывном цикле. Запись/чтение из портов ввода-вывода можно реализовать при помощи ассемблерных вставок и команд in/out.

Исходные коды драйвера расположены в каталоге «sys», коды программы режима пользователя – в каталоге «gpdwrite».

Для отладки драйвера в виртуальной среде VirtualBox необходимо включить эмуляцию порта. Данные порта можно перенаправить в файл или воспользоваться программой эмуляции портов VSPE в хост-системе (см. лаб. 2). В последнем случае потребуется создать структуру типа «мост», перенаправить вывод VirtualBox в первый порт, а ко второму подключить стандартную программу-терминал (например, стандартный HyperTerminal Windows).

 

2) Драйвер-передатчик последовательного порта с опросом состояния по таймеру в режиме ядра.

На базе примера “portio” WDK (winddk\src\general\portio). Драйвер устанавливает параметры порта (скорость, режим обмена) (обработчик EvtDeviceAdd). Программа в режиме пользователя передает блок данных драйверу при помощи API WriteFile. Драйвер получает блок данных (обработчик EvtIoWrite), запускает таймер. При срабатывании таймера проверяется готовность регистра передатчика и в случае успеха очередной байт данных записывается в регистр передатчика. По окончании передачи блока данных запрос завершается. Запись/чтение из портов ввода-вывода можно реализовать при помощи ассемблерных вставок и команд in/out.

Для работы с таймером потребуется определить обработчик события таймера (см. документацию на EvtTimerFunc), в которой будет производиться вся основная работа:

· чтение регистра состояния линии, проверка флага готовности передатчика (бит 5),

· в случае готовности:

i. записать байт данных в регистр передатчика,

ii. обновить состояние буфера данных,

iii. если данных в буфере больше нет, то запрос записи завершается.

. Чтобы запустить таймер, необходимо создать объект-таймер при помощи метода WdfTimerCreate, а затем активировать отсчет методом WdfTimerStart. Для периодического таймера задать значение поля Period структуры WDF_TIMER_CONFIG “>0” (указывается при вызове WdfTimerCreate). Объект WDFREQUEST потребуется передать обработчику EvtTimerFunc. Чтобы это сделать, достаточно определить контекст объекта-таймера, состоящий из поля типа WDFREQUEST, указать этот контекст перед вызовом WdfTimerCreate с помощью макроса WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE (см. лекцию 2 по драйверам).

Исходные коды драйвера расположены в каталоге «sys», коды программы режима пользователя – в каталоге «gpdwrite».

Для отладки драйвера в виртуальной среде VirtualBox необходимо включить эмуляцию порта. Данные порта можно перенаправить в файл или воспользоваться программой эмуляции портов VSPE в хост-системе (см. лаб. 2). В последнем случае потребуется создать структуру типа «мост», перенаправить вывод VirtualBox в первый порт, а ко второму подключить стандартную программу-терминал (например, стандартный HyperTerminal Windows).

 

3) Драйвер-передатчик последовательного порта с циклическим опросом состояния в режиме пользователя, взаимодействие c программой через API WriteFile.

На базе примера “portio” WDK (winddk\src\general\portio). Драйвер устанавливает параметры порта (скорость, режим обмена) (обработчик EvtDeviceAdd). Программа в режиме пользователя передает байт данных драйверу при помощи API WriteFile. Драйвер получает блок данных (обработчик EvtIoWrite) и проверяет готовность регистра передатчика. В случае успеха байт записывается в регистр и запрос завершается с количеством записанных байт=1. В случае отсутствия готовности запрос завершается с количеством записанных байт=0. Программа пользователя передает строку данных, передавая каждый байт строки вплоть до успешного завершения. Запись/чтение из портов ввода-вывода можно реализовать при помощи ассемблерных вставок и команд in/out.

Исходные коды драйвера расположены в каталоге «sys», коды программы режима пользователя – в каталоге «gpdwrite».

Для отладки драйвера в виртуальной среде VirtualBox необходимо включить эмуляцию порта. Данные порта можно перенаправить в файл или воспользоваться программой эмуляции портов VSPE в хост-системе (см. лаб. 2). В последнем случае потребуется создать структуру типа «мост», перенаправить вывод VirtualBox в первый порт, а ко второму подключить стандартную программу-терминал (например, стандартный HyperTerminal Windows).

 

4) Драйвер-передатчик последовательного порта с циклическим опросом состояния в режиме пользователя, взаимодействие с программой по методу DeviceIoControl.

На базе примера “portio” WDK (winddk\src\general\portio). Драйвер устанавливает параметры порта (скорость, режим обмена) (обработчик EvtDeviceAdd). Программа в режиме пользователя опрашивает готовность регистра передатчика при помощи API DeviceIoControl. Драйвер получает запрос (обработчик EvtIoDeviceControl) и возвращает флаг готовности в поле данных запроса. Программа пользователя опрашивает готовность регистра передатчика и передает байт данных при помощи API WriteFile. Драйвер получает байт данных (обработчик EvtIoWrite) и записывает его в регистр передатчика. Запись/чтение из портов ввода-вывода можно реализовать при помощи ассемблерных вставок и команд in/out.

Чтобы организовать взаимодействие с пользовательской программой, понадобится выделить IOCTL-код (см. GpIoctl.h) и добавить соответствующую обработку IOCTL-кода в обработчик EvtIoDeviceControl. Из пользовательской программы передача запроса осуществляется при помощи API DeviceIoControl с тем же IOCTL-кодом.

Исходные коды драйвера расположены в каталоге «sys», коды программы режима пользователя – в каталоге «gpdwrite».

Для отладки драйвера в виртуальной среде VirtualBox необходимо включить эмуляцию порта. Данные порта можно перенаправить в файл или воспользоваться программой эмуляции портов VSPE в хост-системе (см. лаб. 2). В последнем случае потребуется создать структуру типа «мост», перенаправить вывод VirtualBox в первый порт, а ко второму подключить стандартную программу-терминал (например, стандартный HyperTerminal Windows).

 

5) Драйвер-приемник последовательного порта c возможностью установки скорости передачи, взаимодействие с программой по методу DeviceIoControl и ReadFile.

На базе примера “portio” WDK (winddk\src\general\portio). Программа в режиме пользователя передает драйверу параметры работы порта при помощи API DeviceIoControl. Драйвер получает запрос (обработчик EvtIoDeviceControl) и устанавливает параметры порта. Программа пользователя считывает байт данных при помощи API ReadFile. Драйвер получает запрос (обработчик EvtIoRead) и считывает регистр приемника, флаг наличия принятых данных. В случае наличия данных запрос завершается с количеством считанных байт=1, байт данных при этом записывается в поле дынных запроса. В случае отсутствия принятых данных, запрос завершается с количеством считанных байт=0. Запись/чтение из портов ввода-вывода можно реализовать при помощи ассемблерных вставок и команд in/out.

Чтобы организовать взаимодействие с пользовательской программой, понадобится выделить IOCTL-код (см. GpIoctl.h) и добавить соответствующую обработку IOCTL-кода в обработчик EvtIoDeviceControl. Из пользовательской программы передача запроса осуществляется при помощи API DeviceIoControl с тем же IOCTL-кодом.

Исходные коды драйвера расположены в каталоге «sys», коды программы режима пользователя – в каталоге «gpdwrite».

Для отладки драйвера в виртуальной среде VirtualBox необходимо включить эмуляцию порта. Данные порта можно перенаправить в файл или воспользоваться программой эмуляции портов VSPE в хост-системе (см. лаб. 2). В последнем случае потребуется создать структуру типа «мост», перенаправить вывод VirtualBox в первый порт, а ко второму подключить стандартную программу-терминал (например, стандартный HyperTerminal Windows).

 

6) Драйвер-приемник последовательного порта с реализацией асинхронного режима взаимодействия на уровне пользователя.

На базе примера “portio” WDK (winddk\src\general\portio). Драйвер устанавливает параметры порта (скорость, режим обмена) (обработчик EvtDeviceAdd). Программа пользователя считывает байт данных в асинхронном режиме при помощи API ReadFileEx. Драйвер получает запрос (обработчик EvtIoRead) и опрашивает флаг принятых данных в регистре состояния линии. В случае наличия данных запрос завершается с количеством считанных байт=1, байт данных при этом записывается в поле данных запроса. В случае отсутствия принятых данных в течение достаточно большого количества циклов опроса, запрос завершается с количеством считанных байт=0. Запись/чтение из портов ввода-вывода можно реализовать при помощи ассемблерных вставок и команд in/out.

Исходные коды драйвера расположены в каталоге «sys», коды программы режима пользователя – в каталоге «gpdwrite». Функции API асинхронного обмена (overlapped I/O) описан в MSDN (см. «ReadFileEx», «overlapped I/O»).

Для отладки драйвера в виртуальной среде VirtualBox необходимо включить эмуляцию порта. Данные порта можно перенаправить в файл или воспользоваться программой эмуляции портов VSPE в хост-системе (см. лаб. 2). В последнем случае потребуется создать структуру типа «мост», перенаправить вывод VirtualBox в первый порт, а ко второму подключить стандартную программу-терминал (например, стандартный HyperTerminal Windows).

 

7) Драйвер скрытного чтения скан-кодов клавиатуры.

На базе примера “kbfiltr” WDK (winddk\src\input\kbfiltr). Пример является каркасом драйвера-фильтра для стандартного стека драйверов клавиатуры. Нижестоящий драйвер – драйвер контроллера 8042 (i8042prt), вышестоящий – драйвер класса (kbdclass). Помимо обслуживания запросов в стеке клавиатуры, драйвер также создает независимый интерфейс для взаимодействия с пользовательской программой (см. функцию KbFiltr_CreateRawPdo). Обработка запросов от пользовательской программы осуществляется в обработчике KbFilter_EvtIoDeviceControlFromRawPdo.

Данные передаются вышестоящему драйверу в обработчике KbFilter_ServiceCallback, при этом параметры InputDataStart и InputDataEnd содержат передаваемые скан-коды. Необходимо модифицировать эту функцию так, чтобы передаваемые скан-коды сохранялись во внутренней структуре драйвера, а затем считывались пользовательской программой. Хранилищем для скан-кодов может быть уже имеющийся контекст (см. структуру DEVICE_EXTENSION в kbfltr.h), но для хранения дополнительных данных понадобится выделить новые поля (например, буфер типа WDFMEMORY). Буфер данных потребуется разместить в памяти в обработчике KbFilter_EvtDeviceAdd при помощи вызова WdfMemoryCreate (переменная-контекст инициализируется строчкой (filterExt = FilterGetData(hDevice);).

Чтобы организовать взаимодействие с пользовательской программой, понадобится выделить IOCTL-код (см. public.h) и добавить соответствующую обработку IOCTL-кода в обработчик KbFilter_EvtIoDeviceControlFromRawPdo. Из пользовательской программы передача запроса осуществляется при помощи API DeviceIoControl с тем же IOCTL-кодом.

Исходные коды драйвера расположены в каталоге «sys», коды пользовательской программы – в каталоге «exe».

 

8) Драйвер скрытной замены скан-кодов клавиатуры.

На базе примера “kbfiltr” WDK (winddk\src\input\kbfiltr). Пример является каркасом драйвера-фильтра для стандартного стека драйверов клавиатуры. Нижестоящий драйвер – драйвер контроллера 8042 (i8042prt), вышестоящий – драйвер класса (kbdclass). Помимо обслуживания запросов в стеке клавиатуры, драйвер также создает независимый интерфейс для взаимодействия с пользовательской программой (см. функцию KbFiltr_CreateRawPdo). Обработка запросов от пользовательской программы осуществляется в обработчике KbFilter_EvtIoDeviceControlFromRawPdo.

Данные передаются вышестоящему драйверу в обработчике KbFilter_ServiceCallback, при этом параметры InputDataStart и InputDataEnd содержат передаваемые скан-коды. Необходимо модифицировать эту функцию так, чтобы определенный скан-код заменялся на заданный (например, скан-код клавиши A заменялся на скан-код клавиши B). Значения заменяемого и заменяющего скан-кода задаются программой пользователя. Хранилищем для значений скан-кодов может быть уже имеющийся контекст (см. структуру DEVICE_EXTENSION в kbfltr.h), но для хранения дополнительных данных понадобится выделить новые поля. При замене скан-кодов следует учесть, что скан-код и код символа в таблице ASCII не есть одно и то же. В частности, скан код клавиши содержит информацию о том, была ли клавиша нажата или отпущена, т.е. для каждого набранного символа передается 2 скан-кода: по нажатию и отпусканию. Кроме того, существуют т.н. расширенные скан-коды таких клавиш, как «стрелка», они состоят из нескольких байт (см. структуру KEYBOARD_INPUT_DATA в WDK Docs).

Чтобы организовать взаимодействие с пользовательской программой, понадобится выделить IOCTL-код (см. public.h) и добавить соответствующую обработку IOCTL-кода в обработчик KbFilter_EvtIoDeviceControlFromRawPdo. Из пользовательской программы передача запроса осуществляется при помощи API DeviceIoControl с тем же IOCTL-кодом.

Исходные коды драйвера расположены в каталоге «sys», коды пользовательской программы – в каталоге «exe».

 

9) Драйвер виртуального диска с возможностью сохранения образа в режиме пользователя.

На базе примера “ramdisk ” WDK (winddk\src\storage \ramdisk). Драйвер ramdisk создает экземпляр виртуального диска, данные которого хранятся в ОЗУ. При выключении питания данные теряются. В данной работе требуется доработать драйвер таким образом, чтобы по команде пользовательской программы можно было считать образ диска. Взаимодействие с программой организовать при помощи метода DeviceIoControl.

Чтобы организовать взаимодействие с пользовательской программой, понадобится определить новый IOCTL-код. Сделать это можно так, как в драйвере «portio», файл GpIoctl.h (см. описание варианта 4).  Обработку IOCTL-кода в обработчик RamDiskEvtIoDeviceControl.

Пользовательская программа должна открывать интерфейс устройства (метод CreateFile), выполнять запрос DeviceIoControl с указанным IOCTL-кодом и записывать полученные данные в файл. Строку с именем интерфейса, создаваемого драйвером, можно считать с помощью утилиты IRP Tracker.

 

10) Драйвер виртуального диска с возможностью сохранения/восстановления образа в режиме ядра.

На базе примера “ramdisk ” WDK (winddk\src\storage \ramdisk). Драйвер ramdisk создает экземпляр виртуального диска, данные которого хранятся в ОЗУ. При выключении питания данные теряются. В данной работе требуется доработать драйвер таким образом, чтобы при выключении питания образ диска сохранялся, а при загрузке – восстанавливался из файла. Работа с файлами осуществляется с помощью методов:

ZwCreateFile – создать файл,

ZwWriteFile – записать данные,

ZwReadFile – прочитать данные,

ZwCloseFile – завершить работу с файлом.

Имена файлов в режиме ядра и режиме пользователя отличаются, например C:\WINDOWS\example.txtв пространстве объектов ядра будет иметь вид \DosDevices\C:\WINDOWS\example.txt(см. «Using Files In A Driver» в WDK docs).

Запись образа можно выполнить перед освобождением буфера памяти образа диска, в обработчике RamDiskEvtDeviceContextCleanup. Восстановление образа можно осуществить прямо в обработчике RamDiskEvtDeviceAdd.

 

Исходные коды драйвера расположены в каталоге «sys», коды программы режима пользователя – в каталоге «exe».

 

11) Реализация именованного канала в драйвере устройства, взаимодействие c программой по методу ReadFile.

На базе примера “ioctl” WDK (winddk\src\general\ioctl\kmdf). В драйвере “ioctl” реализована простейшая обратная связь: данные, записываемые по методу WriteFile (обработчик FileEvtIoWrite), в точности считываются по методу ReadFile (обработчик FileEvtIoRead). Для хранения данных драйвер создает временный файл (см. обработчик NonPnpEvtDeviceFileCreate). К драйверу прилагается программа пользовательского режима, демонстрирующая возможности драйвера (см. каталог «exe»). Требуется модифицировать драйвер таким образом, чтобы данные могли быть записаны одним процессом и считаны другим процессом (аналог именованного канала). Если при получении запроса на чтение данных драйвер обнаруживает, что данные не готовы (еще не была произведена запись), завершение запроса откладывается до тех пор, пока не будет выполнена запись. Для этого потребуется сохранить запрос (объект типа WDFREQUEST) в обработчике FileEvtIoRead, и завершить его в FileEvtIoWrite (потребуется также добавить соответствующее поле в структуру контекста CONTROL_DEVICE_EXTENSION). Обслуживание очереди запросов должно быть установлено в режим «sequential».

Для демонстрации работы драйвера потребуется запустить 2 процесса, в одном из которых осуществлять запись, в другом – чтение данных. Перед этим каждый из процессов должен открыть экземпляр одного и того же интерфейса. По умолчанию интерфейс может быть открыть только одним процессом, чтобы изменить это поведение, найдите строку WdfDeviceInitSetExclusive(DeviceInit, TRUE) и замените TRUE на FALSE.

 

12) Реализация именованного канала в драйвере устройства, взаимодействие с программой по методу DeviceIoControl.

На базе примера “ioctl” WDK (winddk\src\general\ioctl\kmdf). В драйвере “ioctl” реализована простейшая обратная связь: данные, записываемые по методу WriteFile (обработчик FileEvtIoWrite), в точности считываются по методу ReadFile (обработчик FileEvtIoRead). Для хранения данных драйвер создает временный файл (см. обработчик NonPnpEvtDeviceFileCreate). К драйверу прилагается программа пользовательского режима, демонстрирующая возможности драйвера (см. каталог «exe»).

Требуется перенести обработку запросов по методам Read/Write на метод DeviceIoControl.

 

13) Виртуальный драйвер-генератор данных с постоянным периодом, взаимодействие c программой по методу ReadFile.

На базе примера “ioctl” WDK (winddk\src\general\ioctl\kmdf). В драйвере “ioctl” реализована простейшая обратная связь: данные, записываемые по методу WriteFile (обработчик FileEvtIoWrite), в точности считываются по методу ReadFile (обработчик FileEvtIoRead). Для хранения данных драйвер создает временный файл (см. обработчик NonPnpEvtDeviceFileCreate).

Требуется модифицировать драйвер таким образом, чтобы драйвер по таймеру постоянно генерировал строку данных, добавляя по одному байту за каждый период, имитируя тем самым устройство с постоянным потоком данных. При получении запроса на чтение возвращается сгенерированная строка, содержимое строки при этом очищается. Для этого потребуется убрать лишний функционал в драйвере, а вместо чтения данных из временного файла копировать содержимое некоторого внутреннего буфера, обновляемого по таймеру.

Для работы с таймером потребуется определить обработчик события таймера (см. документацию на EvtTimerFunc), в которой будет обновляться строка генерируемых данных. Чтобы запустить таймер, необходимо создать объект-таймер при помощи метода WdfTimerCreate, а затем активировать отсчет методом WdfTimerStart. Для периодического таймера задать значение поля Period структуры WDF_TIMER_CONFIG “>0” (указывается при вызове WdfTimerCreate).

Буфер данных потребуется передать обработчику EvtTimerFunc. Чтобы это сделать, достаточно определить контекст объекта-таймера ,указать этот контекст перед вызовом WdfTimerCreate с помощью макроса WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE (см. лекцию 2 по драйверам).

Исходные коды драйвера расположены в каталоге «sys», коды программы режима пользователя – в каталоге «exe».

 

14) Виртуальный драйвер-генератор данных с постоянным периодом, взаимодействие с программой по методу DeviceIoControl.

То же самое, что и 14, но вместо взаимодействия с режимом пользователя по методу ReadFile реализовать взаимодействие по методу DeviceIoControl.

 

15) Драйвер временной задержки, взаимодействие с программой по методу ReadFile.

На базе примера “ioctl” WDK (winddk\src\general\ioctl\kmdf).

Требуется модифицировать драйвер таким образом, чтобы драйвер при получении запроса на чтение отложил его завершение до истечения указанной в запросе временной задержки. Для этого в обработчике запроса чтения (FileEvtIoRead) потребуется создать и запустить таймер, указав при этом величину таймаута.

Для работы с таймером потребуется определить обработчик события таймера (см. документацию на EvtTimerFunc), в которой будет завершаться запрос чтения. Чтобы запустить таймер, необходимо создать объект-таймер при помощи метода WdfTimerCreate, а затем активировать отсчет методом WdfTimerStart. Для непериодического таймера задать значение поля Period структуры WDF_TIMER_CONFIG равным 0 (указывается при вызове WdfTimerCreate).

Объект WDFREQUEST потребуется передать обработчику EvtTimerFunc. Чтобы это сделать, достаточно определить контекст объекта-таймера, состоящий из поля типа WDFREQUEST, указать этот контекст перед вызовом WdfTimerCreate с помощью макроса WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE (см. лекцию 2 по драйверам).

Исходные коды драйвера расположены в каталоге «sys», коды программы режима пользователя – в каталоге «exe».

 

16) Драйвер временной задержки, взаимодействие с программой по методу DeviceIoControl.

То же, что и 16, но вместо взаимодействия с режимом пользователя по методу ReadFile реализовать взаимодействие по методу DeviceIoControl.

 

 



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.