Fonction RtlCopyDeviceMemory (wdm.h)

La fonction RtlCopyDeviceMemory fournit le comportement RtlCopyVolatileMemory (par exemple, la copie de la mémoire d’un emplacement vers un autre 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 * RtlCopyDeviceMemory(
  [out] volatile void       *Destination,
  [in]  volatile const void *Source,
  [in]  size_t              Length
);

Paramètres

[out] Destination

Pointeur vers l’adresse de départ de la destination du bloc copié.

[in] Source

Pointeur vers l’adresse de départ du bloc de mémoire à copier.

[in] Length

Taille du bloc de mémoire à copier, en octets.

Valeur retournée

Retourne la valeur de Destination.

Remarques

La fonction RtlCopyDeviceMemory possède les propriétés suivantes :

  • La fonction n’étant pas reconnue en tant qu’intrinsèque du compilateur, le compilateur n’optimisera jamais l’appel (soit entièrement, ni remplacer l’appel par une séquence d’instructions équivalente). Cela diffère de RtlCopyMemory qui est soumis à diverses optimisations du compilateur.

  • Lorsque l’appel est retourné, les données ont été copiées de la source vers la destination. Cette fonction permet d’accéder à la mémoire à la source et à la destination uniquement au sein de la fonction (par exemple, le compilateur ne peut pas déplacer les accès à la mémoire en dehors 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 opération de copie.

  • Ne prend pas en charge les opérations de copie lorsque source et destination se chevauchent. Si des mémoires tampons qui se chevauchent sont fournies, échoue rapidement avec le code d’erreur FAST_FAIL_INVALID_ARG.

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

UCHAR* CopyBuffer;

// In this scenario we are copying data from 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 memcpy, RtlCopyMemory,
// and even RtlCopyVolatileMemory may perform unaligned memory accesses
// because it is typically faster to do this.
// To ensure only naturally aligned accesses happen, use RtlCopyDeviceMemory.

RtlCopyDeviceMemory(CopyBuffer, DeviceMemoryBuffer, 100);

Configuration requise

Condition requise Valeur
En-tête wdm.h (inclure Wdm.h)
Bibliothèque volatileaccessk.lib (mode noyau), volatileaccessu.lib (mode utilisateur)

Voir aussi

RtlCopyMemory

RtlCopyVolatileMemory