Для упрощения процесса взаимодействия с драйвером предоставляется приложение пользовательского режима, общий вид которого показан на рисунке (рис.3).
Рис. 3. Вид основного окна управляющего приложения
Приложение предоставляет минимально необходимый функционал:
· вывод информации о клавиатуре;
· управление состоянием драйвера (вкл. / выкл.);
· управление режимом отображения (перекрывать / не перекрывать другие окна);
· отображение выбранного символа.
Интерфейс клиентского приложения предельно просто и не требует дополнительных разъяснений.
Тестирование
Драйвер был протестирован с использованием тестирующей утилиты DriverVerifier пакета WDK. С его помощью были проведены стандартные тесты, такие как:
§ Корректность операций с пулами памяти
§ Корректность уровней IRQL, на которых выполняется код драйвера
Все тесты прошли успешно.
Для того чтобы скомпилировать и собрать окончательную версию драйвера, была использована среда x86 Free Build Environment из пакета WDK.
Драйвер был установлен на 4 физические машины, на которых использовался в течение пяти дней. За это время никаких нарушений в работе системы обнаружено не было.
Заключение
При выполнении курсового проекта была проделана следующая работа:
· Изучена структура драйверов модели WDM и WDF;
· Изучен стек устройства, путь запроса от приложения через стек устройства;
· Определено место разрабатываемого драйвера в стеке устройства и выбрана структура программного обеспечения;
· Изучен механизм встраивания драйвера-фильтра в стек драйверов;
· Разработан функциональный механизм сопоставления некоторой цифровой клавише на дополнительной клавиатуре набора букв заданного алфавита;
|
· Разработано программное обеспечение, удовлетворяющее требованиям технического задания;
· Проведено тестирование, подтвердившее работоспособность и надёжность разработанного программного обеспечения.
Приложения
Приложение A
Конфигурации физических тестовых машин:
1. Intel Atom N450 (1,66 ГГц), 1 Гб ОЗУ, ОС Windows 7 Профессиональная SP1
2. Intel Core 2 Duo (2.33 ГГц), 3 Гб ОЗУ, ОС Windows Vista Home Premium SP2
. Intel Pentium 3 (666 МГц), 512 Мб ОЗУ, ОС Windows XP Professional SP3
. Intel Core 2 Duo (1.8 ГГц), 3 Гб ОЗУ, ОС Windows XP Professional SP3
Приложение Б
Листинг исходного кода. Фрагмент драйвера._ServiceCallback
(PDEVICE_OBJECT DeviceObject,PKEYBOARD_INPUT_DATA InputDataStart,PKEYBOARD_INPUT_DATA InputDataEnd,OUT PULONG InputDataConsumed
)
{
BOOLEAN Setted = FALSE;_EXTENSION devExt;hDevice;_INPUT_DATA cur;_INPUT_DATA k;= WdfWdmDeviceGetWdfDeviceHandle(DeviceObject);= FilterGetData(hDevice);
// Анализ поля, отвечающего за статус драйвера: включён / выключен. Если // включён - п.2, иначе - п. 4;
if (devExt->Running)
{
// Цикл по всем IRP-пакетам, приходящим с клавиатуры
for (cur = InputDataStart, k = InputDataStart; cur < InputDataEnd; cur++)
{
// Для каждого IRP-пакета
DbgPrint("Scan code: %d", InputDataStart->MakeCode);
// Установить переменную, определяющую, является ли пакет // пакетом для вывода в TRUE;= TRUE;
// Определить скан-код нажатой клавиши
// Если нажата клавиша в нумпаде
if (IsNumPadKey(cur->MakeCode))
{("NumPad");
// Установить переменную, определяющую, является ли пакет // пакетом для вывода в FALSE;
Setted = FALSE;
// Далее если кнопка была отжата, то обновляем статус(TRUE)
{("Break!");
// Если скан код не изменился
if (devExt->Working && cur->MakeCode == devExt->CurMakeCode && cur->Flags & KEY_BREAK)
{("Inc!");
// Увеличиваем
|
// Если раскладка русская - везед делим по // модулю 4(!devExt->RusLat)>CurChar = (devExt->CurChar + 1) % 4;
// значит раскладка английскаяif (devExt->CurMakeCode == 71 || devExt->CurMakeCode == 73)>CurChar = (devExt->CurChar + 1) % 4;>CurChar = (devExt->CurChar + 1) % 3;
}
// Если кнопка не была отпущена setted установить в TRUE и преобразовать // выбранный код в букву
else if (devExt->Working && cur->MakeCode == 82 &&!(cur->Flags & KEY_BREAK))
{("Out1!");
// если ноль, то выводим
Setted = TRUE;(devExt->RusLat)>MakeCode = GetCharLat(devExt->CurMakeCode, devExt->CurChar);>MakeCode = GetCharRus(devExt->CurMakeCode, devExt->CurChar);
}
// Если кнопка была отпущена setted установить в TRUE, devExt->Working в // FALSE и преобразовать выбранный код в букву
else if (devExt->Working && cur->MakeCode == 82 && cur->Flags & KEY_BREAK)
{("Out2!");
// если ноль, то выводим
Setted = TRUE;>Working = FALSE;(devExt->RusLat)>MakeCode = GetCharLat(devExt->CurMakeCode, devExt->CurChar);>MakeCode = GetCharRus(devExt->CurMakeCode, devExt->CurChar);
}
// Если скан код нажатой клавиши равен 0x78, то изменить поле, отвечающее за // используемый язык
else if (cur->MakeCode == 78 && cur->Flags & KEY_BREAK)
{>RusLat =!devExt->RusLat;
}if (cur->Flags & KEY_BREAK)
{("Start!");
// Иначе переинициализируем>Working = TRUE;>CurChar = 0;>CurMakeCode = cur->MakeCode;
}
}
}
// Если этот пакет не для вывода, то удаляем его
if (!Setted)
{>MakeCode = 0;
}
}
// Обработка пакета закончена
}
(*(PSERVICE_CALLBACK_ROUTINE)(ULONG_PTR) devExt->UpperConnectData.ClassService)(>UpperConnectData.ClassDeviceObject,,,
InputDataConsumed);
}
Список литературы
1. Руссинович М., Соломон Д. Внутреннее устройство Microsoft Windows: Windows Server 2003, Windows XP и Windows 2000. Мастеркласс. / Пер. с англ. - 4-е изд. - М.: Издательство «Русская Редакция»; СПб.: Питер, 2008. - 992 стр.: ил.
2. Соломон Д., Руссинович М. Внутреннее устройство MS Windows 2000. Питер: 2001
3. Орвик П. Windows Driver Foundation: разработка драйверов. - М.: Издательство «Русская редакция»; СПб.: «БХВ-Петербург», 2008. - 880 с.
. Солдатов В. П. Программирование драйверов Windows. - М.: ООО «Бином-Пресс», 2011. - 576 с.
5. https://www.wasm.ru/series.php?sid=9 [Электронный ресурс]
6. MSDN [Электронный ресурс]
. Справочные материалы WDK Documentation