Организация ввода-вывода. Драйверы WDM. Рощин А.В. - 49 стр.

UptoLike

Составители: 

49
PIO_STACK_LOCATION stack =
IoGetCurrentIrpStackLocation(Irp); //1
PDEVICE_EXTENSION pdx =
(PDEVICE_EXTENSION)Device-> DeviceExtension; //2
return STATUS_Xxx; //3
}
Комментарии:
//1 Для определения параметров и дополнительного кода функции обычно
приходится обращаться к текущему элементу стека.
//2 Обычно необходим также доступ к расширению устройства, созданного
функцией AddDevice.
//3 Диспетчерская функция возвращает некоторый код NTSTATUS функции
IoCallDriver, которая передает его далее.
На месте многоточия в диспетчерской функции должен выполняться один
из вариантов действий:
a. немедленно завершить запрос,
b. передать его драйверу, расположенному ниже в том же стеке,
c. поставить запрос в очередь для последующей обработки другими
функциями драйвера.
a. Завершение IRP
Любой IRP рано или поздно должен быть завершен. В диспетчерской
функции IRP завершается в следующих случаях:
если очевидна ошибочность запроса (например, запрос
на перемотку
принтера или извлечение клавиатуры); в этом случае диспетчерская
функция должна отклонить запрос, выдав соответствующий код
состояния,
если запрос требует информацию, которую может предоставить сама
диспетчерская функция (например, получение версии драйвера); в этом
случае диспетчерская функция предоставляет запрошенную информацию
и завершает запрос с успешным кодом.
  PIO_STACK_LOCATION stack =
            IoGetCurrentIrpStackLocation(Irp);               //1
  PDEVICE_EXTENSION pdx =
            (PDEVICE_EXTENSION)Device-> DeviceExtension; //2
      …
  return STATUS_Xxx;                                         //3
  }
      Комментарии:
      //1 Для определения параметров и дополнительного кода функции обычно
приходится обращаться к текущему элементу стека.
      //2 Обычно необходим также доступ к расширению устройства, созданного
функцией AddDevice.
      //3 Диспетчерская функция возвращает некоторый код NTSTATUS функции
IoCallDriver, которая передает его далее.
      На месте многоточия в диспетчерской функции должен выполняться один
из вариантов действий:
      a. немедленно завершить запрос,
      b. передать его драйверу, расположенному ниже в том же стеке,
      c. поставить запрос в очередь для последующей обработки другими
          функциями драйвера.
      a. Завершение IRP
      Любой IRP рано или поздно должен быть завершен. В диспетчерской
функции IRP завершается в следующих случаях:
      − если очевидна ошибочность запроса (например, запрос на перемотку
          принтера или извлечение клавиатуры); в этом случае диспетчерская
          функция должна отклонить запрос, выдав соответствующий код
          состояния,
      − если запрос требует информацию, которую может предоставить сама
          диспетчерская функция (например, получение версии драйвера); в этом
          случае диспетчерская функция предоставляет запрошенную информацию
          и завершает запрос с успешным кодом.

                                        49