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

       

Рабочая процедура обработки запросов read/write


Процедура ReadWrite_IRPhandler предназначена для обработки запросов Диспетчера ввода/вывода, которые он формирует в виде IRP пакетов с кодами IRP_MJ_READ/IRP_MJ_WRITE по результатам обращения к драйверу из пользовательских приложений с вызовами read/write или из кода режима ядра с вызовами ZwReadFile или ZwWriteFile. В данном примере наша функция обработки запросов чтения/записи ничего полезного не делает, и ее регистрация выполнена только для демонстрации, как это могло бы быть в более "развитом" драйвере.

Описание прототипов рабочих процедура драйвера (параметров их вызова) можно найти в документации DDK (2000, ХР, 2003), если в режиме указателя задать ключевые слова Dispatch..., например, DispatchRead. Если ваша программа просмотра файлов справки не поддерживает переходов между разными .chm файлами (представляющими полную документацию по DDK), то можно сразу обратиться к файлу kmarch.chm (который, собственно, и содержит информацию по рабочим процедурам). Там же можно узнать, на каком уровне IRQL происходит вызов конкретной функции.

// // (Файл init.cpp) // ReadWrite_IRPhandler: Берет на себя обработку запросов // чтения/записи и завершает обработку IRP вызовом CompleteIrp // с числом переданных/полученных байт (BytesTxd) равным нулю. // Аргументы: // Указатель на объект нашего FDO // Указатель на структуру IRP, поступившего от Диспетчера ввода/вывода NTSTATUS ReadWrite_IRPhandler( IN PDEVICE_OBJECT fdo, IN PIRP Irp ) { ULONG BytesTxd = 0; NTSTATUS status = STATUS_SUCCESS; //Завершение с кодом status // Задаем печать отладочных сообщений v если сборка отладочная #if DBG DbgPrint("-Example- in ReadWrite_IRPhandler."); #endif return CompleteIrp(Irp,status,BytesTxd); }



Содержание раздела