Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом разделе описывается, как драйвер User-Mode Driver Framework (UMDF) поддерживает клиентов в режиме ядра, начиная с версии 2 UMDF.
Клиент режима ядра — это драйвер режима ядра, который отправляет запросы ввода-вывода в драйвер UMDF. Драйвер в режиме ядра может быть выше драйвера UMDF в одном стеке устройств или может находиться в другом стеке устройств.
Драйвер режима ядра может пересылать запросы ввода-вывода, полученные из приложения пользовательского режима, или создавать новые запросы ввода-вывода и отправлять их в драйвер пользовательского режима.
Поддержка клиентов в режиме ядра в драйвере UMDF
Чтобы включить поддержку драйвера UMDF для клиентов в режиме ядра, INF-файл драйвера UMDF должен содержать директиву UmdfKernelModeClientPolicy в его INF-DDInstall. разделWDF.
Платформа предоставляет два метода, которые полезны для драйверов, поддерживающих клиенты в режиме ядра. Драйвер может вызвать метод WdfRequestGetRequestorMode, чтобы определить, поступил ли запрос ввода-вывода из режима ядра или пользовательского режима. Если запрос ввода-вывода поступил из пользовательского режима, драйвер может вызвать WdfRequestIsFromUserModeDriver, чтобы определить, поступил ли запрос из приложения или другого драйвера пользовательского режима.
Ограничения драйверов в режиме ядра
Драйвер UMDF может обрабатывать запросы ввода-вывода из драйвера режима ядра, только если драйвер режима ядра соответствует следующим требованиям:
Драйвер режима ядра должен работать на уровне IRQL = PASSIVE_LEVEL при отправке запроса на ввод-вывод.
Если драйвер не установил директиву INF UmdfFileObjectPolicy в значение AllowNullAndUnknownFileObjects, каждый запрос ввода-вывода, который драйвер режима ядра отправляет драйверу пользовательского режима, должен иметь связанный объект файла. Платформа должна быть ранее уведомлена о том, что диспетчер ввода-вывода создал объект файла. (Такое уведомление заставляет платформу вызвать функцию обратного вызова EvtDeviceFileCreate в режиме пользователя, но использование этой функции необязательно.)
Запрос ввода-вывода не может содержать код функции IRP_MJ_INTERNAL_DEVICE_CONTROL.
Буферы запроса ввода-вывода не должны содержать указатели на дополнительные сведения, так как драйвер пользовательского режима не может разыменовывать указатели.
Если запрос ввода-вывода содержит код управления вводом-выводом , который указывает метод доступа к буферу 'ни тот, ни другой', драйвер режима ядра должен отправить запрос ввода-вывода в контексте процесса приложения, создавшего этот запрос. Дополнительные сведения о том, как поддерживать метод "ни один" в драйвере UMDF, см. в разделе Управление методами доступа к буферу в драйверах UMDF.
Драйвер UMDF может изменить выходные данные запроса ввода-вывода в пользовательском режиме. Таким образом, драйвер режима ядра должен проверить все выходные данные, полученные из драйвера пользовательского режима.
В общем случае клиент режима ядра должен проверять значение Information, которое драйвер UMDF передает в WdfRequestCompleteWithInformation. Если клиент является драйвером KMDF, он может вызывать WdfRequestGetCompletionParams, чтобы получить эти сведения в структуре IO_STATUS_BLOCK.
Как правило, платформа не проверяет значение информации, которое драйвер UMDF передает WdfRequestCompleteWithInformation. (Обычно этот параметр указывает количество переданных байтов.) Платформа проверяет значение информации только для выходных буферов и только для метода доступа к данным буферизованного ввода-вывода. (Например, платформа проверяет, что количество передаваемых байтов не превышает размер выходного буфера операции чтения, если метод доступа буферен ввода-вывода.)