Uso del pool di dispositivi nei driver UMDF
User-Mode Driver Framework (UMDF) versioni 1.11 e 2.0
Se il driver User-Mode Driver Framework (UMDF) è stato compilato con la versione 1.11 o 2.0 ed è in esecuzione in Windows 8 o versione successiva, il framework crea una singola istanza di Wudfhost in grado di ospitare più stack di dispositivi. Questa tecnica è denominata pooling di dispositivi. Il vantaggio principale del pool di dispositivi è ridurre il consumo di memoria in un ambiente con più dispositivi UMDF.
Se un dispositivo in pool ha esito negativo, il framework termina l'istanza di Wudfhost e tenta di riavviare tutti i dispositivi precedentemente presenti nel pool. Se il dispositivo non riesce più durante il pool, il framework crea un processo Wudfhost separato per il dispositivo e tenta di riavviare il dispositivo.
Se il dispositivo non riesce nel processo host separato, il framework tenta di riavviarlo fino a cinque volte. Il framework reimposta il conteggio degli errori del dispositivo su uno quando sono trascorsi trenta minuti dall'ultimo errore.
Se il sistema viene riavviato, il framework esegue il repooling dei dispositivi ad eccezione di quelli che hanno avuto esito negativo durante l'esecuzione in un processo separato.
Per disabilitare il pool di dispositivi per un dispositivo specifico, usare la direttiva UmdfHostProcessSharing nella sezione DDInstall specifica di WDF di INF. Per informazioni su UmdfHostProcessSharing, vedere Specifica delle direttive WDF nei file INF.
Se il driver usa I/O diretto, è necessario impostare UmdfHostProcessSharing su ProcessSharingDisabled. In caso contrario, l'avvio del driver potrebbe non riuscire. Se WdfDeviceIoBufferedOrDirect è selezionato e il dispositivo è in pool, il framework modifica il metodo di accesso al buffer in I/O memorizzato nel buffer. Se wdfDeviceIoBufferedOrDirect è selezionato e il dispositivo non è in pool, il framework modifica il metodo di accesso al buffer per indirizzare l'I/O.
Per selezionare un metodo di accesso al buffer, il driver deve chiamare il metodo IWDFDeviceInitialize2::SetIoTypePreference dalla relativa funzione di callback IDriverEntry::OnDeviceAdd . Per informazioni sui metodi di accesso, vedere Accesso ai buffer dei dati nei driver UMDF-Based.
UMDF versioni 1.9 e precedenti
Se il driver è stato compilato con UMDF versione 1.9 o precedente, il framework crea un'istanza separata del processo host (Wudfhost) per ogni stack di dispositivi.
Se l'avvio del dispositivo non riesce, il framework tenta di riavviarlo fino a cinque volte. Il framework reimposta il conteggio degli errori del dispositivo su uno quando sono trascorsi trenta minuti dall'ultimo errore.
In un ambiente non in pool, se più stack di dispositivi condividono lo stesso driver UMDF:
- Ogni stack di dispositivi viene caricato in un processo WudfHost separato.
- Il framework chiama i metodi IDriverEntry::OnInitialize e IDriverEntry::OnDeinitialize una volta per ogni stack di dispositivi.
- Il framework chiama il metodo IDriverEntry::OnDeviceAdd del driver una volta per ogni stack di dispositivi. Ogni oggetto dispositivo è associato a un oggetto driver separato.
In un ambiente in pool, se più stack di dispositivi condividono lo stesso driver in modalità utente:
- Ogni stack di dispositivi viene caricato nello stesso processo WudfHost.
- Il framework chiama i metodi IDriverEntry::OnInitialize e IDriverEntry::OnDeinitialize solo una volta.
- Il framework chiama il metodo IDriverEntry::OnDeviceAdd del driver una volta per ogni stack di dispositivi. Ogni oggetto dispositivo è associato allo stesso oggetto driver.
Poiché è presente un solo oggetto driver in una configurazione in pool, il driver non deve archiviare alcun contesto per dispositivo in variabili globali o in oggetti condivisi tra i dispositivi, ad esempio l'oggetto di callback del driver. Al contrario, il driver deve archiviare il contesto per dispositivo in un oggetto non condiviso tra gli stack di dispositivi, ad esempio l'oggetto callback del dispositivo del driver.