Fonction RtlFillDeviceMemory (wdm.h)
La fonction RtlFillDeviceMemory fournit le comportement RtlFillVolatileMemory (par exemple, la définition du contenu d’une mémoire tampon sans interférence des optimisations du compilateur) dans les situations où le développeur doit en outre s’assurer que les erreurs d’alignement ne seront pas générées lors de l’accès à la mémoire de l’appareil.
Syntaxe
volatile void * RtlFillDeviceMemory(
[out] volatile void *Destination,
[in] size_t Length,
[in] int Fill
);
Paramètres
[out] Destination
Pointeur vers l’adresse de départ du bloc de mémoire à remplir.
[in] Length
Taille du bloc de mémoire à remplir, en octets. Cette valeur doit être inférieure à la taille de la mémoire tampon de destination .
[in] Fill
Valeur d’octet avec laquelle remplir le bloc de mémoire.
Valeur retournée
Retourne la valeur de Destination.
Remarques
La fonction n’étant pas reconnue en tant qu’intrinsèque du compilateur, le compilateur n’optimisera jamais l’appel (soit entièrement, soit remplacez l’appel par une séquence d’instructions équivalente). Cela diffère de RtlFillMemory qui est soumis à diverses optimisations du compilateur.
Une fois l’appel terminé, la mémoire tampon a été remplacée par la valeur souhaitée. Cette fonction permet d’accéder à la mémoire de destination uniquement au sein de la fonction (par exemple, le compilateur ne peut pas déplacer les accès à la mémoire hors de cette fonction).
La fonction peut effectuer des accès à la mémoire non alignée uniquement si le processeur prend en charge les accès à la mémoire non alignée sur la mémoire de l’appareil. Si le processeur ne prend pas en charge les accès à la mémoire des appareils non alignés, seuls les accès alignés sont effectués.
La fonction peut accéder aux emplacements de mémoire plusieurs fois dans le cadre de son fonctionnement.
Notes
Cette fonction garantit uniquement que les exigences du processeur pour accéder à la mémoire mappée en tant que mémoire de l’appareil sont respectées. Si un appareil spécifique a ses propres exigences spécifiques pour l’accès, cette fonction ne doit pas être utilisée (et au lieu de cela, le développeur doit implémenter ses propres fonctions d’accesseur). Par exemple, cette fonction n’offre aucune garantie quant à la taille des accès à la mémoire générés (sauf si le processeur lui-même applique ces exigences).
Notes
Cette fonction fonctionne sur toutes les versions de Windows, pas seulement sur la dernière version. Vous devez utiliser le dernier WDK pour obtenir la déclaration de fonction à partir de l’en-tête wdm.h. Vous avez également besoin de la bibliothèque (volatileaccessk.lib) du dernier WDK. Toutefois, le pilote résultant s’exécute correctement sur les versions antérieures de Windows.
Exemple
// In this scenario we are setting data on memory mapped
// as "device memory" (for example, memory not backed by RAM).
// On some platforms like ARM64, device memory cannot tolerate
// memory accesses that are not naturally aligned (for example, a 4-byte
// load must be 4-byte aligned). Functions like memset, RtlFillMemory,
// and even RtlFillVolatileMemory may perform unaligned memory accesses
// because it is typically faster to do this.
// To ensure only naturally aligned accesses happen, use RtlFillDeviceMemory.
RtlFillDeviceMemory(DeviceMemoryBuffer, 100, 0xAA);
Configuration requise
Condition requise | Valeur |
---|---|
En-tête | wdm.h (inclure Wdm.h) |
Bibliothèque | volatileaccessk.lib (mode noyau), volatileaccessu.lib (mode utilisateur) |