Compartir a través de


Función RtlFillVolatileMemory (wdm.h)

La función RtlFillVolatileMemory proporciona el comportamiento RtlFillMemory (por ejemplo, al establecer el contenido de un búfer) en situaciones en las que el desarrollador debe estar seguro de que se produce la operación de configuración (por ejemplo, no está sujeta a optimizaciones del compilador).

Sintaxis

volatile void * RtlFillVolatileMemory(
  [out] volatile void *Destination,
  [in]  size_t        Length,
  [in]  int           Fill
);

Parámetros

[out] Destination

Puntero a la dirección inicial del bloque de memoria que se va a rellenar.

[in] Length

Tamaño del bloque de memoria que se va a rellenar, en bytes. Este valor debe ser menor que el tamaño del búfer de destino .

[in] Fill

Valor de byte con el que se va a rellenar el bloque de memoria.

Valor devuelto

Devuelve el valor de Destination.

Comentarios

  • La función no se reconoce como intrínseca del compilador, por lo que el compilador nunca optimizará la llamada (ya sea completamente o reemplazará la llamada por una secuencia equivalente de instrucciones). Esto difiere de RtlFillMemory , que está sujeto a diversas optimizaciones del compilador.

  • Cuando se devuelve la llamada, el búfer se ha sobrescrito con el valor deseado. Esta función funciona con accesos a la memoria al destino solo se realizará dentro de la función (por ejemplo, el compilador no puede mover los accesos de memoria fuera de esta función).

  • La función puede realizar accesos a memoria no asignadas si la plataforma lo permite.

  • La función puede acceder a ubicaciones de memoria más de una vez como parte de su operación.

Nota

Esta función funciona en todas las versiones de Windows, no solo en la versión más reciente. Debe consumir el WDK más reciente para obtener la declaración de función del encabezado wdm.h. También necesita la biblioteca (volatileaccessk.lib) del WDK más reciente. Sin embargo, el controlador resultante se ejecutará correctamente en versiones anteriores de Windows.

Ejemplo

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);

Requisitos

Requisito Valor
Header wdm.h (incluya Wdm.h)
Library volatileaccessk.lib (modo kernel), volatileaccessu.lib (modo de usuario)

Consulte también

RtlFillMemory