Использование пулов устройств в драйверах 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 драйвера один раз для каждого стека устройств. Каждый объект устройства связан с тем же объектом драйвера.
Так как в конфигурации в составе пула есть только один объект драйвера, драйвер не должен хранить контекст для каждого устройства в глобальных переменных или в объектах, общих для всех устройств, таких как объект обратного вызова драйвера. Вместо этого драйвер должен хранить контекст для каждого устройства в объекте, который не является общим для стеков устройств, например объект обратного вызова устройства драйвера.