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


Поддержка клиентов Kernel-Mode в драйверах UMDF

В этом разделе описывается, как драйвер User-Mode Driver Framework (UMDF) поддерживает клиенты в режиме ядра, начиная с UMDF версии 2.

Клиент в режиме ядра — это драйвер в режиме ядра, который отправляет запросы ввода-вывода в драйвер 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. (Этот параметр обычно указывает количество переданных байтов.) Платформа проверяет значение информации только для выходных буферов и только для метода доступа к данным буферизованного ввода-вывода . (Например, платформа проверяет, что количество переданных байтов не превышает размер выходного буфера операции чтения, если метод доступа буферизовал операции ввода-вывода.)