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 non è più 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ò:

  1. Chiamare WdfSpinLockAcquire per acquisire un blocco di rotazione.

  2. Trovare l'handle dell'oggetto richiesta nella raccolta per assicurarsi che la routine di completamento del driver non abbia completato la richiesta e rimosso l'handle dalla raccolta.

  3. Chiamare WdfObjectReference per incrementare il conteggio dei riferimenti dell'oggetto richiesta in modo che l'oggetto non possa essere eliminato.

  4. Chiamare WdfSpinLockRelease per rilasciare il blocco di rotazione.

  5. Chiamare WdfRequestCancelSentRequest.

  6. Chiamare WdfObjectDereference per decrementare il conteggio dei riferimenti dell'oggetto.

Questa sequenza assicura 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 incrementato) anche se la funzione di callback CompletionRoutine del driver chiama WdfRequestComplete.