Программирование драйверов Windows



Рабочие процедуры обслуживания IOCTL запросов - часть 4


switch(controlCode) { // Вторичная диспетчеризация case IOCTL_CODE_1: { // Всегда следует проверять входные параметры if(inSize &#62 0 || outSize &#62 0) { Status = STATUS_INVALID_PARAMETER; break; } } default: // Драйвер получил непредусмотренные коды IOCTL status = STATUS_INVALID_DEVICE_REQUEST; break; } pIrp-&#62IoStatus.Status = status; pIrp-&#62IoStatus.Information = 0; // нет данных для передачи IoCompleteRequest( pIrp, IO__NO_INCREMENT ); return status; }

Доступ к буферным областям, содержащим данные или предназначенным для данных, описывается таблицей 8.9.

Таблица 8.9. Передача адресов буферов данных в IRP пакетах, описывающих IOCTL запросы

METHOD_BUFFERED METHOD_IN_DIRECT

или METHOD_OUT_DIRECT

METHOD_NEITHER
Input Буфер с данными Использует буферизацию (системный буфер)

Адрес буфера в системном адресном пространстве указан в pIrp-&#62AssociatedIrp.SystemBuffer

Клиентский виртуальный адрес в Parameters.DeviceIoControl. Type3InputBuffer
Длина указана в Parameters.DeviceIoControl.InputBufferLength
Output

Буфер для данных

Использует буферизацию (системный буфер)

Адрес буфера в системном адресном пространстве указан в pIrp-&#62 AssociatedIrp.SystemBuffer

Использует прямой доступ, клиентский буфер преобразован в MDL список, указатель на который размещен в

PIrp-&#62MdlAddress

Клиентский виртуальный адрес в pIrp-&#62UserBuffer
Длина указана в Parameters.DeviceloControl.OutputBufferLength

Названия Input

и Output здесь и в литературе трактуются с точки зрения драйвера. Буфер 'Input' содержит данные, поступающие от клиента, скорее всего, предназначенные для вывода в устройство. Буфер 'Output' указывает на то место, куда следует поместить данные, ожидаемые клиентом, скорее всего, прочитанные из устройства. Кстати сказать, в описании вызова DeviceIoControl в документации MSDN никакого разночтения с данной трактовкой названий не наблюдается: буфер с данными для выполнения операции (3-й параметр вызова) называется lplnputBuffer, а буфер для получаемых данных (5-й параметр вызова) называется lpOutputBuffer.

<


Содержание  Назад  Вперед