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


Новые рабочие процедуры в WDM драйверах - часть 2


таблицу 9.5), разумеется, является указатель на объект устройства, к которому было произведено подключение в процедуре AddDevice.

Вызов IoSkipCurrentIrpStackLocation (см. таблицу 9.6) сообщает Диспетчеру ввода/вывода, что драйвер отказывается от дальнейшего участия в судьбе данного IRP пакета. В том случае, если драйвер желает получить управление над IRP пакетом в момент, когда его обработка нижними слоями драйверов будет завершена, то он должен воспользоваться системным вызовом IoCopyCurrentIrpStackLocationToNext

(см. таблицу 9.7) и зарегистрировать процедуру CompletionRoutine. Она будет вызвана в соответствующий момент.

Таблица 9.5. Прототип функции IoCallDriver

NTSTATUS IoCallDriver IRQL &#60= DISPATCH_LEVEL
Параметры Обращается к другому драйверу с запросом, сформулированным в пакете IRP (запросы типа IRP_MJ_POWER следует выполнять при помощи вызова PoCallDriver)
IN PDEVICE_OBJECT pDevObj

Указатель на объект устройства, которому адресован IRP запрос

IN PIRP pIrp Указатель на отправляемый IRP пакет
Возвращаемое значение

• STATUS_SUCCESS

• STATUS_PENDING &#8212 в случае, если пакет требует дополнительной обработки

• STATUS_Xxx &#8212 в случае ошибки

Таблица 9.6. Прототип функции IoSkipCurrentIrpStackLocation

VOID IoSkipCurrentIrpStackLocation IRQL &#60= DISPATCH_LEVEL
Параметры Изменяет указатель стека IRP так, что нижестоящий драйвер будет считать текущую ячейку стека IRP своей
IN PIRP pIrp Указатель на модифицируемый IRP пакет
Возвращаемое значение void

Таблица 9.7. Прототип функции IoCopyCurrentIrpStackLocationToNext

VOID IoCopyCurrentIrpStackLocationToNext IRQL &#60= DISPATCH_LEVEL
Параметры Копирует содержимое ячейки стека IRP для текущего драйвера в ячейку стека для нижестоящего драйвера
IN PIRP pIrp Указатель на модифицируемый IRP пакет
Возвращаемое значение void

Процедура завершения ввода/вывода CompletionRoutine есть обратный вызов от Диспетчера ввода/вывода, который позволяет перехватить IRP пакет после того, как низкоуровневый драйвер завершит его обработку.


Начало  Назад  Вперед