Partager via


Utilisation des mémoires tampons

Les pilotes utilisent généralement des mémoires tampons pour transmettre des données vers et depuis le framework et d’autres pilotes, ou pour stocker des informations localement. Cette rubrique décrit les objets de mémoire du framework, les listes de lookaside, les DLL et les mémoires tampons locales.

Utilisation des objets de mémoire du framework

L’infrastructure utilise des objets mémoire pour décrire les mémoires tampons qu’un pilote reçoit et transmet à l’infrastructure. Chaque objet de mémoire du framework représente une mémoire tampon.

Pour créer un objet mémoire, votre pilote appelle l’une des méthodes d’objet suivantes :

Pour obtenir un objet mémoire qui représente les mémoires tampons d’une requête d’E/S reçue, votre pilote appelle WdfRequestRetrieveInputMemory et WdfRequestRetrieveOutputMemory. Pour plus d’informations sur la récupération des mémoires tampons d’une demande d’E/S, consultez Accès aux mémoires tampons de données dans les pilotes Framework-Based.

Pour obtenir l’adresse et la taille de la mémoire tampon d’un objet mémoire, votre pilote appelle WdfMemoryGetBuffer.

Pour déplacer des données dans ou hors de la mémoire tampon d’un objet mémoire, votre pilote appelle WdfMemoryCopyFromBuffer ou WdfMemoryCopyToBuffer. Ces méthodes d’objet vérifient les tailles de source et de destination et empêchent les erreurs de dépassement de mémoire tampon.

Si votre pilote crée un objet mémoire en appelant WdfMemoryCreatePreallocated, il peut ensuite affecter une mémoire tampon différente à l’objet mémoire en appelant WdfMemoryAssignBuffer.

Lorsqu’un pilote envoie une demande d’E/S à une cible d’E/S, il transmet généralement une mémoire tampon d’entrée ou de sortie à une méthode d’objet cible d’E/S d’infrastructure. Le pilote spécifie la mémoire tampon en passant une structure WDF_MEMORY_DESCRIPTOR qui décrit la mémoire tampon ou en passant un handle d’objet mémoire. (Les méthodes d’objet cible d’E/S qui envoient des demandes d’E/S de manière synchrone nécessitent une structure de WDF_MEMORY_DESCRIPTOR , et les méthodes qui envoient des demandes d’E/S de manière asynchrone nécessitent un handle d’objet mémoire.)

Pour plus d’informations sur le moment où une mémoire tampon est valide, consultez Cycle de vie de la mémoire tampon.

Utilisation de listes de lookaside

Si votre pilote nécessite de nombreuses mémoires tampons de taille approximativement identique, il doit les allouer à partir d’une liste de recherche. Le pilote crée une liste de lookaside en appelant WdfLookasideListCreate. Par la suite, le pilote peut obtenir des mémoires tampons à partir de la liste de recherche en appelant WdfMemoryCreateFromLookaside.

Chaque fois que le pilote appelle WdfMemoryCreateFromLookaside, l’infrastructure crée un objet mémoire, obtient une mémoire tampon à partir de la liste de lookaside et affecte la mémoire tampon à l’objet . Lorsque le pilote a fini d’utiliser l’un de ces objets de mémoire, il appelle WdfObjectDelete, ce qui supprime l’objet mémoire et retourne l’espace de mémoire tampon à la liste de recherche.

Le système d’exploitation gère les ressources de mémoire affectées à la liste de recherche. Si le pilote demande une mémoire tampon à partir de la liste de lookaside alors qu’aucun n’est disponible, par exemple la première fois que le pilote appelle WdfMemoryCreateFromLookaside, le système alloue une mémoire tampon et l’affecte à la liste. Lorsque le pilote appelle WdfObjectDelete (et que l’espace de mémoire tampon est retourné à la liste de recherche), le système conserve la mémoire tampon non affectée dans la liste jusqu’à ce que le pilote en a à nouveau besoin. Le système augmente la taille de la liste si nécessaire ; par exemple, les pilotes qui demandent plus fréquemment des mémoires tampons reçoivent des listes de lookaside plus volumineuses. En revanche, le système peut réduire le nombre de mémoires tampons dans la liste si le pilote ne les utilise pas toutes.

Utilisation de MDL

Certains pilotes utilisent des listes de descripteurs de mémoire (MDL) pour décrire les mémoires tampons. Par exemple, un pilote pour un périphérique d’accès direct à la mémoire (DMA) doit passer un MDL à la méthode WdfDmaTransactionInitialize , si elle appelle cette méthode.

Un pilote qui utilise des MDL peut obtenir une MDL qui représente les mémoires tampons d’une requête d’E/S reçue en appelant WdfRequestRetrieveInputWdmMdl et WdfRequestRetrieveOutputWdmMdl.

La plupart des pilotes basés sur l’infrastructure n’utilisent pas de DLL.

Allocation de mémoires tampons locales

Un pilote qui nécessite un espace de mémoire tampon interne local qu’il ne transmettra pas à l’infrastructure n’a pas besoin de créer des objets mémoire pour représenter les mémoires tampons. Le pilote peut appeler ExAllocatePoolWithTag pour allouer des mémoires tampons internes. Lorsque le pilote a fini d’utiliser la mémoire tampon, il doit appeler ExFreePoolWithTag.

Toutefois, les pilotes peuvent également utiliser des objets mémoire pour les mémoires tampons locales. L’un des avantages de l’utilisation de mémoire tampons, au lieu d’appeler ExAllocatePoolWithTag, est que l’infrastructure supprime automatiquement les objets mémoire et leurs mémoires tampons lorsque l’objet parent de chaque objet est supprimé.

Important

Les DDIS ExAllocatePool décrites dans cette rubrique ont été dépréciées dans Windows 10 version 2004 et ont été remplacées par ExAllocatePool2 et ExAllocatePool3. Pour plus d’informations, consultez Mise à jour des appels ExAllocatePool déconseillés vers ExAllocatePool2 et ExAllocatePool3.

Alignement des mémoires tampons

Votre pilote peut utiliser la fonction WDF_ALIGN_SIZE_UP ou WDF_ALIGN_SIZE_DOWN pour calculer une taille de mémoire tampon alignée sur un décalage d’alignement spécifié. Ce calcul est utile si votre pilote doit allouer plusieurs mémoires tampons contiguës, si chaque mémoire tampon doit commencer à une limite d’alignement d’adresse.