Одна подпрограмма DispatchCreateClose
Многие водители, особенно водители более низкого уровня в цепочке многоуровневых водителей, просто должны установить свое существование при получении запроса на создание и просто должны подтвердить получение близкого запроса.
Например, драйвер порта для контроллера устройства с одним или несколькими драйверами класса, которые вызывают IoGetDeviceObjectPointer , может иметь минимальную подпрограмму DispatchCreateClose . Подпрограмма может только завершить IRP, как показано ниже.
: :
{
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
Эта минимальная подпрограмма DispatchCreateClose задает для элемента Information блока состояния ввода-вывода значение 0, указывая, что объект файла открыт для запроса на создание; Информация не имеет значения для запроса закрытия. Подпрограмма задает элементу Status значение STATUS_SUCCESS, а также возвращает это значение состояния, указывающее, что драйвер готов принимать запросы ввода-вывода.
Эта минимальная подпрограмма DispatchCreateClose завершает создание IRP без повышения приоритета инициатора IRP (IO_NO_INCREMENT), так как предполагается, что инициатор ожидает неопределенного, но очень небольшого интервала для завершения запроса.
Объем работы, которую выполняет подпрограмма DispatchCreateClose , частично зависит от характера устройства драйвера или базового устройства, а также от структуры драйвера. Если драйвер выполняет совершенно разные операции для запросов на создание и закрытие, он должен обрабатывать эти запросы в отдельных подпрограммах DispatchCreate и DispatchClose.
Чтобы обработать запрос на создание для открытия объекта файла, представляющего логическое или физическое устройство, драйвер самого высокого уровня должен выполнить следующие действия.
Вызовите IoGetCurrentIrpStackLocation , чтобы получить указатель на расположение стека ввода-вывода в IRP.
Установите флажок FileObject. FileName в расположении стека ввода-вывода и заполнение IRP с помощью STATUS_SUCCESS, если строка Юникода в FileName имеет нулевую длину; в противном случае заполните IRP с помощью STATUS_INVALID_PARAMETER.
Выполнение описанных выше действий гарантирует, что никакие попытки открыть псевдофайл на устройстве не могут вызвать проблемы в дальнейшем. Например, это предотвращает попытки открыть несуществующий объект \\device\parallel0\temp.dat.