Abbrechen von DMA-Transaktionen

[Gilt nur für KMDF]

Wenn Ihr Treiber mit Version 1.11 oder einer höheren Version von KMDF erstellt wurde und auf Windows 8 oder höher ausgeführt wird, wenn DMA-Version 3 (Direct Memory Access) verwendet wird, kann der Treiber versuchen, eine ausstehende DMA-Transaktion abzubrechen, indem er die WdfDmaTransactionCancel-Methode aufruft.

Beim Aufrufen von WdfDmaTransactionCancel muss der Treiber sicherstellen, dass die angegebene DMA-Transaktion während des Aufrufs nicht abgeschlossen wird. Der Treiber kann die folgende Technik verwenden, um eine Transaktion sicher abzubrechen, entweder vor der DMA-Kanalzuordnung oder nach abschluss einiger Übertragungsvorgänge:

  1. In einem der Anforderungshandler des Treibers ruft der Treiber WdfRequestMarkCancelableEx auf und stellt eine EvtRequestCancel-Rückruffunktion für die E/A-Anforderung bereit. Der Anforderungshandler ruft dann WdfDmaTransactionExecute auf.

  2. Die Rückruffunktion EvtRequestCancel des Treibers (die direkt nach dem Aufruf von WdfRequestMarkCancelableEx in einem separaten Thread ausgeführt werden kann) ruft WdfDmaTransactionCancel auf.

  3. Wenn der Aufruf von WdfDmaTransactionCancel nach dem Aufruf von WdfDmaTransactionExecute, aber bevor die WdfDmaTransactionExecute-Methode die DMA-Zuordnung gestartet hat, ist der Transaktionsabbruch erfolgreich und WdfDmaTransactionCancel gibt TRUE zurück. In diesem Fall muss die EvtRequestCancel-Rückruffunktion des Treibers die DMA-Transaktion abschließen. WdfDmaTransactionExecute gibt einen Fehlerwert zurück.

  4. Wenn der Treiber WdfDmaTransactionCancel aufruft, nachdem die WdfDmaTransactionExecute-Methode die DMA-Zuordnung gestartet hat, schlägt der Versuch, die Transaktion abzubrechen, fehl, und WdfDmaTransactionCancel gibt FALSE zurück. In diesem Fall gibt WdfDmaTransactionExecute STATUS_SUCCESS zurück, und der Anforderungshandler des Treibers muss die DMA-Transaktion abschließen.

    Wenn der Treiber DMA im Systemmodus verwendet, ruft die Rückruffunktion EvtRequestCancel möglicherweise WdfDmaTransactionStopSystemTransfer auf, um zu versuchen, die laufende DMA-Übertragung im Systemmodus zu beenden. Ein Codebeispiel, das dies veranschaulicht, finden Sie unter WdfDmaTransactionStopSystemTransfer.

  5. Nachdem die WdfDmaTransactionExecute-Methode die DMA-Zuordnung abgeschlossen hat, ruft das Framework die Rückruffunktion EvtProgramDma des Treibers auf (die direkt nach dem Aufruf von WdfDmaTransactionExecute in einem separaten Thread ausgeführt werden kann). An diesem Punkt würde ein Aufruf der WdfDmaTransactionCancel-Methode FALSE zurückgeben.

    In EvtProgramDma kann der Treiber WdfRequestUnmarkCancelable aufrufen, um die Möglichkeit der Anforderungsabbruch zu beenden. Wenn WdfRequestUnmarkCancelable STATUS_SUCCESS zurückgibt, muss die Rückruffunktion die Hardware programmieren, um die Übertragung zu starten. Wenn WdfRequestUnmarkCancelable STATUS_CANCELLED zurückgibt, wurde die Anforderung abgebrochen. In diesem Fall muss EvtProgramDmaWdfDmaTransactionDmaCompletedFinal aufrufen, um die DMA-Transaktion abzuschließen.

    Der Treiber kann die gleiche Technik verwenden, um eine DMA-Transaktion abzubrechen, nachdem eine Reihe von Übertragungsvorgängen bereits abgeschlossen wurde. In diesem Fall ruft der Treiber WdfDmaTransactionCancel auf, nachdem er WdfDmaTransactionDmaCompleted aufgerufen hat, aber bevor das Framework EvtProgramDma aufruft , um den nächsten Übertragungsvorgang zu programmieren. Wenn der Treiber WdfDmaTransactionCancelaufruft, bevor er WdfDmaTransactionDmaCompleted aufruft, gibt WdfDmaTransactionDmaCompletedTRUE zurück, was angibt, dass die DMA-Transaktion abgeschlossen wurde.