Uso di I/O di Self-Managed

La maggior parte dei driver basati su framework sfrutta le funzionalità PnP e risparmio energia del framework per i dispositivi supportati. In altre parole, la maggior parte dei driver basati sul framework consente al framework di gestire gli stati di alimentazione e PnP di un dispositivo eseguendo tutte le operazioni seguenti:

Tuttavia, alcuni driver basati su framework richiederanno una maggiore conoscenza dello stato dei dispositivi, inclusi i driver nelle situazioni seguenti:

  • Le operazioni eseguite da un driver non sono determinate da un set di richieste di I/O ricevute dal driver dalle code di I/O del framework.

  • Un driver comunica con driver non framework meno recenti e gestisce direttamente le interfacce WDM.

  • Le richieste di I/O ricevute da un driver non possono essere suddivise in due gruppi: quelli che richiedono che il dispositivo sia nello stato di lavoro e quelli che non lo fanno.

La maggior parte dei driver non si trova in una delle situazioni precedenti, ma se il driver è, potrebbe essere necessario avere un maggiore controllo diretto sulle operazioni PnP e risparmio energia del dispositivo. Tali driver possono usare operazioni di I/O autogestito. L'uso dell'I/O autogestito indica che il driver riceve una notifica (tramite un set di funzioni di callback) ogni volta che uno se i dispositivi sono collegati o scollegati e ogni volta che il dispositivo viene temporaneamente arrestato.

Si noti che un driver può usare operazioni di I/O autogestito e usare comunque le code di I/O del framework, come code gestite dall'alimentazione o meno. Ad esempio, un driver può usare le code di I/O del framework, non gestite dall'alimentazione, con un set di funzioni di callback di I/O autogestito.

Per usare L/O autogestito, il driver registra un set aggiuntivo di funzioni di callback degli eventi quando chiama WdfDeviceInitSetPnpPowerEventCallbacks. Queste funzioni di callback degli eventi sono:

Quando il dispositivo entra nello stato di lavoro (D0) per la prima volta, il framework chiama la funzione di callback EvtDeviceSelfManagedIoInit del driver. Ciò si verifica ogni volta che un utente collega il dispositivo al sistema e ogni volta che il sistema viene riavviato.

Esistono tre circostanze in cui un driver deve arrestare le operazioni di I/O di un dispositivo: il dispositivo sta per entrare in uno stato a basso consumo, sta per essere rimosso o è già stato rimosso in modo imprevisto. Nell'elenco seguente vengono esaminate in dettaglio ognuna di queste circostanze:

  • Il dispositivo sta per entrare in uno stato a basso consumo e alla fine tornerà allo stato di lavoro.

    Quando il dispositivo sta per entrare in uno stato a basso consumo (perché il dispositivo è stato inattivo, l'intero sistema sta entrando in uno stato a basso consumo o il gestore PnP sta ridistribuendo le risorse hardware di sistema), il framework chiama la funzione di callback EvtDeviceSelfManagedIoSuspend del driver. Dopo che il dispositivo richiama lo stato di lavoro, il framework chiama la funzione di callback EvtDeviceSelfManagedIoRestart del driver.

  • Il dispositivo sta per essere rimosso.

    Per gestire la rimozione del dispositivo richiesta dall'utente, il framework chiama la funzione di callback EvtDeviceSelfManagedIoSuspend del driver prima di arrestare il dispositivo. Dopo aver arrestato il dispositivo, il framework chiama la funzione di callback EvtDeviceSelfManagedIoFlush del driver. Dopo la rimozione del dispositivo, il framework chiama la funzione di callback EvtDeviceSelfManagedIoCleanup .

  • Il dispositivo è già stato rimosso in modo imprevisto (rimozione a sorpresa).

    Se il driver del bus del dispositivo determina che il dispositivo non è più presente o se un altro driver nello stack determina che il dispositivo non risponde, il driver che ha individuato il problema informa il gestore PnP. Il gestore PnP informa quindi il resto dei driver che il dispositivo non è più presente. Per i driver basati su framework, il framework riceve il messaggio del gestore PnP e chiama le funzioni di callback EvtDeviceSelfManagedIoSuspend, EvtDeviceSelfManagedIoFlush e EvtDeviceSelfManagedIoCleanup .

    Il driver può anche registrare una funzione di callback EvtDeviceSurpriseRemoval . Se il dispositivo era in stato funzionante (D0) quando viene rimosso, il framework chiama EvtDeviceSurpriseRemoval prima di chiamare le funzioni di callback di I/O autogestito. Se il dispositivo era in uno stato a basso consumo quando viene rimosso, EvtDeviceSurpriseRemoval viene chiamato dopo EvtDeviceSelfManagedIoSuspend)

Per altre informazioni sull'ordine in cui il framework chiama le funzioni di callback degli eventi di un driver, vedere Scenari di risparmio energia e PnP.

Anche se raramente necessario, il framework consente ai driver di avere ancora più controllo sugli stati di alimentazione e PnP di un dispositivo, accedendo alle macchine a stati nel framework.