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

Случай 1: Ошибочная ситуация


В случае, если процедура диспетчеризации не может разрешить проблем, возникших при обработке запроса, ей необходимо отклонить запрос и сообщить об этом вызывающей стороне. Следующие шаги необходимо предпринять при отражении "запроса".

  • Соответствующий код ошибки сохраняется в поле Status в блоке IoStatus пакета IRP и производится обнуление поля Information.
  • Производится вызов IoCompleteRequest для того, чтобы завершить обработку пакета IRP (без повышения приоритета).
  • Рабочая процедура, возвращая управление, должна возвратить тот же код ошибки, что был помещен в поле IoStatus.Status пакета IRP.
  • NTSTATUS WriteRequestHandler ( IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp) { : // Запрос не поддерживается данным устройством (например): pIrp-&#62IoStatus.Status = STATUS_NOT_SUPPORTED; pIrp-&#62IoStatus.Information = 0; // Ни одного байта не передано IoCompleteRequest(pIrp, IO_NO_INCREMENT); // без изменения приоритета return STATUS_NOT_SUPPORTED; }

    Вызов IoCompleteRequest будет подробно рассмотрен в следующей главе, но сейчас следует отметить, что после него область памяти, занятая под собственно пакет IRP может оказаться свободной. Поэтому категорически нельзя экономить и писать операторы типа "return pIrp-&#62IoStatus.Status;", впрочем, как и обращаться по адресу pIrp в каких бы то ни было целях после вызова IoCompleteRequest.



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