Компьютерные книги
Главное меню
Главная Поиск по сайту Добавить материал О нас Карта книг Карта сайта
Реклама
computersbooks.net -> Добавить материал -> Аппаратное обеспечение -> Агуров П.В. -> "Интерфейсы USB. Практика использования и программирования" -> 70

Интерфейсы USB. Практика использования и программирования - Агуров П.В.

Агуров П.В. Интерфейсы USB. Практика использования и программирования — БВХ-Петербург, 2004. — 576 c.
ISBN 5-94157-202-6
Скачать (прямая ссылка): interfeysusbpraktikaispolzovaniya2004.djvu
Предыдущая << 1 .. 64 65 66 67 68 69 < 70 > 71 72 73 74 75 76 .. 168 >> Следующая

// код завершения return ntstatus;
)
: Листинг 9.13. Постановка запроса в очередь для обработки
NTSTATUS DispatchProcedurePrototype(
IN PDEVlCE_OBJECT DeviceObject,
IN PIRP plrp
)
{
... предварительная обработка запроса ...
202
Часть III. Практика программирования
// поставнока запроса в очередь на обработку IoMarklrpPending(pIrp);
IoStartPacket(pDeviceObject, plrp, 0, NULL); II код завершения return
STATUS_PENDING;
}
Следует отметить два важных обстоятельства:
? вызов ioCompieteRequest (pirp,...) может освободить память, занимаемую
собственно пакетом, поэтому оператор return (pirp-> iostatus.status);
может привести к непредсказуемым результатам;
? после возврата из рабочей процедуры диспетчер в/в завершает все
запросы, не помеченные статусом status_pending, однако не уведомляет об
этом вышестоящие в очереди драйверы. Для корректного уведомления драйвер
должен вызывать ioCompieteRequest в конце обработки запроса.
Набор кодов запросов irp_mj_xxx и соответствующие им функции Windows API
пользовательского режима приведен в табл. 9.1. Единственным обязательным
для обработки кодом является код irp_mj_create, генерируемый при вызове
CreateFiie. При необходимости освобождения ресурсов при вызове
cioseHandle драйвер должен обрабатывать код irp_mj_ close. Необходимость
обработки остальных кодов зависит от функциональности драйвера.
Таблица 9.1. Коды запросов IRP и соответствующие функции
пользовательского режима
IRP код Вызов Windows API или действия
CreateFiie
IRP_MJ_CREATE
IRP_MJ_CLEANUP
IRP_MJ_CLOSE
IRP_MJ_READ
IRP_MJ_WRITE
IRP_MJ_DEVICE_CONTROL
IRP MJ INTERNAL DEVICE CONTROL
Очистка ожидающих обработки пакетов IRP при закрытии дескриптора драйвера
при обработке вызова CioseHandle
CioseHandle
ReadFile
WriteFile
DeviceloControl
Действия по управлению устройством, доступные только для клиентов,
работающих в режиме ядра (недоступно для вызовов пользовательского
режима)
Гпава 9. Введение в WDM
203
Таблица 9.1 (окончание)
IRP код Вызов Windows API* или действия
1RP_MJ_QUERY_INFORMATION Передача длины файла в ответ на вызов
GetFileSize
IRP_MJ_SET_INFORMATION Установка длины файла по вызову SetFileSize
IRP_MJ_FLUSH_BUFFERS Запись или очистка служебных буферов при отработке
вызовов, например: • FlushFileBuffres • FlushConsolelnputBuffer •
PurgeComm
IRP_MJ_SHUTDOWN Действия, которые нужно выполнить драйверу в процессе
подготовки системы к завершению работы
IRP_MJ_PNP Посылается системой Plug and Play во время нумерации
устройств, распределения ресурсов и т. д.
IRP_MJ_DEVICE_CHANGE Посылается при изменении состава оборудования
* Описание и параметры функций Windows API можно найти в справочной части
книги в главе 16.
9.3.5. Обслуживание запросов IOCTL
Как показано в табл. 9.1, набор функций, соответствующих запросам
irp_mj_xxx, ограничивается набором самих констант. Дополнительные запросы
к драйверу формируются с помощью рабочей процедуры драйвера для кода
IRP_MJ_DEVlCE_CONTROL и, соответственно, функции DeviceloControl.
Заголовок функции DeviceloControl показан в листинге 9.14, а более
подробное описание дано в справочной части книги, в главе 16.
Листинг 9.14. Заголовок функции DeviceloControl
BOOL DeviceloControl(
HANDLE hDevice, // дескриптор драйвера
DWORD dwIoControlCode, ll код операции
LPVOID lpInBuffer, 11 входной буфер
204
Часть III. Практика программирования
DWORD nlnBufferSize, LPVOID IpOutBuffer,
DWORD nOutBufferSize, LPDWORD lpBytesRetumed, LPOVERLAPPED lpOverlapped
// размер входного буфера 11 выходной буфер 11 размер выходного буфера //
число переданных байт II асинхронная информация
);
Дескриптор драйвера получается при вызове функции CreateFiie или, другими
словами, при открытии драйвера. Входной и выходной буферы позволяют
обмениваться данными с драйвером.
Наибольший интерес представляет параметр dwioControicode, передающий в
драйвер код выполняемой операции, называемый IOCTL (Input/Output ConTroL
code, код операции в/в). Коды IOCTL, передаваемые в драйвер, могут быть
определены разработчиком драйвера и имеют строго определенный формат
(рис. 9.6).
Тип устройства Способ доступа Управляющий код Тип передачи DeviceType
RequiredAccess ControlCode TransferType
[31:16]
т
Тип
[15:14]
[13:2]
[1:0]
т
Код
[31]
[30:16]
[13]
[12:2]
Рис. 9.6. Формат кода IOCTL
Для формирования кода IOCTL в Window DDK существует специальное,
макроопределение ctl code, параметры и пример использования которого
показаны в листингах 9.15 и 9.16. Описание параметров этого макроса дано
в табл. 9.2. Для пользовательских программ на языке Delphi можно
использовать функцию, код которой показан в листинге 9.17.
Листинг 9.15. Макроопределение ctl_code
#define CTL_CODE( DeviceType, Function, Method, Access ) (\ ((DeviceType)
" 16) | ((Access) " 14) |
((Function) " 2) | (Method)\
)
Гпава 9. Введение в WDM
205
Листинг 9.16. Формирование кода IOCTL в драйвере
// Номера 32768-65535 зарезервированы для пользователя #define
Предыдущая << 1 .. 64 65 66 67 68 69 < 70 > 71 72 73 74 75 76 .. 168 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

Эком "Microsoft Excel 2000 шаг за шагом Русская версия самоучитель " (Самоучитель)

Поляков А.Ю. "Методы и алгоритмы компьютерной графики в примерах Vizual C++" (Графика)

Баяковский Ю.М. "Графическая библиотека Open GL " (Графика)

Валиков А. "Технология " (Языки программирования)
Авторские права © 2013 ComputersBooks. Все права защищены.