Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
La macro CopyFromModeAligned copia de forma segura los datos de la memoria del modo especificado en la memoria del kernel, con comprobación de alineación.
Syntax
#define CopyFromModeAligned(Destination, Source, Length, Mode, Alignment) \
do { \
if ((Mode) != KernelMode) { \
ExProbeAlignment((Source), (Length), (Alignment)); \
} \
CopyFromMode((Destination), (Source), (Length), (Mode)); \
} while (0)
Parameters
Destination
[out] Puntero a la ubicación de memoria del kernel donde se copiarán los datos.
Source
[in] Puntero a la ubicación de memoria desde la que se van a copiar los datos.
Length
[in] Número de bytes que se van a copiar.
Mode
[in] Modo de procesador que determina cómo se realiza el acceso a la memoria. El modo puede ser uno de los siguientes valores.
| Value | Meaning |
|---|---|
| KernelMode | El origen apunta a la memoria en modo kernel. La macro realiza una copia de memoria directa con memory_order_relaxed semántica. |
| UserMode | El origen apunta a la memoria en modo de usuario. La macro genera una excepción si Source no apunta a la memoria en modo de usuario; de lo contrario, realiza una copia de la dirección especificada con memory_order_relaxed semántica. |
Alignment
[in] Límite de alineación que debe cumplir el puntero de origen.
Valor devuelto
None
Remarks
Esta macro proporciona una manera segura de copiar datos de memoria del kernel o del modo de usuario a la memoria kernel, con el mecanismo de copia determinado por el modo de procesador y la comprobación de alineación especificados. Esto permite operaciones de memoria flexibles que se pueden adaptar a diferentes contextos de ejecución, a la vez que garantiza los requisitos de alineación adecuados.
Cuando el modo es KernelMode:
La macro realiza una copia volátil mediante memory_order_relaxed semántica.
La macro no se reconoce como intrínseca del compilador, por lo que el compilador nunca optimizará la llamada (por completo o reemplazará la llamada por una secuencia equivalente de instrucciones).
Cuando se devuelve la llamada, los datos se han copiado de Origen a Destino. Los accesos a memoria de esta macro al origen y destino solo se realizarán dentro de la función (por ejemplo, el compilador no puede mover los accesos de memoria fuera de esta función).
La macro puede tener acceso a ubicaciones de memoria más de una vez como parte de su operación de copia.
La macro no admite operaciones de copia cuando el origen y el destino se superponen entre sí.
La macro genera una excepción estructurada si se produce un error en la operación de copia, como cuando la dirección de origen no es válida para el modo especificado, no se alinea correctamente según el parámetro Alignment o no es accesible.
Si va a copiar desde una estructura de tamaño fijo, debe usar ReadStructFromModeAligned en su lugar para evitar el riesgo de pasar el tamaño incorrecto.
El compilador nunca optimizará esta macro ni creará accesos adicionales a esta ubicación de memoria antes de llamar a la macro o después de que se devuelva la macro (a menos que el código fuente realice explícitamente estos accesos).
Esta macro funciona en todas las versiones de Windows, no solo en la más reciente. Debe consumir el WDK más reciente para obtener la declaración de función del encabezado usermode_accessors.h . También necesita la biblioteca (umaccess.lib) del WDK más reciente. Sin embargo, el controlador resultante se ejecutará correctamente en versiones anteriores de Windows.
Requirements
| Requirement | Value |
|---|---|
| Cliente mínimo compatible | Ver comentarios |
| Header | usermode_accessors.h |
| Library | umaccess.lib |
| IRQL | Menor o igual que APC_LEVEL |