Compartilhar via


VirtualAlloc

Windows Mobile SupportedWindows Embedded CE Supported

9/8/2008

Essa função reserva ou confirma uma região de páginas a espaço de endereço virtual da processo de chamada.

Memória alocada por O VirtualAlloc é inicializada para zero.

Syntax

LPVOID VirtualAlloc(
  LPVOID lpAddress,
  DWORD dwSize,
  DWORD flAllocationType,
  DWORD flProtect
);

Parameters

  • lpAddress
    [no] Ponteiro longo para o endereço inicial especificado da região a ser alocada.

    Se a memória está sendo reservada, o endereço especificado é arredondado Down to o próximo 64-limite KB.

    Se a memória é reservada e está sendo confirmada, o endereço é arredondado Down to o próximo limite página.

    Para determinar o tamanho de uma página no computador a hospedar, use a função GetSystemInfo.

    Se este parâmetro é NULL, o sistema determina onde alocar a região.

  • dwSize
    [no] Especifica o tamanho, em bytes, da região. Ele é um erro para definir esse parâmetro como 0.

    Se a pasta lpAddress parâmetro é NULL, esse valor é arredondado up to o próximo limite página.

    Caso contrário, as páginas alocadas incluem todas as páginas que contêm um ou mais bytes no intervalo de lpAddress Para lpAddress sinal de mais dwSize. 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.

  • flAllocationType
    [no] Especifica o tipo de alocação.

    A seguinte tabela mostra os sinalizadores você pode especificar para esse parâmetro em qualquer combinação.

    Valor Descrição

    MEM_COMMIT

    Aloca físico armazenamento em memória o arquivo de paginação no disco para a região especificada de páginas ou.

    Uma tentativa confirmação uma página confirmada não causar a função falha. Isso significa que um intervalo de páginas confirmadas ou decommitted pode ser confirmado sem sendo preocupado sobre uma falha.

    MEM_RESERVE

    Reserva um intervalo da espaço de endereço virtual do processo sem alocando físico armazenamento.

    O intervalo reservado não pode ser usado por qualquer outras operações alocação, como o malloc e funções LocalAlloc, até que ela é lançada.

    Páginas reservadas podem ser confirmadas em chamadas subseqüentes para o O VirtualAlloc função.

    MEM_RESET

    Não suportado.

    MEM_TOP_DOWN

    Aloca memória no endereço mais alto possível.

    Este sinalizador é ignorado em Windows Embedded CE.

  • flProtect
    [no] Especifica o tipo de proteção acessar.

    Se as páginas estão sendo confirmadas, você pode especificar qualquer um do seguinte sinalizadores, along with os sinalizadores modificador de proteção PAGE_GUARD e PAGE_NOCACHE.

    Valor Descrição

    PAGE_EXECUTE

    Permite executar acessar à região confirmada de páginas.

    PAGE_EXECUTE_READ

    Ler e executar permite acessar à região confirmada de páginas.

    Uma tentativa para gravar a região confirmada resulta em 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.

    Tentar ler de ou Gravação para uma página de proteção faz com que o sistema para aumentar uma exceção STATUS_ACCESS_VIOLATION e desativar o status página de proteção.

    Proteção, portanto, páginas trabalhar como um alarme acessar one-shot.

    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 leva o sistema 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 nos resultados da região confirmada em uma exceção violação de acesso, chamado 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.

    Isso não é recomendável para uso geral. Ele é útil para drivers dispositivo; de exemplo, mapeamento um vídeo reserva quadro com nenhum cache.

    Este sinalizador é um modificador de proteção página e é somente válido quando usado com uma proteção página Other Than PAGE_NOACCESS.

    PAGE_READONLY

    Ler permite acessar à região confirmada de páginas.

    Uma tentativa para gravar a região confirmada resulta em um violação de acesso.

    Se o sistema diferencia acessar Read-only e acessar executar, tentar executar codificar nos resultados da região confirmada em um violação de acesso.

    PAGE_READWRITE

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

Return Value

O endereço básico da região alocada de páginas indica sucesso. NULL Indica falha. Para informações de erro estendidas get, chamar GetLastError.

Remarks

Para todas as plataformas

Depois de reserva e confirmar uma página em um processo cliente com o seguinte codificar:

LPBYTE p = (LPBYTE) VirtualAllocEx(hClientProc, NULL, 0x1000, MEM_COMMIT, PAGE_READWRITE);

Você simplesmente não é possível gravar *p Com o seguinte codificar:

*p = whatever;

Você não pode gravar *p diretamente como o endereço no processo de cliente é Virtual memória não diretamente é acessível. Para leitura/gravação para a memória apontada pelo ponteiro retornado, use ReadProcessMemory e WriteProcessMemory. Por exemplo:

WriteProcessMemory(hClientProc, p, &whatever, 1, &cbReturned);

O seguinte flProtect Os sinalizadores não são com suporte:

  • PAGE_WRITECOPY
  • PAGE_EXECUTE_WRITECOPY

O VirtualAlloc Pode executar o seguinte operações:

  • Confirmar uma região de páginas reservado por um chamar anterior para o O VirtualAlloc função.
  • Reservar uma região de livre páginas.
  • Reservar e confirmação uma região de livre páginas.

Você pode usar O VirtualAlloc a reserva um bloco de páginas e, em seguida, verifique chamadas adicionais para O VirtualAlloc a confirmação individual páginas a partir de bloco reservado. Isso permite que um processo para reserva um intervalo de seu espaço de endereço virtual sem consumir físico armazenamento até que ela for necessária.

Cada página na espaço de endereço virtual do processo está em um dos três estados:

  • Livre, em que a página não é confirmada ou reservado e não está acessível para o processo. O VirtualAlloc Pode reserva, ou simultaneamente reserva e confirmação, um livre página.
  • Reservado, no qual o intervalo de endereços não pode ser usado por outras funções alocação, mas a página não está acessível e tem não físico armazenamento associado com ele. O VirtualAlloc Pode confirmação uma página reservada, mas ele não é possível reserva-um tempo segundo. A função VirtualFree pode versão uma página reservada, tornando uma livre página.
  • Confirmada, no qual físico armazenamento é alocado para a página, e acessar é controlado por um codificar de proteção.
    O sistema é inicializado e carrega cada página confirmada em físico memória somente no primeiro tentar ler ou gravar essa página. Quando o processo termina, o sistema libera o armazenamento de páginas confirmadas.
    O VirtualAlloc Pode confirmação uma página já confirmada. Isso significa que você pode confirmação um intervalo de páginas, regardless of se eles foram confirmados e a função não irá falhar.
    VirtualFree Pode decommit uma página confirmada, liberando armazenamento que a página, ou pode decommit simultaneamente e versão uma página confirmada.

Se a pasta lpAddress parâmetro não for NULL, a função usa o lpAddress e dwSize Parâmetros para calcular a região de páginas a ser alocado.

O atual estado do todo o intervalo de páginas deve ser compatível com o tipo de alocação especificada pelo flAllocationType parâmetro. Caso contrário, o função falhar e não páginas são alocadas. Esse requisito compatibilidade não impede confirmar uma página já confirmada.

Antes Windows Embedded CE 6.0, se você chamar O VirtualAlloc Com dwSize > = 2 MB, flAllocationType Definir como MEM_RESERVE, e flProtect Definir como PAGE_NOACCESS, ele automaticamente reserva memória na região de memória compartilhada. Isso preserva por-processo memória virtual.

Security Note:
A memória em uma região memória compartilhada é legível e gravável por outros processos no sistema.Você não deve confidencial armazenar informações nessas regiões e deve validar os dados ler out of-los.

Para Windows incorporado CE

Desde CE 6.0, regardless of o valor de dwSize, kernel sempre tenta alocar VM no espaço processo usuário. Além disso, aplicativos usuário não é possível chamar O VirtualAlloc** Com heap compartilhada intervalo do endereço (0x70000000-0x7FFFFFFF) como isso é somente leitura para aplicativos usuário e leitura/gravação para segmentos modo kernel. **

Para Mobile Windows

Para Windows Mobile Version 5.0, não é possível confirmação 32 MB ou mais em um tempo. Você pode reserva mais do que 32 MB em um tempo se fdwProtect=PAGE_NOACCESS e lpAddress=0. Além disso, você não poderá memória confirmação entre um limite MB 32. De exemplo, se você reserva 16 MB e acontece com cruzado um limite MB 32, você precisará fazer dois O VirtualAlloc** Chama a confirmação de memória. **

Requirements

Header winbase.h
Library coredll.lib
Windows Embedded CE Windows CE 1.0 and later
Windows Mobile Windows Mobile Version 5.0 and later

See Also

Reference

Memory Management Functions
GetSystemInfo
LocalAlloc
VirtualFree
VirtualProtect
VirtualQuery