Рефераты. Драйвер клавиатуры, реализующий функции музыкального синтезатора на клавиатуре для Windows NT 5

Для того, чтобы скомпилировать управляющую программу, необходимо чтобы был установлен пакет разработки Microsoft Visual Studio .Net. Результатом компиляции является файл DriverControl.exe в папке DriverControl/Release.

Сборка проекта

Чтобы собрать проект (драйвер и управляющая программа) необходимо скопировать в любую папку файл DriverControl.exe, создать в этой папке другую папку driver и поместить в неё файл kbd_filter.sys.

Установка программного обеспечения

Для того, чтобы установить разработанное программное обеспечение на компьютере, необходимо запустить приложение DriverControl.exe. На вкладке «Установка драйвера» нажать на кнопку «Установить». Для того, чтобы изменения в системе вступили в силу, необходимо перезагрузить компьютер.

Установленный драйвер можно увидеть с помощью утилиты devicetree, входящей в состав DDK.

3.4 Использование библиотеки DirectKS

Библиотека DirectKS предоставляет функциональность для работы с интерфейсом Kernel Streaming в режиме пользователя. В исходном варианте DirectKS работает с устройствами, поддерживающими формат WAVE-данных. Задачей данной курсовой работы является работа с MIDI-устройствами. Поэтому в библиотеку были внесены изменения. Библиотека находится в файле DriverControl/directks. Все внесённые изменения описаны в Приложении (см пункт 6.2).

Библиотека DirectKS используется следующим образом:

CKsAudRenPin * OpenMidiPin()

{HRESULT hr;

CKsAudRenFilter * pFilter = NULL;

CKsAudRenPin * pPin = NULL;

CKsEnumFilters * pEnumerator = new CKsEnumFilters(&hr);

GUID aguidEnumCats[] = {STATIC_KSCATEGORY_AUDIO};

// Найти все фильтры категории STATIC_KSCATEGORY_AUDIO

// Создаст списки всех пинов этих фильтров

hr = pEnumerator->EnumFilters(eAudRen, aguidEnumCats, 1, TRUE, FALSE, TRUE);

if(SUCCEEDED(hr))

{// Перечислить все фильтры и пины, пока не будет найден

// пин нужного формата данных - формата MIDI

LISTPOS listPos = pEnumerator->m_listFilters.GetHeadPosition();

while(!pPin && pEnumerator->m_listFilters.GetNext(listPos, (CKsFilter**)&pFilter))

{pPin = pFilter->CreateRenderPin(FALSE);}}

delete pFilter;

return pPin;}

Если пин с нужным форматом данных обнаружен, то функция возвращает указатель на класс для работы с пином.

Для того чтобы получить HANDLE пина, нужно использовать свойство:

Pin->GetHandle()

3.5 Отправление запросов из приложения в драйвер

key_midi - модуль отправления запросов из приложения в драйвер, находится в папке driverio.

Этот модуль содержит таблицу соответствий позиции клавиши к паре (скан-код, флаг).

#define KEY_MIDI_FILE "C:\\KeyMidi.dat"

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

HRESULT KeyGetScanCode(OUT PUCHAR ScanCode, OUT PUCHAR Flag,

IN UCHAR Position);

По позиции клавиши определяется её скан-код и флаг.

HRESULT KeySaveNote(IN LPCTSTR FileName, IN UCHAR ScanCode,

IN UCHAR Flag, IN UCHAR Position,

IN UCHAR Channel, IN UCHAR Instrument, IN UCHAR Note,

IN UCHAR Used);

Сохраняет в файле FileName музыкальную информацию о клавише.

HRESULT KeyGetNote(IN LPCTSTR FileName,

OUT PUCHAR ScanCode, OUT PUCHAR Flag, IN UCHAR Position,

OUT PUCHAR Channel, OUT PUCHAR Instrument,

OUT PUCHAR Note);

По позиции клавиши получает из файла FileName её музыкальную информацию.

HRESULT KeyDriverSendNote(IN UCHAR ScanCode, IN UCHAR Flag,

IN UCHAR Position, IN UCHAR Channel,

IN UCHAR Instrument, IN UCHAR Note,

IN UCHAR Used);

Сохраняет в драйвере музыкальную информацию о клавише.

HRESULT KeyDriverSendAllNotes(IN LPCTSTR FileName);

Сохраняет в драйвере музыкальную информацию обо всех клавишах, музыкальная информация о которых сохранена в файле FileName.

HRESULT SharePinWithDriver(IN HANDLE Pin);

Отправляет в драйвер HANDLE открытого пина.

3.6 Описание интерфейса пользователя

Установка

Для того чтобы установить или удалить драйвер необходимо открыть программу DriverControl.exe. Выбрать вкладку «Установка драйвера». Кнопки «Установить» и «Удалить» означают установку или удаление драйвера из системы (рис. 3.1). Для того, чтобы изменения вступали в силу, необходимо перезагружать компьютер.

В случае, если на компьютере не найдены нужные аудиоустройства, будет выведено сообщение «Невозможно открыть MIDI-пин». В этом случае драйвер установить можно будет, но назначить ноты для клавиши будет нельзя.

Рис.3.1. Установка драйвер

Управление

Для того чтобы можно было управлять драйвером, нужно выбрать в программе DrivcrControl.exe вкладку «Назначение звука». Выбирая кнопку, которая соответствует клавиши клавиатуры, можно для неё назначить канал, инструмент и ноту. Можно предварительно проверить звучание ноты, а потом сохранить музыкальную информацию в драйвере. Информация будет продублирована в файле C:\KeyMidi.dat.

Рис.3.2. Управление драйвером

Автозагрузка

Во время перезагрузки операционной системы все значения переменных, сохранённых в памяти драйвера, теряются. Т.е. драйверу необходимо ждать пользовательское приложение, которое отправит ему объект пина и заново назначит ноты для клавиш.

Для этого было создано простое приложение, которое открывает пин, отправляет его в драйвер, отправляет в драйвер информацию обо всех музыкальных параметрах, созранённых в файле C:\KeyMidi.dat.

Проект этого приложения находится в папке DriverControl под названием DriverAutoloader. Скомпилированную программу DriverAutoloader.exe можно найти в папке DriverControl/Release. Эту программу по желанию можно сохранить в папке Startup, приложения из которой загружаются во время загрузки ОС Windows.

3.7 Тестирование программного обеспечения

Драйвер был протестирован с использованием стандартной тестирующей утилиты DriverVerifier пакета DDK. С его помощью были проведены следующие тесты:

Операции с пулами памяти

Корректность уровней IRQL, на которых выполняется код драйвера

Обнаружение взаимоблокировок

Нехватка ресурсов

Нетипичные запросы к драйверу

Все тесты прошли успешно. Память в системе распределялась правильно, ошибок с ней не возникало. На нехватку ресурсов драйвер реагировал корректно. Нетипичные запросы к драйверу не обрабатывались им.

После установки драйвера и назначения музыкальных параметров для клавиш работа драйвера продолжается без «синего экрана».

На компьютерах, где не установлены звуковые карты Sound Blaster клавиши не издают звуков, т.к. встроенные звуковые карты не поддерживают тех IOCTL-запросов, которые используются во время работы с объектом пина.

Тестирование происходило на ОС Windows XP и Windows Server 2003.

4. Заключение

Исследована структура драйверов Windows

Определено место драйвера в стеке драйверов и выбрана структура программного обеспечения, состоящего из двух частей:

- верхнего драйвера-фильтра клавиатуры

- программы, которая осуществляет настройку параметров музыкального озвучивания клавиш и управляет работой драйвера посредством IOCTL-запросов

Изучены механизмы:

- встраивания драйвера-фильтра в стек драйверов

- взаимодействия компонент программного обеспечения через IOCTL-запросы

Разработаны механизмы:

- поиска доступа к аудиоустройству в режиме ядра

- синхронизации потоков, работающих на разных уровнях IRQL

Разработано программное обеспечение в соответствии с техническим заданием и проведено его тестирование.

Разработанный программный продукт полностью удовлетворяет поставленной задаче и осуществляет настраиваемое озвучивание нажатий клавиш на клавиатуре под управлением ОС Microsoft Windows NT 5.

5. Список литературы

1. Oney W. Programming the Microsoft Windows Driver Model.-- Redmond, Washington: Microsoft Press., 1999.

2. Форум разработчиков MS Windows на сайте microsoft.com.

3. Рассылка, посвящённая разработке аудиодрайверов на сайте wdmaudiodev.de

4. Рассылка, посвящённая разработке драйверов для Windows на сайте osronline.com

5. Microsoft Windows Server 2003 DDK Documentation.

6. Приложения

6.1 Функции установки драйвера в системе

#define DRIVER_KEY "System\\CurrentControlSet\\Services\\"DRIVER_NAME

#define FILTER_KEY "System\\CurrentControlSet\\Control\\Class\\{4D36E96B-E325-11CE-BFC1-08002BE10318}"

char * SearchString(char * Value, DWORD ValueLength, char * String)

{if(ValueLength < strlen(String)) return NULL;

DWORD len = (DWORD) (ValueLength - strlen(String));

do

{if(!stricmp(&Value[len], String) && (!len || !Value[len - 1]))

{return &Value[len];}}

while(len--);

return NULL;}

HRESULT DriverWasInstalled()

{HKEY hKeyFilter;

DWORD type, length;

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.