Share via


Synchronisieren des Abbruchs gesendeter Anforderungen

Wenn ein Treiber versucht, eine E/A-Anforderung abzubrechen, die er an ein E/A-Ziel weitergeleitet hat, muss der Treiber sicherstellen, dass er ein gültiges Anforderungshandle an die WdfRequestCancelSentRequest-Methode übergibt. Das Anforderungshandle wird ungültig, wenn das E/A-Ziel die Anforderung abgeschlossen hat, da die CompletionRoutine-Rückruffunktion des Treibers WdfRequestComplete aufruft (die versucht, das Anforderungsobjekt zu löschen).

Um dieses Problem zu vermeiden, kann der Treiber die Anforderungen nachverfolgen, die er an das E/A-Ziel gesendet hat, indem er z. B. eine Auflistung von Anforderungsobjekten erstellt. Der Treiber kann WdfSpinLockAcquire aufrufen, um den Zugriff auf die Sammlung zu synchronisieren.

Wenn die CompletionRoutine-Rückruffunktion des Treibers aufgerufen wird, ruft sie die Sperre ab, entfernt das Handle der abgeschlossenen Anforderung aus der Auflistung und ruft WdfSpinLockRelease auf, um die Sperre zu lösen.

Bevor er versucht, eine Anforderung abzubrechen, die der Treiber an ein E/A-Ziel weitergeleitet hat, kann der Treiber Folgendes ausführen:

  1. Rufen Sie WdfSpinLockAcquire auf , um eine Drehsperre zu erhalten.

  2. Suchen Sie das Handle des Anforderungsobjekts in der Auflistung, um sicherzustellen, dass die Vervollständigungsroutine des Treibers die Anforderung nicht abgeschlossen und das Handle aus der Auflistung entfernt hat.

  3. Rufen Sie WdfObjectReference auf, um die Verweisanzahl des Anforderungsobjekts zu erhöhen, sodass das Objekt nicht gelöscht werden kann.

  4. Rufen Sie WdfSpinLockRelease auf, um die Drehsperre zu lösen.

  5. Rufen Sie WdfRequestCancelSentRequest auf.

  6. Rufen Sie WdfObjectDereference auf, um die Verweisanzahl des Objekts zu erhöhen.

Durch diese Sequenz wird sichergestellt, dass das Handle der Anforderung weiterhin gültig ist (aufgrund der inkrementierten Verweisanzahl), wenn das E/A-Ziel die Anforderung abgeschlossen hat, bevor der Treiber WdfRequestCancelSentRequestRequestComplete aufruft, wenn die CompletionRoutine-Rückruffunktion des Treibers WdfRequestComplete aufruft.