Reservieren von DMA-Ressourcen
[Gilt nur für KMDF]
In der Regel reservieren frameworkbasierte Treiber Kartenregister nicht im Voraus. Unter bestimmten Umständen müssen Fahrer diese Ressourcen jedoch möglicherweise im Voraus reservieren.
Frameworkbasierte Treiber, die auf Windows 8 oder höher ausgeführt werden, können eine angegebene Anzahl von Kartenregistern für einen DMA-Enabler reservieren, der ein Paket- oder Systemprofil angibt. Dazu ruft der Treiber WdfDmaTransactionAllocateResources auf und registriert eine EvtReserveDma-Rückruffunktion .
Das Framework ruft die EvtReserveDma-Funktion des Treibers auf, wenn es die Kartenregister und die Sperre des WDM DMA-Adapters reserviert hat. Der Treiber kann die Transaktion dann mehrmals mit demselben Transaktionsobjekt initialisieren und initiieren, bevor das Transaktionsobjekt endgültig freigegeben wird. Um die DMA-Ressourcen wieder für das System freizugeben, ruft der Treiber WdfDmaTransactionFreeResources auf.
Um die Anzahl der für eine Transaktion erforderlichen Zuordnungsregister zu bestimmen, kann der Treiber WdfDmaTransactionGetTransferInfo aufrufen, bevor WdfDmaTransactionAllocateResources aufgerufen wird. Der Treiber muss die Transaktion initialisieren, bevor WdfDmaTransactionGetTransferInfo aufgerufen wird.
Die folgenden Schritte veranschaulichen, wie ein Treiber einen DMA-Enabler für die exklusive Verwendung mit einer angegebenen Transaktion reservieren und freigeben kann:
Der Treiber empfängt eine E/A-Anforderung.
Der Anforderungshandler des Treibers ruft WdfDmaTransactionCreate auf, um ein DMA-Transaktionsobjekt für die Anforderung zu erstellen.
Der Anforderungshandler des Treibers ruft WdfDmaTransactionAllocateResources auf, um Ressourcen zu reservieren.
Das Framework ruft EvtReserveDma auf, wenn es die angeforderten Ressourcen reserviert hat.
In EvtReserveDma ruft der Treiber WdfDmaTransactionInitializeUsingRequest oder WdfDmaTransactionInitialize auf, um das Transaktionsobjekt zu initialisieren.
In EvtReserveDma ruft der Treiber die WdfDmaTransactionExecute-Methode auf, um die Transaktion zu starten. Da die Transaktion über reservierte Ressourcen verfügt, ruft das Framework sofort die Rückruffunktion EvtProgramDma des Treibers auf.
Von EvtInterruptDpc oder EvtDmaTransactionDmaTransferComplete ruft der Treiber WdfDmaTransactionDmaCompleted, WdfDmaTransactionDmaCompletedWithLength oder WdfDmaTransactionDmaCompletedFinal auf, gefolgt von WdfObjectDelete oder WdfDmaactionTransRelease. Der Treiber darf die Transaktion erst löschen oder freigeben, wenn die Transaktion abgeschlossen oder abgebrochen wurde. Nach Abschluss dieses Schritts bleiben die Kartenregister reserviert.
Der Treiber kann die Schritte 5 bis 7 beliebig oft wiederholen.
Wenn der Treiber die Reservierung nicht mehr benötigt, ruft der Treiber WdfDmaTransactionFreeResources von EvtInterruptDpc oder EvtDmaTransactionDmaTransferComplete auf. Alternativ kann der Treiber WdfDmaTransactionFreeResources über seine EvtReserveDma-Ereignisrückruffunktion aufrufen.