Информационный сайт

 

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

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

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

. -.. обработка запроса ...
Il запрос успешно обработан ntStatus = STATUS_SUCCESS; 11 ни одного байта не передано pIrp->IoStatus.Information = 0; Il статус обработки pIrp->IoStatus. Status = ntStatus; Il завершение обработки
IoCompleteRequest(plrp, I0_N0_INCREMENT); II код завершения return ntStatus;
)
Листинг 9.13. Постановка запроса в очередь для обработки
NTSTATUS DispatchProcedurePrototype( IN PDEVICEJOBJECT DeviceObject, IN PIRP plrp
)
{
... предварительная обработка запроса ...
202
Часть III. Практика программирования
Il поставнока запроса в очередь на обработку IoMarklrpPending(pIrp);
IoStartPacket(pDeviceObject, plrp, О, NULL); Il код завершения return STATUS_PENDING;
}
Следует отметить два важных обстоятельства:
? вызов ioCompieteRequest(pirp,...) может освободить память, занимаемую собственно пакетом, поэтому оператор return (pirp-> IoStatus.status); может привести к непредсказуемым результатам;
? после возврата из рабочей процедуры диспетчер в/в завершает все запросы, не помеченные статусом status_pending, однако не уведомляет об этом вышестоящие в очереди драйверы. Для корректного уведомления драйвер должен вызывать ioCompieteRequest в конце обработки запроса.
Набор кодов запросов irp_mo_xxx и соответствующие им функции Windows API пользовательского режима приведен в табл. 9.1. Единственным обязательным для обработки кодом является код irp_mj_create, генерируемый при вызове createFile. При необходимости освобождения ресурсов при вызове cioseHandle драйвер должен обрабатывать код irp_mj_close. Необходимость обработки остальных кодов зависит от функциональности драйвера.
Таблица 9.1. Коды запросов IRP и соответствующие функции пользовательского режима
IRP код
Вызов Windows API или действия
IRP_MJ_ IRP_MJ_
IRP_MJ_ IRP-MJ IRP_MJ_ IRP_MJ_ IRP MJ
CREATE CLEANUP
CLOSE
READ
WRITE
DEVICE CONTROL
CreateFile
Очистка ожидающих обработки пакетов IRP при закрытии дескриптора драйвера при обработке вызова CioseHandle
CioseHandle
ReadFile
WriteFile
DeviceloControl
internal_devіce-control Действия по управлению устройством, доступные только для клиентов, работающих в режиме ядра (недоступно для вызовов пользовательского режима)
Гпава 9. Введение в WDM 203
Таблица 9.1 (окончание)
IRP код Вызов Windows API* или действия
IR.P_MJ_QUER.Y_ IN FORMAT ION Передача длины файла в ответ на вызов 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. Обслуживание запросов I0CTL
Как показано в табл. 9.1, набор функций, соответствующих запросам irp_mj_xxx, ограничивается набором самих констант. Дополнительные запросы к драйверу формируются с помощью рабочей процедуры драйвера для кода IRP_mj_DEVICE_CONTROL и, соответственно, функции DeviceloControl.
Заголовок функции DeviceloControl показан в листинге 9.14, а более подробное описание дано в справочной части книги, в главе 16.
і Листинг 9.14. Заголовок функции DeviceloControl
BOOL DeviceloControl(
HANDLE hDevice, Il дескриптор драйвера
DWORD dwIoControlCode, Il код операции
LPVOID lpInBuffer, // входной буфер
204
Часть III. Практика программирования
DWORD nlnBufferSize, LPVOID IpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped
);
// размер входного буфера Il выходной буфер Il размер выходного буфера // число переданных байт // асинхронная информация
Дескриптор драйвера получается при вызове функции CreateFile или, другими словами, при открытии драйвера. Входной и выходной буферы позволяют обмениваться данными с драйвером.
Наибольший интерес представляет параметр dwioControicode, передающий в драйвер код выполняемой операции, называемый IOCTL (Input/Output ConTroL code, код операции в/в). Коды IOCTL, передаваемые в драйвер, могут быть определены разработчиком драйвера и имеют строго определенный формат (рис. 9.6).
Тип устройства Способ доступа Управляющий код Тип передачи DeviceType RequiredAccess ControlCode TransferType
[31:16]
T
[15:14]
[13:2]
T
[1:0]
[31]
Тип
[30:16]
[13]
Код
И2:2]
Рис. 9.6. Формат кода IOCTL
Для формирования кода IOCTL в Window DDK существует специальное, макроопределение ctlcode, параметры и пример использования которого показаны в листингах 9.15 и 9.16. Описание параметров этого макроса дано в табл. 9.2. Для пользовательских программ на языке Delphi можно использовать функцию, код которой показан в листинге 9.17.
Листинг 9.15. Макроопределение CTL_CODE
#define CTL-CODE( DeviceType, Function, Method, Access ) (\ ((DeviceType) « 16) I ((Access) « 14) | ((Function) « 2) I (Method)\
Предыдущая << 1 .. 64 65 66 67 68 69 < 70 > 71 72 73 74 75 76 .. 166 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100