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