Función FillVolatileMemory
La función FillVolatileMemory rellena un bloque de memoria con el valor de relleno especificado.
Importante
Parte de la información hace referencia a un producto de versión preliminar que puede sufrir importantes modificaciones antes de que se publique la versión comercial. Microsoft no proporciona ninguna garantía, expresa o implícita, con respecto a la información proporcionada aquí.
Parámetros
Destino del parámetro [out]
Puntero a la dirección inicial del bloque de memoria que se va a rellenar.
Longitud del parámetro [in]
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.
Relleno de parámetros [in]
Valor de byte con el que se va a rellenar el bloque de memoria.
Sintaxis
volatile void*
FillVolatileMemory (
_Out_writes_bytes_all_(Length) volatile void* Destination,
SIZE_T Length,
INT Fill
);
Comentarios
Esta API existe para proporcionar el comportamiento FillMemory (es decir, establecer el contenido de un búfer) en situaciones en las que el desarrollador necesita estar seguro de que la operación de configuración se produce (es decir, no está sujeta a las optimizaciones del compilador). La API tiene las siguientes propiedades:
- La API no se reconoce como intrínseca del compilador, por lo que este nunca optimizará la llamada (ya sea por completo o reemplazándola por una secuencia "equivalente" de instrucciones). Esto difiere de FillMemory, que está sujeto a una variedad de optimizaciones del compilador.
- Cuando se devuelve la llamada, el búfer se ha sobrescrito con el valor deseado. Los accesos a la memoria de la función Destino sólo se realizarán dentro de la función (es decir, el compilador no puede desplazar los accesos a la memoria fuera de esta función).
- La API puede realizar accesos a memoria no asignadas si la plataforma lo permite.
- La API puede acceder a las 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 más reciente. Es necesario consumir el SDK más reciente para obtener la declaración de función del encabezado winbase.h
. También se necesita la biblioteca (volatileaccessu.lib
) del SDK más reciente. Sin embargo, el binario 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 FillMemory because
// if the compiler realizes that "SensitiveData" is not
// referenced again the compiler can remove the call to FillMemory.
// Instead we can call SecureZeroMemory2, ZeroVolatileMemory, or FillVolatileMemory
// (the former two are convenience wrappers around the latter). These
// calls will not be optimized away by the compiler.
// Note that SecureZeroMemory2 performs better than the old
// SecureZeroMemory API.
FillVolatileMemory(&SensitiveData, sizeof(SensitiveData), 0);
Requisitos
Cliente mínimo admitido: compilación de versión preliminar de Windows 11 Insider
Encabezado: winbase.h (incluir Winbase.h)
Biblioteca en modo kernel: volatileaccessk.lib
Biblioteca en modo de usuario: volatileaccessu.lib