ВУЗ:
Составители:
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
Страницы
- « первая
- ‹ предыдущая
- …
- 47
- 48
- 49
- 50
- 51
- …
- следующая ›
- последняя »
