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


Использование пула устройств в драйверах UMDF

User-Mode Driver Framework (UMDF) версии 1.11 и 2.0

Если драйвер User-Mode Driver Framework (UMDF) был создан с версией 1.11 или 2.0 и работает в Windows 8 или более поздней версии, платформа создает один экземпляр Wudfhost, который может размещать несколько стеков устройств. Этот метод называется пул устройств. Основным преимуществом пула устройств является сокращение потребления памяти в среде с несколькими устройствами UMDF.

Если устройство из пула завершится сбоем, платформа завершает работу экземпляра Wudfhost и пытается перезапустить все устройства, которые ранее находились в пуле. Если устройство снова завершается ошибкой при объединенном использовании, фреймворк создает отдельный процесс Wudfhost для устройства и пытается снова запустить его.

Если устройство выходит из строя в отдельном процессе узла, фреймворк пытается перезапустить его до пяти раз. Платформа сбрасывает количество ошибок устройства до одного, когда с момента последнего сбоя прошло тридцати минут.

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

Чтобы отключить пул устройств для конкретного устройства, используйте директиву UmdfHostProcessSharing в разделе DDInstall, относящемся к WDF, файла INF. Сведения о UmdfHostProcessSharingсм. в разделе Указание директив WDF в INF-файлах.

Если ваш драйвер использует прямой доступ к вводу-выводу, необходимо установить параметр UmdfHostProcessSharing на ProcessSharingDisabled. В противном случае драйвер может не запуститься. Если выбран WdfDeviceIoBufferedOrDirect и устройство находится в пуле, платформа изменяет метод доступа к буферу на буферизованный ввод-вывод. Если выбран WdfDeviceIoBufferedOrDirect, а устройство не в пуле, платформа изменяет метод доступа к буферу для прямого ввода-вывода.

Чтобы выбрать метод доступа к буферу, драйвер должен вызвать метод IWDFDeviceInitialize2::SetIoTypePreference из функции обратного вызова IDriverEntry::OnDeviceAdd. Сведения о методах доступа см. в разделе Доступ к буферам данных в UMDF-Based драйверах.

UMDF версии 1.9 и более ранние версии

Если драйвер был создан с помощью UMDF версии 1.9 или более ранней, платформа создает отдельный экземпляр процесса узла (Wudfhost) для каждого стека устройств.

Если устройство не запускается, платформа пытается перезапустить ее до пяти раз. Платформа сбрасывает количество ошибок устройства до одного, когда с момента последнего сбоя прошло тридцати минут.

В среде, отличной от пула, если несколько стеков устройств используют один и тот же драйвер UMDF:

  • Каждый стек устройств загружается в отдельный процесс WudfHost.
  • Фреймворк вызывает методы IDriverEntry::OnInitialize и IDriverEntry::OnDeinitialize один раз для каждого стека устройств.
  • Платформа вызывает метод драйвера IDriverEntry::OnDeviceAdd один раз для каждого стека устройств. Каждый объект устройства связан с отдельным объектом драйвера.

В пулной среде, если несколько стеков устройств используют один и тот же драйвер пользовательского режима:

  • Каждый стек устройств загружается в одном процессе WudfHost.
  • Платформа вызывает метод IDriverEntry::OnInitialize драйвера и метод IDriverEntry::OnDeinitialize драйвера только один раз.
  • Платформа вызывает метод драйвера IDriverEntry::OnDeviceAdd один раз для каждого стека устройств. Каждый объект устройства связан с тем же объектом драйвера.

Так как в конфигурации пула существует только один объект драйвера, драйвер не должен хранить контекст для каждого устройства в глобальных переменных или в объектах, общих для устройств, таких как объект обратного вызова драйвера. Вместо этого драйвер должен хранить контекст для каждого устройства в объекте, который не разделяется между стеками устройств, например, в объекте обратного вызова устройства драйвера.