CopyVolatileMemory, fonction

La fonction CopyVolatileMemory copie le contenu d’un bloc de mémoire source vers un bloc de mémoire de destination.

Important

Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifié avant sa commercialisation. Microsoft n’offre aucune garantie, expresse ou implicite, concernant les informations fournies ici.

Paramètres

Paramètre Destination [out]

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

Paramètre Source [in]

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

Paramètre Length [in]

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

Syntaxe

volatile void* __cdecl
  CopyVolatileMemory (
    _Out_writes_bytes_all_(Length) volatile void* Destination,
    _In_reads_bytes_(Length) volatile const void* Source,
    SIZE_T Length
  );

Notes

Cette API est destinée à fournir le comportement deCopyMemory (c’est-à-dire copier la mémoire d’un emplacement vers un autre) dans les situations où le développeur doit être sûr que l’opération de copie se produit (autrement dit, qu’elle n’est pas soumise à des optimisations du compilateur).

L'API a les propriétés suivantes :

  • L’API n’est pas reconnue comme étant intrinsèque au compilateur : celui-ci n’optimise donc jamais l’appel (entièrement ou en remplaçant l’appel par une séquence d’instructions « équivalente »). Ceci diffère de CopyMemory, qui est soumis à diverses optimisations du compilateur.
  • Quand l’appel retourne, les données ont été copiées de la Source vers la Destination. Ces accès mémoire des fonctions à la Source et à la Destination seront effectués seulement au sein de la fonction (autrement dit, le compilateur ne peut pas déplacer les accès mémoire en dehors de cette fonction).
  • L’API peut effectuer des accès à la mémoire non alignés si la plateforme l’autorise.
  • L’API peut accéder plusieurs fois à des emplacements mémoire dans le cadre de son opération de copie.
  • Elle est similaire à CopyMemory, dans le sens où elle ne prend pas en charge les opérations de copie quand la Source et la Destination se chevauchent.

Remarque

Cette fonction fonctionne sur toutes les versions de Windows, pas seulement sur la dernière. Vous devez utiliser le SDK le plus récent pour obtenir la déclaration de fonction de l’en-tête winbase.h. Vous avez également besoin de la bibliothèque (volatileaccessu.lib) du SDK le plus récent. Cependant, le fichier binaire résultant s’exécutera correctement sur les versions antérieures de Windows.

Exemple

HEADER MyHeader;
UCHAR RawBuffer[100];

// Ensure that the shared memory (which could be constantly changing)
// is copied in to the local MyHeader variable.
// Note that the compiler is allowed to optimize away calls to
// CopyMemory/RtlCopyMemory so those functions are not guaranteed to actually
// make a local copy of data.
//
// CopyVolatileMemory does not handle a source/dest buffer that overlap
// with each other (CopyMemory semantics).
//
// Assume SharedMemory points to virtual memory that is also mapped in an untrusted process.
// Assume that untrusted process is changing the memory contents while you are accessing it.
PVOID SharedMemory;

CopyVolatileMemory(&MyHeader, SharedMemory, sizeof(MyHeader));

if (MyHeader.Size < 100) {
  // Because MyHeader is local and we are guaranteed we actually made
  // a local copy, we can be sure that the "Size" value will not change
  // between the previous bounds check and the below call to RtlFillMemory.
  // If RtlCopyMemory/RtlCopyMemory had been used to copy the data, it is possible
  // that a compiler may optimize away the call to CopyMemory and instead fetch
  // the “size” field of MyHeader directly from untrusted memory two times.
  // The first time it would be fetched for the bounds check, and the second
  // time it is fetched is for the call to FillMemory. It is possible the memory
  // could have changed between the two accesses resulting in the size check
  // being ineffective.

  FillMemory (RawBuffer, MyHeader.Size, 0);
}

Spécifications

Client minimal pris en charge : Windows 11 Insider Preview Build TBD

En-tête : winbase.h (include Winbase.h)

Bibliothèque en mode noyau : volatileaccessk.lib

Bibliothèque en mode utilisateur : volatileaccessu.lib

Voir aussi