Freigeben über


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 unter Windows 8 oder höher mit direct memory access (DMA) Version 3 ausgeführt wird, kann der Treiber versuchen, eine ausstehende DMA-Transaktion durch Aufrufen der WdfDmaTransactionCancel-Methode abzubrechen.

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

  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 EvtRequestCancel-Rückruffunktion 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 auftritt, aber bevor die WdfDmaTransactionExecute-Methode die DMA-Zuordnung gestartet hat, wird der Transaktionsabbruch erfolgreich ausgeführt, 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 fehl, die Transaktion abzubrechen, 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 EvtRequestCancel-Rückruffunktionmö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 EvtProgramDma-Rückruffunktion 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 des Anforderungsabbruchs 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 dieselbe Technik verwenden, um eine DMA-Transaktion abzubrechen, nachdem einige Anzahl von Übertragungsvorgängen bereits abgeschlossen wurden. In diesem Fall ruft der Treiber WdfDmaTransactionCancel nach dem Aufruf von WdfDmaTransactionDmaCompleted auf, aber bevor das Framework EvtProgramDma aufruft, um den nächsten Übertragungsvorgang zu programmieren. Wenn der Treiber WdfDmaTransactionCancel aufruft, bevor er WdfDmaTransactionDmaCompleted aufruft, gibt WdfDmaTransactionDmaCompletedTRUE zurück, was angibt, dass die DMA-Transaktion abgeschlossen wurde.