Драйвер-приемник последовательного порта 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 в хост-системе. В последнем случае потребуется создать структуру типа «мост», перенаправить вывод VirtualBox в первый порт, а ко второму подключить стандартную программу-терминал (например, стандартный HyperTerminal Windows).