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 della richiesta diventa 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 del driver CompletionRoutine, 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 spinlock.
Trovare l'handle dell'oggetto richiesta nella raccolta per assicurarsi che la routine di completamento del driver non abbia completato la richiesta né rimosso l'handle dalla raccolta.
Chiamare WdfObjectReference per incrementare il numero di riferimenti dell'oggetto richiesta in modo che l'oggetto non possa essere eliminato.
Chiamare WdfSpinLockRelease per rilasciare lo spin lock.
Esegui WdfRequestCancelSentRequest.
Chiamare WdfObjectDereference per decrementare il numero di 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 il CompletionRoutine del driver chiamate di funzione di callback WdfRequestComplete.