VirtualCopy

Windows Mobile Not SupportedWindows Embedded CE Supported

9/8/2008

Essa função mapeia dinamicamente um endereço virtual para um físico endereço criando uma nova página-entrada tabela. Encerrar o mapeamento por chamado VirtualFree.

Syntax

BOOL VirtualCopy(
  LPVOID lpvDest,
  LPVOID lpvSrc,
  DWORD cbSize,
  DWORD fdwProtect
);

Parameters

  • lpvDest
    [no] Ponteiro para a memória destino que deve ser reservado.
  • lpvSrc
    [no] Ponteiro para memória confirmada.
  • cbSize
    [no] Tamanho, em bytes, da região. As páginas alocadas incluem todas as páginas que contém 1 ou mais bytes no intervalo de lpAddress Para lpAddress sinal de mais cbSize. Isso significa que um 2-intervalo byte espalhados um limite página faz com que ambas as páginas a serem incluídos na região alocada.
  • fdwProtect
    [no] Tipo de proteção acessar. Se as páginas estão sendo confirmadas, qualquer um de um número de sinalizadores pode ser especificada, juntamente com a PAGE_GUARD e PAGE_NOCACHE, sinalizadores modificador de proteção. A seguinte tabela mostra os valores possíveis.

    Valor Descrição

    PAGE_EXECUTE

    Permite executar acessar à região confirmada de páginas. Tentar ler ou gravação para a região confirmada causa um violação de acesso.

    PAGE_EXECUTE_READ

    Ler e executar permite acessar à região confirmada de páginas. Tentar gravar a região confirmada faz com que um violação de acesso.

    PAGE_EXECUTE_READWRITE

    Permite executar, ler e acesso de gravação para a região confirmada de páginas.

    PAGE_GUARD

    Páginas na região se tornam páginas de proteção. Qualquer tentativa ler de ou Gravação para uma página de proteção faz com que o OS para aumentar a exceção STATUS_GUARD_PAGE e desativar o status página de proteção. Proteção assim páginas trabalhar como um alarme acessar única.

    O sinalizador PAGE_GUARD é um modificador de proteção página. Um aplicativo usa-lo com um dos outros página proteção sinalizadores, com uma exceção: Ele não pode ser usado com PAGE_NOACCESS.

    Quando uma tentativa acessar faz com que o OS para desativar Proteção página status, o subjacente proteção página terá sobre.

    Se ocorrer uma exceção página de guarda durante um serviço sistema, a serviço geralmente retorna um indicador status falha.

    PAGE_NOACCESS

    Desativa todos os acessar à região confirmada de páginas. Tentar ler a partir, Gravação para ou executar na região confirmada faz com que um chamado exceção violação de acesso uma falha de proteção geral (GP).

    PAGE_NOCACHE

    Permite que nenhum cache das regiões confirmadas de páginas. Os atributos hardware para o físico memória deve ser especificada como Não armazenar em cache. Ele é útil para drivers dispositivo; Quando, de exemplo, mapeamento um vídeo reserva quadro com nenhum cache. Este sinalizador é um modificador de proteção página e é válido somente quando usada com um das proteções página Other Than PAGE_NOACCESS.

    PAGE_READONLY

    Ler permite acessar à região confirmada de páginas. Tentar gravar a região confirmada faz com que um violação de acesso. Se o sistema diferencia acessar Read-only e acessar, tentar executar codificar executar na região confirmada causa um violação de acesso.

    PAGE_READWRITE

    Permite que tanto ler e acesso de gravação para a região confirmada de páginas.

    PAGE_PHYSICAL

    Usado para mapa (n.); mapear (v.) Um físico região memória. Ao usar esse sinalizador, divida o físico endereço, that is, lpvSrc, por 256. Memória mapeada com PAGE_PHYSICAL não é liberada até que o dispositivo for reinicializado. Chamando a função VirtualFree não livre este físico mapeado memória. Este sinalizador é usado com buffers hardware dedicados, portanto, ele não é possível liberar depois que está sendo mapeada.

Return Value

TRUE indica êxito FALSE indica falha. Para informações de erro estendidas get, chamar GetLastError.

Remarks

No CE 6.0 e posterior, VirtualCopy é uma função somente kernel - modo -. Para informações sobre outro kernel-modo apenas funções, consulte Kernel Mode APIs.

Para CE 6.0, um chamar para VirtualCopy falhar se ele cruza uma 32-limite seção MB. De exemplo, se você alocar 16 MB e ele cruza um limite MB 32, você deve fazer dois VirtualCopy Chamadas.

Chamando VirtualCopy De trabalho modo usuário somente se ele for chamado de um usuário-driver modo, onde seu físico intervalo do endereço é especificado no Registro. Para codificar porta que chama O VirtualAlloc Ou VirtualCopy, considere siga um do seguinte, que está na ordem de preferência in terms of de segurança e robustez:

  • Verifique a codificar que chama O VirtualAlloc Ou VirtualCopy Um driver.
  • Verifique a codificar que chama O VirtualAlloc Ou VirtualCopy Em um DLL e usar LoadKernelLibrary para carregá-lo em kernel.
  • Criar um fictício driver modo kernel que implementa IOCTL_DO_VIRTUAL_COPY para chamar VirtualCopy.

Se você desejar para chamar VirtualCopy Para copiar um físico ou virtual reserva e que reserva não está alinhado páginas, a operação copia mais dados que você especificado. Se a iniciar da reserva não for página-alinhado, a operação também copiará dados antes de iniciar da reserva especificada, a partir início a página. Se a extremidade da reserva não é alinhado-página, a operação copia dados depois do fim da reserva especificada, terminando no seguinte página limite.

Isso é um emitir de segurança se a reserva copiada nunca é passada para modo usuário. O aplicativo modo usuário pode acessar os dados ao redor que não faz parte da reserva especificada. Para proteger os dados ao redor, use uma reserva que está Page-aligned e um múltiplo par de páginas no tamanho. Se não for possível, passando os dados para modo de usuário coloca-lo ao risco.

O deslocamento página virtual e físico deslocamento página deve ser a mesma como uma página virtual só pode ser mapeada para físico uma página. Por exemplo, considere a possibilidade de seguinte inválido chamar a VirtualCopy:

VirtualCopy (0x50000, 0xC00DA800, 0x1000, . . .);

O Virtual para físico mapeamento solicitado são da seguinte maneira:

(0x50000, 0x50800) para (0xC0DA800, 0xC0DB000)

(0x50800, 0x51000) para (0xC0DB000, 0xC0DB800)

No exemplo acima, a página virtual (0x50000, 0x51000) deve ser mapeada para dois físico diferentes páginas, 0xC00DA000 e 0xC00DB000, mas memória virtual não suporte este.

O seguinte mostra exemplo de código como VirtualCopy é chamado para mapa (n.); mapear (v.) de 128-região KB no físico endereço 0x64000000.

VirtualCopy(pvDest, (void *) (0x64000000/256), 128*1024, PAGE_READWRITE | PAGE_PHYSICAL | PAGE_NOCACHE);

Drivers ou aplicativos que executar no usuário-modo deve usar o User Mode Driver Framework para acessar físico memória.

Essa função garante que o OS mapeia um endereço virtual mapeado para o físico específico endereço do registradores ou reserva quadro que ele precisa ler ou gravação. Antes de chamadas segmento VirtualCopy, primeiro ele deve obter um endereço virtual pelo chamado VirtualAlloc. O VirtualAlloc e VirtualCopy deve ser chamado no início de cada segmento driver de dispositivo ou aplicativo que precisa acessar registradores periféricos.

Para codificar exemplos, consulte a codificar driver de dispositivo exemplo fornecido com Platform Builder, localizado nos diretórios %_WINCEROOT%\Platform\%BSP%\Drivers e %_WINCEROOT%\Public\Common\OAK\Drivers.

O endereço de destino definido pelo lpvDest parâmetro deve ser um intervalo do endereço que foi reservado por um chamar para O VirtualAlloc. O VirtualAlloc, com o conjunto MEM_RESERVE e PAGE_NOACCESS sinalizadores e um tamanho maior que ou igual a 2 MB, está alocado fora espaço de memória virtual processo. Caso contrário, ele é alocado no espaço de memória virtual processos.

Requirements

Header pkfuncs.h
Library coredll.lib
Windows Embedded CE Windows CE 2.10 and later

See Also

Reference

Kernel Functions

Other Resources

CEL_VIRTUAL_COPY
CeLogData
HiveRAMRegion
MmMapIoSpace
NdisFlushBuffer
Privileged APIs
VirtualAlloc
VirtualFree