Поделиться через


Единая процедура DispatchCreateClose

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

Например, драйвер порта для контроллера устройства, который тесно связан с одним или несколькими драйверами класса и вызывает IoGetDeviceObjectPointer, может иметь минимальную подпрограмму DispatchCreateClose. Подпрограмма может только завершить IRP следующим образом:

    :    : 
{ 
    Irp->IoStatus.Status = STATUS_SUCCESS; 
 Irp->IoStatus.Information = 0; 
    IoCompleteRequest(Irp, IO_NO_INCREMENT); 
 return STATUS_SUCCESS; 
}

Эта минимальная процедура DispatchCreateClose задает элемент Information блока статуса ввода-вывода равным нулю, указывая, что объект файла открыт для запроса создания; Сведения не имеют значения для запроса закрытия. Функция устанавливает элемент статуса в STATUS_SUCCESS и также возвращает это значение статуса, указывая, что драйвер готов принимать запросы ввода-вывода.

Эта минимальная подпрограмма DispatchCreateClose завершает создание IRP без повышения приоритета инициатора IRP (IO_NO_INCREMENT), так как предполагается, что источник ожидает неопределенного, но очень небольшого интервала для завершения запроса.

Сколько работает подпрограмма DispatchCreateClose , отчасти зависит от характера устройства драйвера или базового устройства, а также отчасти от проектирования драйвера. Если драйвер выполняет очень разные операции для создания и закрытия запросов, он должен обрабатывать эти запросы в отдельных подпрограммах DispatchCreate и DispatchClose.

Чтобы обработать запрос на создание для открытия объекта файла, представляющего логическое или физическое устройство, драйвер верхнего уровня должен выполнить следующие действия:

  1. Вызовите IoGetCurrentIrpStackLocation , чтобы получить указатель на расположение стека ввода-вывода в IRP.

  2. Проверьте FileObject.FileName в расположении стека ввода-вывода и завершите IRP с STATUS_SUCCESS, если строка Юникода в FileName имеет нулевую длину; в противном случае завершите IRP с STATUS_INVALID_PARAMETER.

Следуя приведенным выше шагам, вы гарантируете, что попытки открыть псевдофайл на устройстве в будущем не вызовут проблем. Например, это предотвращает попытку открыть несуществующий объект \\device\parallel0\temp.dat.