Partager via


Utilisation de mémoires tampons communes

[S’applique uniquement à KMDF]

Les pilotes pour les appareils DMA doivent parfois allouer de l’espace tampon auquel un appareil et le pilote peuvent accéder. Par exemple, un appareil peut écrire des informations de transfert, telles que le nombre d’octets, dans cet espace tampon et le pilote peut les lire pour déterminer le nombre d’octets qui ont été transférés. Ce type d’espace tampon est appelé mémoire tampon commune.

Pour allouer une mémoire tampon commune, la fonction de rappel EvtDriverDeviceAdd de votre pilote :

L’exemple de code suivant est extrait du fichier Init.c de l’exemple PLX9x5x . Ce code montre comment un pilote KMDF alloue de l’espace tampon commun.

// Allocate common buffer for building writes
DevExt->WriteCommonBufferSize = 
         sizeof( DMA_TRANSFER_ELEMENT) * DevExt->WriteTransferElements;
status = WdfCommonBufferCreate( DevExt->DmaEnabler,
                                DevExt->WriteCommonBufferSize,
                                WDF_NO_OBJECT_ATTRIBUTES, 
                                &DevExt->WriteCommonBuffer );
if (!NT_SUCCESS(status)) {
    . . . //Error-handling code omitted 
    }
DevExt->WriteCommonBufferBase = 
             WdfCommonBufferGetAlignedVirtualAddress(
                      DevExt->WriteCommonBuffer);
DevExt->WriteCommonBufferBaseLA = 
             WdfCommonBufferGetAlignedLogicalAddress(
                      DevExt->WriteCommonBuffer);
RtlZeroMemory( DevExt->WriteCommonBufferBase, DevExt->WriteCommonBufferSize);

Si votre pilote appelle WdfDeviceSetAlignmentRequirement avant d’appeler WdfDmaEnablerCreate, les mémoires tampons créées par WdfDmaEnablerCreate sont alignées sur la limite d’adresse mémoire que le pilote a spécifiée sur WdfDeviceSetAlignmentRequirement. Dans le cas contraire, les mémoires tampons courantes sont alignées sur les limites des adresses de mots. Le pilote peut également appeler WdfCommonBufferCreateWithConfig pour spécifier un alignement pour une mémoire tampon unique.

Pour obtenir la longueur d’une mémoire tampon commune allouée par votre pilote, le pilote peut appeler WdfCommonBufferGetLength.

Lorsque le pilote a terminé d’utiliser une mémoire tampon commune, le pilote appelle WdfObjectDelete.