Partager via


Fonction RtlFillVolatileMemory (wdm.h)

La fonction RtlFillVolatileMemory fournit le comportement RtlFillMemory (par exemple, la définition du contenu d’une mémoire tampon) dans les situations où le développeur doit s’assurer que l’opération de paramètre se produit (par exemple, n’est pas soumise à des optimisations du compilateur).

Syntaxe

volatile void * RtlFillVolatileMemory(
  [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.

  • Lorsque l’appel est retourné, 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és si la plateforme le permet.

  • La fonction peut accéder aux emplacements de mémoire plusieurs fois dans le cadre de son fonctionnement.

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 SensitiveData[100];

// Imagine we temporarily store some sensitive cryptographic
// material in a buffer.

StoreCryptographicKey(&SensitiveData);

DoCryptographicOperation(&SensitiveData);

// Now that we are done using the sensitive data we want to
// erase it from the stack. We cannot call RtlFillMemory because
// if the compiler realizes that "SensitiveData" is not
// referenced again the compiler can remove the call to RtlFillMemory.
// Instead we can call RtlSecureZeroMemory2, RtlZeroVolatileMemory, or RtlFillVolatileMemory
// (the former two are convenience wrappers around the latter). These
// calls will not be optimized away by the compiler.
// Note that RtlSecureZeroMemory2 performs better than
// RtlSecureZeroMemory function.

RtlFillVolatileMemory(&SensitiveData, sizeof(SensitiveData), 0);

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

RtlFillMemory