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

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

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

• PVOID Type3InputBuffer
198
Часть III. Практика программирования
? для типов Irр_мj_read и irp_mj_write в поле Parameters доступны
следующие поля:
• ULONG Length
• ULONG Key
• LARGE_INTEGER ByteOffset.
Рабочие процедуры драйвера
Тема книги не позволяет вдаваться в подробности рабочих процедур драйвера
(Dispatch Routines). С практической точки зрения достаточно следующей
информации:
? список поддерживаемых драйвером рабочих процедур (т. е. набор
обрабатываемых кодов irp_mj_xxx) формируется драйвером в процессе
выполнения процедуры DriverEntry;
? перед вызовом DriverEntry диспетчер в/в заполняет весь массив адресом
процедуры _iopinvalidDeviceRequest, обеспечивая таким образом корректную
обработку неподдерживаемых рабочих процедур;
? все процедуры драйвера используют один формат параметров и тип вызова,
используя прототип, показанный в листинге 9.10.
Листинг 9.10. Прототип процедуры драйвера |
NTSTATUS DispatchProcedurePrototype(
// указатель на объект устройства, для которого // предназначен IPR-пакет
'IN PDEVICE_OBJECT DeviceObject,
// указатель на IRP-пакет IN PIRP plrp
)
{
// Возращаемое значение
NTSTATUS ntStatus = STATUS_SUCCESS;
// Указатель на текущую ячейку стека РI0_STACK_LOCATION irpSp;
// Длина входного буфера ULONG inBufLength;
// Длина выходного буфера ULONG outBufLength;
Гпава 9. Введение s WDM
199
// Указатель на входной буфер PULONG LongBuffer;
// Получить указатель на ячейку стека
irpSp = IoGetCurrentlrpStackLocation( plrp );
// Длина входного буфера
inBufLength = irpSp->Parameters.DeviceloControl.InputBufferLength; //
Указатель на входной буфер для метода доступа METHOD_BUFFERED LongBuffer
= (PULONG) pIrp->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 корректное значение (зависит от
запроса);
wo
Часть III. Практика программирования
• выполнить вызов ioCompieteRequest для завершения обработки запроса;
• возвратить код успешного завершения status success.
передача запроса на обработку. В простейшем случае драйвер может сразу
завершить обработку запроса, например, в ответ на запрос чтения данных
сразу же считать данные с последовательного порта. Однако асинхронный
механизм в/в Windows предусматривает и другой метод работы. Рабочая
процедура может поместить пакет IRP в очередь для последующей обработки и
сразу же вернуть сообщение о том, что обработка пакета не была завершена.
Для этого следует выполнить следующие шаги (листинг 9.11):
• выполнить вызов ioMarkirpRending, информируя диспетчер в/в о том, что
пакет поставлен в очередь на обработку;
• выполнить вызов iostartPacket, чтобы поместить пакет в системную
очередь для последующей обработки процедурой start то.
• возвратить код незавершенной обработки пакета status_pending.
Листинг 9.11. Отклонение запроса рабочей процедурой
ТSTATUS
DispatchProcedurePrototype(
IN PDEVICE_OBJECT DeviceObject, IN PIRP plrp
// Возращаемое значение
NTSTATUS ntStatus = STATUS SUCCESS;
... попытка обработки запроса ...
11 Обнаружили ошибку - отклоняем запрос // код ошибки - буфер слишком мал
ntStatus = STATUS_BUFFER_TOO_SMALL;
// ни одного байта не передано pIrp->IoStatus.Information = 0;
// статус обработки pIrp->IoStatus.Status = ntStatus;
// завершение обработки
IoCompieteRequest(plrp, IO_NO_INCREMENT);
Гпава 9. Введение в WDM
201
// код завершения return ntstatus;
}
Листинг 9.12. Завершение обработки запроса рабочей процедурой
NTSTATUS DispatchProcedurePrototype(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP plrp
)
{
П Вовращаемое значение
NTSTATUS ntstatus = STATUSJSUCCESS;-
. . обработка запроса ...
II запрос успешно обработан ntstatus = STATU S_SUCCES S;
//ни одного байта не передано pIrp->IoStatus.Information = 0;
// статус обработки pIrp->IoStatus.Status = ntstatus;
// завершение обработки IoCampleteRequest(plrp, IO_NO_INCREMENT);
Предыдущая << 1 .. 63 64 65 66 67 68 < 69 > 70 71 72 73 74 75 .. 168 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

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

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

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

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