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


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

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

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

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

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

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

Чтобы отключить пул устройств для определенного устройства, используйте директиву UmdfHostProcessSharing в разделе WDF DDInstall 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 драйвера один раз для каждого стека устройств. Каждый объект устройства связан с тем же объектом драйвера.

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