Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A macro CopyFromUserAligned copia com segurança dados da memória do modo de usuário para a memória do kernel, com verificação de alinhamento.
Syntax
#define CopyFromUserAligned(Destination, Source, Length, Alignment) \
do { \
ExProbeAlignment((Source), (Length), (Alignment)); \
CopyFromUser((Destination), (Source), (Length)); \
} while (0)
Parameters
Destination
[out] Um ponteiro para o local de memória do kernel em que os dados serão copiados.
Source
[in] Um ponteiro para o local de memória do modo de usuário do qual copiar os dados.
Length
[in] O número de bytes a serem copiados.
Alignment
[in] O limite de alinhamento que o ponteiro de origem deve satisfazer.
Valor de retorno
None
Remarks
Essa macro fornece uma maneira segura de copiar dados da memória do modo de usuário para a memória do kernel com verificação de alinhamento. Isso permite operações de memória flexíveis quando o código do modo kernel precisa recuperar dados de buffers do modo de usuário com requisitos de alinhamento específicos.
A macro tem as seguintes propriedades:
A macro executa uma cópia volátil usando memory_order_relaxed semântica.
A macro não é reconhecida como um compilador intrínseco, portanto, o compilador nunca otimizará a chamada (totalmente ou substituirá a chamada por uma sequência equivalente de instruções).
Quando a chamada é retornada, os dados foram copiados de Origem para Destino. Os acessos de memória dessa macro à origem e ao destino só serão executados dentro da macro (por exemplo, o compilador não pode mover acessos de memória para fora dessa macro).
A macro pode acessar locais de memória mais de uma vez como parte de sua operação de cópia.
A macro não dá suporte a operações de cópia quando a origem e o destino se sobrepõem.
A macro gerará uma exceção estruturada se a operação de cópia falhar, como quando o endereço de origem não for um endereço válido no modo de usuário, não estiver corretamente alinhado de acordo com o parâmetro Alignment ou estiver inacessível.
Se você estiver copiando de uma estrutura de tamanho fixo, deverá usar ReadStructFromUserAligned para evitar o risco de passar o tamanho errado.
Essa macro nunca será otimizada pelo compilador, nem o compilador criará acessos adicionais a esse local de memória antes que a macro seja chamada ou depois que a macro retornar (a menos que o código-fonte execute explicitamente esses acessos).
Essa macro funciona em todas as versões do Windows, não apenas nas mais recentes. Você precisa consumir o WDK mais recente para obter a declaração de macro do cabeçalho usermode_accessors.h . Você também precisa da biblioteca (umaccess.lib) do WDK mais recente. No entanto, o driver resultante será executado bem em versões mais antigas do Windows.
Requirements
| Requirement | Value |
|---|---|
| Cliente mínimo suportado | Ver Comentários |
| Header | usermode_accessors.h |
| Library | umaccess.lib |
| IRQL | Menor ou igual a APC_LEVEL |