- •Введение 5
- •1 Исследовательский раздел
- •1.1 Анализ существующих аналогичных систем
- •1.1.1 Обзор архитектуры устройств usb
- •1.2 Обоснование выбора программно-аппаратных средств
- •1.3 Постановка задачи
- •1.4 Развернутое техническое задание
- •1.4.1 Общие сведения
- •2.1.1 Основные дескрипторы usb драйвера
- •2.1.1.1 Дескриптор устройства
- •2.1.1.2 Дескриптор расширения устройства
- •2.1.1.3 Дескриптор конфигурации
- •2.1.1.4 Дескриптор интерфейса
- •2.1.1.5 Дескриптор конечной точки
- •2.2 Разработка функциональной схемы драйвера
- •2.2.1 Драйвер в иерархии wdm
- •2.2.2 Уровни обмена данными usb устройств
- •2.2.3 Архитектура системного драйвера usb
- •2.2.4 Основные рабочие процедуры драйвера
- •2.2.5 Управление перемещаемостью кода в драйвере
- •2.3 Разработка алгоритмического обеспечения
- •2.3.1 Инициализация драйвера
- •2.3.3 Обработка расширенных запросов ioctl
- •2.3.4 Поддержка запросов Plug and Play
- •2.3.5 Управление питанием
- •2.3.5.1 Обработка запросов irp_mj_power
- •2.3.6 Процедура деинициализации драйвера
- •2.4 Разработка программного обеспечения
- •2.4.1 Процедура DriverEntry
- •2.4.2 Процедура DriverUnload
- •2.4.3 Процедура AddDevice
- •2.4.4 Процедура передачи запроса usbd
- •2.4.5 Обработчики usbCreate и usbClose
- •2.4.6 Обработчик ConfigureDevice
- •2.4.7 Обработчики запросов на чтение и запись
- •3 Технологический раздел
- •3.1 Технология разработки драйверов для операционных систем семейства Windows
- •3.1.1 Архитектура Windows Driver Model
- •3.1.2 Выбор типа разрабатываемого драйвера
- •3.1.3 Разработка usb драйвера
- •3.2 Технология отладки драйверов в операционных системах семейства Windows
- •3.2.1 Основные отладочные тесты
- •3.2.2 Основные «проблемы», возникающие при отладке драйвера
- •3.2.2.1 Аппаратные проблемы
- •3.2.2.2 Программные проблемы
- •3.2.3 Основные отладчики и утилиты для проверки драйвера
- •3.2.3.1 Отладчик WinDbg
- •3.2.3.2 Driver Verifier
- •3.2.4 Общие приемы отладки драйвера
- •3.2.4.1 Установка фиксированных точек прерывания
- •3.2.4.2 Промежуточный вывод на экран
- •3.2.4.3 Сохранение отладочного кода в исходном тексте драйвера
- •3.2.4.4 Перехват некорректных условий
- •3.2.4.5 Обнаружение утечек памяти
- •3.2.5 Замечания по отладке драйверов
- •4 Безопасность жизнедеятельности
- •4.1 Анализ эргономических параметров рабочего места пользователя пэвм
- •4.1.1 Общие эргономические аспекты рабочего места
- •4.2 Организация рабочего места пользователя с учётом эргономических требований
- •4.2.1 Организация рабочего стола
- •4.2.2 Рабочее кресло
- •4.2.3 Работа с клавиатурой и мышью
- •4.2.4 Расположение и эргономические характеристики монитора
- •4.2.5 Внутренний объем
- •4.2.6 Рабочая поза пользователя пэвм
- •4.3 Экологическая оценка и переработка узлов компьютерной техники содержащих платину
- •4.3.1 Извлечение платины из отработанных катализаторов
- •4.3.2 Извлечение платины из радиооборудования и сплавов для электрических контактов
- •5 Экономический раздел
- •5.1 Планирование разработки драйвера с построением графика выполнения работ
- •5.1.1 Определение этапов и работ по созданию программного продукта
- •5.1.2 Расчет трудоемкости и продолжительности работ
- •5.1.3 Построение графика выполнения работ
- •5.2 Расчет затрат на разработку
- •5.3 Оценка экономической эффективности проекта
- •1 К исследовательскому разделу
- •2 К специальному разделу
- •3 К технологическому разделу
- •4 К разделу «Безопасность Жизнедеятельности»
- •5 К экономическому разделу
- •Приложение а Установка драйвера с помощью inf-файла
- •Приложение б Графические материалы
2.1.1.2 Дескриптор расширения устройства
Параметры устройства хранятся в расширении устройства — структуре DEVICE_EXTENSION. Она всегда доступная через объект устройства (PDO) (DEVICE_OBJECT, поле DeviceExtension) [2.2]. Она реализует наиболее удобный и рекомендованный Microsoft способ хранения специализированных для нашего устройства данных. Структуру расширения определяет разработчик драйвера. Мы ее определим так:
typedef struct _DEVICE_EXTENSION {
PDEVICE_OBJECT TopOfStackDeviceObject;
PDEVICE_OBJECT PhysicalDeviceObject;
DEVICE_POWER_STATE CurrentDevicePowerState;
USBD_CONFIGURATION_HANDLE UsbConfigurationHandle;
PUSB_CONFIGURATION_DESCRIPTOR UsbConfigurationDescriptor;
PUSB_DEVICE_DESCRIPTOR UsbDeviceDescriptor;
PUSBD_INTERFACE_INFORMATION UsbInterface;
DEVICE_CAPABILITIES DeviceCapabilities;
PIRP PowerIrp;
KEVENT RemoveEvent;
KEVENT NoPendingIoEvent;
KEVENT SelfRequestedPowerIrpEvent;
ULONG PendingIoCount;
ULONG OpenPipeCount;
PIPEINFO PipeInfo;
WCHAR DeviceLinkNameBuffer[ MAXIMUM_FILENAME_LENGTH ];
BOOLEAN DeviceRemoved;
BOOLEAN RemoveDeviceRequested;
BOOLEAN StopDeviceRequested;
BOOLEAN DeviceStarted;
BOOLEAN EnabledForWakeup;
BOOLEAN SelfPowerIrp;
ULONG PowerDownLevel;
ULONG MaximumTransferSize;
UCHAR OpenHandles;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
Таблица 2.3 – Описание полей дескриптора устройства
Наименование поля |
Описание |
TopOfStackDeviceObject |
Указатель на объект устройства, которому принадлежит данная структура |
PhysicalDeviceObject |
Указатель на нижний драйвер в данном стеке (в нашем случае – драйвер шины) |
CurrentDevicePowerState |
Содержит текущее состояние энергопотребления устройства. Обычно оно инициализируется значением PowerDeviceDO во время выполнения AddDevice |
UsbConfigurationHandle |
Конфигурационный манипулятор (Handle) USB |
UsbConfigurationDescriptor |
Указатель на дескриптор конфигурации USB устройства |
UsbDeviceDescriptor |
Дескриптор USB устройства |
UsbInterface |
Наше устройство поддерживает один интерфейс |
DeviceCapabilities |
Драйвер шины устанавливает соответствующие значения в этой структуре в ответ на запрос IRP IRP_MN_QUERY_CAPABILITIES. |
PowerIrp |
Используется для сохранения «установившегося» системного IRP управления питанием |
RemoveEvent |
Устанавливается, когда PendingIoCount устанавливается в ноль; флаги устойства могут быть удалены |
Продолжение
таблицы
2.3
|
|
NoPendingIoEvent |
Устанавливается, когда PendingIoCount устанавливается в 1. Это свидетельствует об отсутствии запросов ввода/выводы |
SelfRequestedPowerIrpEvent |
Устанавливается для оповещения о том, что запросы управления питания, инициируемые драйвером, выполнены |
PendingIoCount |
Увеличивается, когда устройство добавлено или получены запросы ввода/вывода. Уменьшается, когда запрос выполнен, а также когда устройство удалено |
OpenPipeCount |
Количество используемых точек USB устройства |
PipeInfo |
Структура, используемая для отслеживания состояния конечных точек (открыты или закрыты) |
DeviceLinkNameBuffer |
Строка (буфер) для имени нашего функционального объекта устройства. Имя генерируется на основании GUID нашего драйвера |
DeviceRemoved |
Устанавливается в момент обработки запроса IRP_MN_REMOVE_DEVICE |
RemoveDeviceRequested |
Флаг устанавливается, когда драйвер успешно обрабатывает запрос IRP_MN_QUERY_REMOVE_DEVICE |
StopDeviceRequested |
Флаг устанавливается, когда драйвер успешно обрабатывает запрос IRP_MN_QUERY_STOP_DEVICE |
DeviceStarted |
Флаг устанавливается, когда наше устройство успешно установлено и правильно функционирует |
EnabledForWakeup |
Флаг устанавливается, когда запрос IRP_MN_WAIT_WAKE получен |
SelfPowerIrp |
Флаг для оповещения о том, что мы получили собственный пакет IRP управления питанием |
PowerDownLevel |
Состояние пониженного энергопотребления |
MaximumTransferSize |
Максимальная скорость передачи по умолчанию |
OpenHandles |
Счетчик копий драйвера (кол-ва открытых манипуляторов) |
Ниже приводится вспомогательная структура, используемая для отслеживания состояния конечных точек:
typedef struct tag_PIPEINFO
{
BOOLEAN fPipeOpened;
} PIPEINFO, *P_PIPEINFO;