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

 

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

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

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

В зависимости ОТ значения MajorFunction ПОЛЄ Parameters представляется по-разному (т. е. оно описано как объединение (union)), например:
? для типа irp_mj_control в поле parameters доступны следующие поля:
• ULONG OutputBufferLength
• ULONG InputBufferLength
• ULONG IoControlCode
• PVOID Type3InputBuffer
198
Часть III. Практика программирования
? ДЛЯ ТИПОВ iRР_МJ_READ И IRP_mj_WRITE B ПОЛЄ Parameters ДОСТУПНЫ следующие поля:
• ULONG Length
• ULONG Key
• LARGE_INTEGER ByteOffset.
Рабочие процедуры драйвера
Тема книги не позволяет вдаваться в подробности рабочих процедур драйвера (Dispatch Routines). С практической точки зрения достаточно следующей информации:
O список поддерживаемых драйвером рабочих процедур (т. е. набор обрабатываемых кодов irp_mj_xxx) формируется драйвером в процессе выполнения процедуры DriverEntry;
O перед вызовом DriverEntry диспетчер в/в заполняет весь массив адресом процедуры _iopinvalidDeviceRequest, обеспечивая таким образом корректную обработку неподдерживаемых рабочих процедур;
П все процедуры драйвера используют один формат параметров и тип вызова, используя прототип, показанный в листинге 9.10.
Листинг 9.10. Прототип процедуры драйвера
NTSTATUS DispatchProcedurePrototype( // указатель на объект устройства, для которого // предназначен IPR-пакет 'IN PDEVICE_OBJECT DeviceObject, // указатель на IRP-пакет IN PIRP plrp
)
{
// Возращаемое значение
NTSTATUS ntStatus = STATUS_SUCCESS;
// Указатель на текущую ячейку стека
PIO_STACK_LOCATION irpSp;
// Длина входного буфера
ULONG inBufLength;
// Длина выходного буфера
ULONG OUtBufLength;
гпава 9. Введение в WDM
199
Il Указатель на входной буфер PULONG LongBuffer;
// Получить указатель на ячейку стека
irpSp = IoGetCurrentlrpStackLocation( plrp );
// Длина входного буфера
inBufLength = irpSp->Parameters.DeviceloControl.InputBufferLength; Il Указатель на входной буфер для метода доступа METHOD_BUFFERED LongBuffer = (PULONG) p!rp->AssociatedIrp.SystemBuffer;
return ntStatus;
}
Рабочая процедура драйвера возвращает результат типа ntstatus:
П status_success — запрос обработан;
П status_pending — ожидается обработка запроса;
П status_xxx — код ошибки.
Существуют три варианта завершения рабочей процедуры:
П отклонение запроса — производится в случае, когда рабочая процедура не может обработать запрос, например, вследствие неустранимой ошибки. В этом случае следует выполнить следующие действия (листинг 8.10):
• в поле iostatus.status записывается код ошибки;
• ПОЛЄ IoStatus . Information обнуляется;
• производится вызов ioCompleteRequest для завершения обработки запроса;
• рабочая процедура возвращает тот же код ошибки, который был записан В ПОЛЄ IoStatus. Status.
П завершение работы с запросом. Многие запросы могут быть полностью обработаны без обращения к физическому устройству, за которое отвечает драйвер, например, получение дескриптора устройства или конфигурирование самого драйвера. В случае необходимости завершить обработку запроса следует выполнить следующие шаги (листинг 8.11):
• записать в поле iostatus. status код успешного завершения
status_success;
• записать в поле iostatus.information корректное значение (зависит от запроса);
юо
Часть III. Практика программирования
• выполнить вызов ioCompieteRequest для завершения обработки запроса;
• возвратить код успешного завершения status success.
3 передача запроса на обработку. В простейшем случае драйвер может сразу завершить обработку запроса, например, в ответ на запрос чтения данных сразу же считать данные с последовательного порта. Однако асинхронный механизм в/в Windows предусматривает и другой метод работы. Рабочая процедура может поместить пакет IRP в очередь для последующей обработки и сразу же вернуть сообщение о том, что обработка пакета не была завершена. Для этого следует выполнить следующие шаги (листинг 9.11):
• выполнить вызов ioMarkirpRending, информируя диспетчер в/в о том, что пакет поставлен в очередь на обработку;
• выполнить вызов iostartPacket, чтобы поместить пакет в системную очередь для последующей обработки процедурой s tart то.
• возвратить код незавершенной обработки пакета status_pending.
Листинг 9.11. Отклонение запроса рабочей процедурой
TSTATUS
DispatchProcedurePrototype( IN PDEVIСЕ_ОВJECT DeviceObject, IN PIRP plrp
)
// Возращаемое значение
NTSTATUS ntStatus = STATUS_SUCCESS;
... попытка обработки запроса ...
Il Обнаружили ошибку - отклоняем запрос // код ошибки — буфер слишком мал ntStatus = STATUS_BUFFER_T00_SMALL; // ни одного байта не передано pIrp->IoStatus. Information = 0; // статус обработки pIrp->IoStatus. Status = ntStatus; // завершение обработки
IoCompieteRequest(plrp, I0_N0_INCREMENT);
Гпава 9. Введение в WDM
201
Il код завершения return ntStatus;
}
Листинг 9.12. Завершение обработки запроса рабочей процедурой
NTSTATUS DispatchProcedurePrototype( IN PDEVICE_OBJECT DeviceObject, IN PIRP plrp
)
{
// Возращаемое значение
NTSTATUS ntStatus = STATUS_SUCCESS;-
Предыдущая << 1 .. 63 64 65 66 67 68 < 69 > 70 71 72 73 74 75 .. 166 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100