Compartilhar via


Macro CopyFromModeAligned (usermode_accessors.h)

A macro CopyFromModeAligned copia com segurança os dados da memória do modo especificado para a memória do kernel, com verificação de alinhamento.

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] 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 qual copiar os dados.

Length

[in] O número de bytes a serem copiados.

Mode

[in] O modo de processador que determina como o acesso à memória é executado. O modo pode ser um dos seguintes valores.

Value Meaning
KernelMode A origem aponta para a memória do modo kernel. A macro executa uma cópia de memória direta com memory_order_relaxed semântica.
UserMode A origem aponta para a memória do modo de usuário. A macro gerará uma exceção se a origem não apontar para a memória do modo de usuário; caso contrário, ele executa uma cópia do endereço especificado com memory_order_relaxed semântica.

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 kernel ou do modo de usuário para a memória do kernel, com o mecanismo de cópia determinado pelo modo de processador especificado e pela verificação de alinhamento. Isso permite operações de memória flexíveis que podem se adaptar a diferentes contextos de execução, garantindo os requisitos de alinhamento adequados.

Quando o modo é KernelMode:

  • 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 função (por exemplo, o compilador não pode mover acessos de memória para fora dessa função).

  • 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 válido para o modo especificado, 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 ReadStructFromModeAligned 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 função 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

Consulte também

CopyFromMode

CopyFromUser

CopyFromUserAligned

CopyFromModeNonTemporal

CopyToMode