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


Одна подпрограмма 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.

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

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

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

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