Gestione delle richieste per arrestare un dispositivo
Esistono due circostanze in cui, prima di chiedere ai driver di un dispositivo di arrestare un dispositivo, il gestore PnP chiede ai driver se l'arresto del dispositivo è una buona idea:
Un utente ha collegato un nuovo dispositivo e il gestore PnP deve ridistribuire le risorse hardware del sistema per ospitare il nuovo dispositivo.
Un utente ha indicato che vuole rimuovere il dispositivo.
Esistono diversi modi in cui un driver può gestire queste situazioni:
Se il driver ha chiamato WdfDeviceSetSpecialFileSupport perché un dispositivo supporta un file speciale e se un file speciale è aperto nel dispositivo, il framework non consente l'arresto del dispositivo.
Per impedire temporaneamente tutte le interruzioni per un periodo di tempo relativamente breve, il driver può chiamare WdfDeviceSetStaticStopRemove.
Per valutare ed elaborare ogni tentativo di arresto singolarmente, il driver può fornire funzioni di callback EvtDeviceQueryStop e EvtDeviceQueryRemove .
Se il dispositivo non supporta file speciali e, se l'arresto o la rimozione di un dispositivo non è mai un problema per il driver o il dispositivo, il driver non fornisce EvtDeviceQueryStop e EvtDeviceQueryRemove funzioni di callback e non chiama mai WdfDeviceSetStaticStopRemove. In questo caso, il gestore PnP arresta sempre il dispositivo senza prima controllare se il driver lo consente.
Ridistribuzione delle risorse
A volte il gestore PnP deve ridistribuire le risorse hardware del sistema. In genere, questa ridistribuzione si verifica perché un driver del bus ha segnalato che un nuovo dispositivo è stato collegato e il nuovo dispositivo richiede risorse già assegnate. I dispositivi devono essere arrestati prima che le risorse vengano riassegnate.
Se è necessario per il driver a volte impedire al gestore PnP di arrestare un dispositivo occupato, il driver può fornire una funzione di callback EvtDeviceQueryStop . Se la funzione di callback EvtDeviceQueryStop del driver restituisce un valore di stato di errore, la gestione PnP non arresterà il dispositivo.
Se il driver determina che è sicuro arrestare il dispositivo, la funzione di callback restituisce STATUS_SUCCESS. Se nessuno degli altri driver del dispositivo impedisce l'arresto, il gestore PnP arresta temporaneamente il dispositivo.
Per informazioni sull'ordine in cui il framework chiama le funzioni di callback degli eventi di un driver quando il gestore PnP arresta un dispositivo per ridistribuire le risorse, vedere PnP Manager Ridistribuisce le risorse di sistema.
Un utente rimuove o disabilita un dispositivo
Un utente può rimuovere o disabilitare alcuni dispositivi. Ad esempio:
Se il driver ha impostato il membro rimovibile (e non il membro SurpriseRemovalOK ) della struttura di WDF_DEVICE_PNP_CAPABILITIES del dispositivo, l'utente può eseguire il programma Unplug o Eject Hardware e quindi scollegare o rimuovere il dispositivo.
Se il driver non ha impostato il membro NotDisable della struttura WDF_DEVICE_STATE del dispositivo, l'utente può usare Gestione dispositivi per disabilitare il dispositivo.
In questi casi, il gestore PnP tenta di arrestare il dispositivo prima che l'utente lo rimuove.
Se è necessario per il driver a volte impedire la rimozione di un dispositivo occupato, il driver può fornire una funzione di callback EvtDeviceQueryRemove . Se la funzione di callback EvtDeviceQueryRemove di qualsiasi driver restituisce un valore di stato di errore, la gestione PnP non arresterà il dispositivo.
Se il driver determina che è sicuro per l'utente rimuovere il dispositivo, la funzione di callback restituisce STATUS_SUCCESS. Se nessuno degli altri driver del dispositivo impedisce la rimozione, la gestione PnP arresta il dispositivo.
Per informazioni sull'ordine in cui il framework chiama le funzioni di callback degli eventi di un driver durante l'arresto di un dispositivo per la rimozione, vedere Un utente scollega un dispositivo.