Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ДП.docx
Скачиваний:
11
Добавлен:
23.09.2019
Размер:
4.64 Mб
Скачать

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;