Compartir a través de


Función RtlCopyDeviceMemory (wdm.h)

La función RtlCopyDeviceMemory proporciona el comportamiento rtlCopyVolatileMemory (por ejemplo, copiar memoria de una ubicación a otra sin interferencias de las optimizaciones del compilador) en situaciones en las que el desarrollador debe asegurarse además de que los errores de alineación no se generarán al acceder a la memoria del dispositivo.

Sintaxis

volatile void * RtlCopyDeviceMemory(
  [out] volatile void       *Destination,
  [in]  volatile const void *Source,
  [in]  size_t              Length
);

Parámetros

[out] Destination

Puntero a la dirección inicial del destino del bloque copiado.

[in] Source

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

[in] Length

Tamaño del bloque de memoria que se va a copiar, en bytes.

Valor devuelto

Devuelve el valor de Destination.

Comentarios

La función RtlCopyDeviceMemory tiene las siguientes propiedades:

  • 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 de instrucciones equivalente). Esto difiere de RtlCopyMemory , que está sujeto a diversas optimizaciones del compilador.

  • Cuando se devuelve la llamada, los datos se han copiado de Origen a Destino. Esta función solo tendrá acceso a la memoria de origen y destino 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 asignada solo si la CPU admite accesos a memoria no asignada en la memoria del dispositivo. Si la CPU no admite accesos a memoria de dispositivo no asignadas, solo se realizarán los accesos alineados.

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

  • No admite operaciones de copia cuando el origen y el destino se superponen entre sí. Si se proporcionan búferes superpuestos, se produce un error rápido con el código de error FAST_FAIL_INVALID_ARG.

Nota

Esta función solo garantiza que se respeten los requisitos de la CPU para acceder a la memoria asignada como memoria del dispositivo. Si un dispositivo específico tiene sus propios requisitos específicos para acceder a ella, esta función no debe usarse (y, en su lugar, el desarrollador debe implementar sus propias funciones de descriptor de acceso). Por ejemplo, esta función no garantiza el tamaño de los accesos a memoria generados (a menos que la PROPIA CPU aplique estos requisitos).

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

Requisitos

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

Consulte también

RtlCopyMemory

RtlCopyVolatileMemory