Réservation de ressources DMA
[S’applique à KMDF uniquement]
En règle générale, les pilotes basés sur l’infrastructure ne réservent pas de registres cartographiques à l’avance. Toutefois, dans certaines circonstances, les conducteurs peuvent avoir besoin de réserver ces ressources à l’avance.
Les pilotes basés sur l’infrastructure qui s’exécutent sur Windows 8 ou une version ultérieure peuvent réserver un nombre spécifié de registres cartographiques pour un enabler DMA qui spécifie un paquet ou un profil système. Pour ce faire, le pilote appelle WdfDmaTransactionAllocateResources et inscrit une fonction de rappel EvtReserveDma .
L’infrastructure appelle la fonction EvtReserveDma du pilote lorsqu’elle a réservé les registres de carte et le verrou de l’adaptateur WDM DMA. Le pilote peut ensuite initialiser et lancer la transaction plusieurs fois à l’aide du même objet transaction avant de libérer l’objet transaction. Pour libérer les ressources DMA dans le système, le pilote appelle WdfDmaTransactionFreeResources.
Pour déterminer le nombre de registres de carte requis pour une transaction, le pilote peut appeler WdfDmaTransactionGetTransferInfo avant d’appeler WdfDmaTransactionAllocateResources. Le pilote doit initialiser la transaction avant d’appeler WdfDmaTransactionGetTransferInfo.
Les étapes suivantes montrent comment un pilote peut réserver et libérer un enabler DMA pour une utilisation exclusive avec une transaction spécifiée :
Le pilote reçoit une demande d’E/S.
Le gestionnaire de requêtes du pilote appelle WdfDmaTransactionCreate pour créer un objet de transaction DMA pour la requête.
Le gestionnaire de requêtes du pilote appelle WdfDmaTransactionAllocateResources pour réserver des ressources.
Le framework appelle EvtReserveDma lorsqu’il a réservé les ressources demandées.
Dans EvtReserveDma, le pilote appelle WdfDmaTransactionInitializeUsingRequest ou WdfDmaTransactionInitialize pour initialiser l’objet transaction.
Dans EvtReserveDma, le pilote appelle la méthode WdfDmaTransactionExecute pour démarrer la transaction. Étant donné que la transaction a des ressources réservées, l’infrastructure appelle immédiatement la fonction de rappel EvtProgramDma du pilote.
À partir d’EvtInterruptDpc ou EvtDmaTransactionDmaTransferComplete, le pilote appelle WdfDmaTransactionDmaCompleted, WdfDmaTransactionDmaCompletedWithLength ou WdfDmaTransactionDmaCompletedFinal, suivi de WdfObjectDelete ou WdfDmaTransactionRelease. Le pilote ne doit pas supprimer ou libérer la transaction tant que la transaction n’a pas été terminée ou annulée. Une fois cette étape terminée, les registres de carte restent réservés.
Le pilote peut répéter les étapes 5 à 7 autant de fois que nécessaire.
Lorsque le pilote n’a plus besoin de la réservation, il appelle WdfDmaTransactionFreeResources à partir d’EvtInterruptDpc ou EvtDmaTransactionDmaTransferComplete. Le pilote peut également appeler WdfDmaTransactionFreeResources à partir de sa fonction de rappel d’événement EvtReserveDma .