Sincronizzazione dell'annullamento delle richieste inviate
Quando un driver tenta di annullare una richiesta di I/O inoltrata a una destinazione di I/O, il driver deve assicurarsi che passi un handle di richiesta valido al metodo WdfRequestCancelSentRequest. L'handle di richiesta non è valido se la destinazione di I/O completa la richiesta, perché la funzione di callback CompletionRoutine del driver chiamerà WdfRequestComplete (che tenta di eliminare l'oggetto richiesta).
Per evitare questo problema, il driver può tenere traccia delle richieste inviate alla destinazione di I/O, ad esempio, creando una raccolta di oggetti richiesta. Il driver può chiamare WdfSpinLockAcquire per sincronizzare l'accesso alla raccolta.
Quando viene chiamata la funzione di callback CompletionRoutine del driver, acquisisce il blocco, rimuove l'handle della richiesta completata dalla raccolta e chiama WdfSpinLockRelease per rilasciare il blocco.
Prima di tentare di annullare una richiesta inoltrata dal driver a una destinazione di I/O, il driver può:
Chiamare WdfSpinLockAcquire per acquisire un blocco spin.
Trovare l'handle dell'oggetto richiesta nell'insieme per assicurarsi che la routine di completamento del driver non abbia completato la richiesta e rimosso l'handle dalla raccolta.
Chiamare WdfObjectReference per incrementare il conteggio dei riferimenti dell'oggetto richiesta in modo che l'oggetto non possa essere eliminato.
Chiamare WdfSpinLockRelease per rilasciare il blocco spin.
Chiamare WdfRequestCancelSentRequest.
Chiamare WdfObjectDereference per decrementare il conteggio dei riferimenti dell'oggetto.
Questa sequenza garantisce che se la destinazione di I/O completa la richiesta prima che il driver chiami WdfRequestCancelSentRequest, l'handle della richiesta è ancora valido (a causa del conteggio dei riferimenti incrementati) anche se la funzione di callback CompletionRoutine del driver chiama WdfRequestComplete.