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

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

Принцип синхронизации потоков

Функция MyFilterReadComplete:

(поток 1, выполняется на IRQL <= DISPATCH_LEVEL)

if(PlayCompleted)

{Подсоединить Очередь Б к Очереди А

Опустошить Очередь Б

for(все нажатые или отпущенные клавиши)

{Добавить в Очередь А позицию клавиши}

Установить Событие PlayEvent в состояние «Сигнал»}

else

{for(все нажатые или отпущенные клавиши)

{Добавить в Очередь Б позицию клавиши}}

Функция PlayThread:

(поток 2, выполняется на IRQL = PASSIVE_LEVEL)

Ждать пока Событие PlayEvent не перейдёт в состояние «Сигнал»

Установить Событие PlayEvent в состояние «Нет сигнала»

// Устанавливает значение 0 переменной PlayCompleted

// Обеспечивает монопольный доступ к этой переменной аппаратными средствами

InterlockedExchange(&PlayCompleted, 0);

PinSetState(KSSTATE_RUN);

while(Очередь А не пуста)

{Извлечь из Очереди А информацию о нажатой клавиши

if(состояние на клавиатуре = нажата и

музыкальное состояние = отпущена)

{Воспроизвести ноту

Музыкальное состояние = нажата}

else if(состояние на клавиатуре = отпущена и

музыкальное состояние = нажата)

{Выключить ноту

Музыкальное состояние = отпущена}}

PinSetState(KSSTATE_PAUSE);

PinSetState(KSSTATE_STOP);

InterlockedExchange(&PlayCompleted, 1);

Т.к. первый поток выполняется на более высоком IRQL, то он может прервать выполнение второго потока в любой момент. Например, это может произойти до того, как второй поток завершит обработку Очереди А. В этом случае первый поток заполняет Очередь Б. Как только второй поток закончит свою предыдущую операцию и установит флаг PlayCompleted, то первый поток подсоединит Очередь Б к Очереди А, добавит новые элементы к Очереди А и сигнализирует второму потоку о том, что можно начать новую музыкальную обработку. Второй поток получит управление не сразу, а как только первый поток, работающий на более высоком уровне IRQL, полностью завершит свою работу.

Функция InterlockedExchange обеспечивает монопольный доступ к переменной того потока, который их вызвал. Все остальные потоки, которые используют эту переменную в это же время, будут ждать пока до конца не отработает InterlockedExchange. Использование этой функции возможно на любом уровне IRQL, т.к. она реализована аппаратно.

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

3. Технологический раздел

3.1 Выбор средств разработки программного обеспечения

Из двух языков, используемых для программирования драйверов, С и ассемблера, выбор следует остановить на С ввиду того, что это язык высокого уровня, т.е. этот язык обеспечивает уровень абстракции выше, чем ассемблер, что безусловно большой плюс. Кроме того, этот язык используется фирмой Microsoft в наиболее распространенном пакете для разработки драйверов MS DDK. Еще одним плюсом С является то, что вместе с пакетом DDK поставляется специальный компилятор для С, предназначенный для компиляции драйверов.

Ориентированный на язык С, набор DDK включает в себя справочники, все необходимые библиотеки и заголовочные файлы. Поэтому была использована технология структурного программирования. В данной работе применяется DDK для Windows Server 2003.

Для редактирования исходных текстов применяется среда Microsoft Visual Studio .NET и входящий в неё компилятор Microsoft Visual C++.

При сборке исполняемого (с расширением .sys) файла используется утилита build, входящая в состав DDK.

При разработке управляющего приложения используется среда Microsoft Visual Studio .NET с визуальным редактором форм.

В проекте используется библиотека DirectKS, которая является примером получения доступа к фильтрам Kernel Streaming в режиме пользователя. В библиотеку внесены изменения. Использование библиотеки описано ниже.

Операционной системой, в которой работает драйвер, является Windows NT 5, т.е. Windows 2000, Windows XP, Windows Server 2003.

Т.к. драйвер работает с аудиоустройством напрямую, то на компьютере должна быть установлена такая звуковая карта, которая поддерживает запросы и формат данных, которые ей отправляет драйвер. Звуковые карты, начиная с Creative Sound Blaster Live поддерживают запросы, используемые в данном курсовом проекте.

3.2 Установка драйвера в системе

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

Каждое устройство имеет свой раздел в реестре. Все эти разделы находятся в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControleSet\Control\Class. Клавиатуре соответствует раздел {4D36E96B-E325-11CE-BFC1-08002BE10318}. У каждого устройства в его разделе есть ключи UpperFilters и LowerFilters. Это ключи типа MultiString. Они содержат имена верхних и нижних драйверов-фильтров данного устройства. Драйверы-фильтры загружаются в систему в том порядке, в каком они записаны в этих ключах.

Для регистрации разрабатывавемого драйвера как фильтра необходимо поместить его имя в последним в ключе UpperFilters.

Для регистрации нового драйвера необходимо создать раздел с именем этого драйвера в системном реестре по адресу HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services. Этот раздел должен содержать следующие ключи:

Type типа двойное слово

Определяет тип подключаемого модуля.

Интересует только значение SERVICE_KERNEL_DRIVER (1).

Start типа двойное слово

Определяет метод загрузки драйвера. Может принимать одно из следующих значений:

SERVICE_BOOT_START (0) - во время начальной загрузки ОС. Данное значение применяется, когда драйвер используется загрузчиком системы;

SERVICE_SYSTEM_START (1) - после начальной загрузки ОС. Применяется для драйверов, которые самостоятельно осуществляют поиск оборудования, но не используются загрузчиком системы (нумераторы).

SERVICE_AUTO_START (2) - автоматическая загрузка с помощью диспетчера управления сервисами (Service Control Manager). Применяется для драйверов, не поддерживающих Plug and Play.

SERVICE_DEMAND_START (3) - загрузка «по требованию» либо диспетчера Plug and Play при обнаружении устройства, либо диспетчера управления сервисами при поступлении от пользователя команды на загрузку.

SERVICE_DISABLED (4) - драйвер не загружается.

ErrorControl типа двойное слово

Определяет уровень контроля ошибок. Может принимать значения:

SERVICE_ERROR_IGNORE (0). В случае сбоя при загрузке драйвера игнорировать его и продолжить работу.

SERVICE_ERROR_NORMAL (1). В случае сбоя при загрузке драйвера продолжить работу, но выдать при этом соответствующее предупреждение.

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

SERVICE_ERROR_CRITICAL (3). Аналогично (2), но в случае повторного сбоя выдать «синий экран».

DisplayName типа строка ASCII

Экранное имя, отображаемое служебными приложениями на экране. Этот параметр не обязателен. При его отсутствии экранным именем считается имя подраздела.

ImagePath типа строка Unicode

Полный путь к файлу с драйвером на диске. Обычно это поле устанавливается в значение %windir%\system32\Drivers\DriverName.sys, где %windir% -- папка, в которую установлена Windows, а DriverName -- имя файла.

Для разрабатываемого драйвера создаётся раздел с именем kbd_filter с переменными ErrorControl (равна 1), Start (равна 3), Type (равна 1). Т.к. не указывается, где расположен исполняемый файл драйвера, этот файл должен быть скопирован в директорию \%SystemRoot%\System32\Drivers.

В разделе фильтров клавиатуры необходимо внести в переменную UpperFilters имя драйвера-фильтра.

После перезагрузки изменения вступят в силу и драйвер-фильтр начнет работу.

Функции установки и удаления драйвера реализованы в модуле installer, который входит в состав управляющего приложения.

3.3 Сборка программного обеспечения

Для сборки разработанного программного обеспечения необходима ОС Windows NT 5, установленная на компьютере звуковая карта Sound Blaster. Все разработанные компоненты разработанного программного обеспечения находятся в папке DriverControl.

Компиляция

Для того, чтобы скомпилировать драйвер, необходим установленный DDK для Windows NT 5. С помощью консольной утилиты build, входящей в состав DDK, необходимо войти в папку DriverControl\driver и ввести команду build. Произойдёт компиляция драйвера. Драйвер kbd_filter.sys окажется в папке DriverControl\driver\objchk_wnet_x86\i386.

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



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