Função MapViewOfFileExNuma (winbase.h)
Mapeia uma exibição de um mapeamento de arquivo para o espaço de endereço de um processo de chamada e especifica o nó NUMA para a memória física.
Sintaxe
LPVOID MapViewOfFileExNuma(
[in] HANDLE hFileMappingObject,
[in] DWORD dwDesiredAccess,
[in] DWORD dwFileOffsetHigh,
[in] DWORD dwFileOffsetLow,
[in] SIZE_T dwNumberOfBytesToMap,
[in, optional] LPVOID lpBaseAddress,
[in] DWORD nndPreferred
);
Parâmetros
[in] hFileMappingObject
Um identificador para um objeto de mapeamento de arquivo. As funções CreateFileMappingNuma e OpenFileMapping retornam esse identificador.
[in] dwDesiredAccess
O tipo de acesso a um objeto de mapeamento de arquivo, que determina a proteção de página das páginas. Esse parâmetro pode ser um dos seguintes valores ou uma combinação OR bit a bit de vários valores, quando apropriado.
Valor | Significado |
---|---|
|
Uma exibição de cópia na gravação do arquivo é mapeada. O objeto de mapeamento de arquivo deve ter sido criado com proteção PAGE_READONLY, PAGE_EXECUTE_READ, PAGE_WRITECOPY, PAGE_EXECUTE_WRITECOPY, PAGE_READWRITEou PAGE_EXECUTE_READWRITE.
Quando um processo é gravado em uma página de cópia na gravação, o sistema copia a página original para uma nova página que é privada para o processo. A nova página é apoiada pelo arquivo de paginação. A proteção da nova página muda de cópia na gravação para leitura/gravação. Quando o acesso de cópia na gravação é especificado, o custo de confirmação do sistema e do processo executado é para todo o modo de exibição, pois o processo de chamada pode potencialmente gravar em todas as páginas do modo de exibição, tornando todas as páginas privadas. O conteúdo da nova página nunca é gravado novamente no arquivo original e é perdido quando o modo de exibição é não mapeado. |
|
Uma exibição executável do arquivo é mapeada (a memória mapeada pode ser executada como código). O objeto de mapeamento de arquivo deve ter sido criado com PAGE_EXECUTE_READ, PAGE_EXECUTE_WRITECOPYou PAGE_EXECUTE_READWRITE proteção. |
|
A partir do Windows 10, versão 1703, esse sinalizador especifica que o modo de exibição deve ser mapeado usando suporte de página grande. O tamanho da exibição deve ser um múltiplo do tamanho de uma página grande relatada pela função GetLargePageMinimum |
|
Define todos os locais no arquivo mapeado como destinos inválidos para o CFG (Control Flow Guard). Este sinalizador é semelhante a PAGE_TARGETS_INVALID. Use esse sinalizador em combinação com o FILE_MAP_EXECUTEdireito de execução de acesso. Qualquer chamada indireta para locais nessas páginas falhará nas verificações de CFG e o processo será encerrado. O comportamento padrão das páginas executáveis alocadas deve ser marcado como destinos de chamada válidos para CFG. |
Para objetos de mapeamento de arquivo criados com o atributo SEC_IMAGE, o parâmetro dwDesiredAccess não tem efeito e deve ser definido como qualquer valor válido, como FILE_MAP_READ.
Para obter mais informações sobre o acesso a objetos de mapeamento de arquivos, consulte segurança de mapeamento de arquivos e direitos de acesso.
[in] dwFileOffsetHigh
O DWORD de alta ordem do deslocamento de arquivo em que a exibição deve começar.
[in] dwFileOffsetLow
A DWORD de baixa ordem do deslocamento de arquivo em que a exibição deve começar. A combinação dos deslocamentos alto e baixo deve especificar um deslocamento dentro do mapeamento de arquivo. Eles também devem corresponder à granularidade de alocação de memória do sistema. Ou seja, o deslocamento deve ser um múltiplo da granularidade de alocação. Para obter a granularidade de alocação de memória do sistema, use a função GetSystemInfo, que preenche os membros de uma estrutura SYSTEM_INFO.
[in] dwNumberOfBytesToMap
O número de bytes de um mapeamento de arquivo a ser mapeado para uma exibição. Todos os bytes devem estar dentro do tamanho máximo especificado por CreateFileMapping. Se esse parâmetro for 0 (zero), o mapeamento se estenderá do deslocamento especificado até o final do mapeamento de arquivo.
[in, optional] lpBaseAddress
Um ponteiro para o endereço de memória no espaço de endereço do processo de chamada em que o mapeamento começa. Isso deve ser um múltiplo da granularidade de alocação de memória do sistema ou a função falha. Para determinar a granularidade de alocação de memória do sistema, use a função GetSystemInfo. Se não houver espaço de endereço suficiente no endereço especificado, a função falhará.
Se o parâmetro lpBaseAddress for NULL, o sistema operacional escolherá o endereço de mapeamento.
Embora seja possível especificar um endereço seguro agora (não usado pelo sistema operacional), não há garantia de que o endereço permanecerá seguro ao longo do tempo. Portanto, é melhor permitir que o sistema operacional escolha o endereço. Nesse caso, você não armazenaria ponteiros no arquivo mapeado de memória; você armazenaria deslocamentos da base do mapeamento de arquivos para que o mapeamento possa ser usado em qualquer endereço.
[in] nndPreferred
O nó NUMA no qual a memória física deve residir.
Valor | Significado |
---|---|
|
Nenhum nó NUMA é preferencial. Isso é o mesmo que chamar a função MapViewOfFileEx. |
Valor de retorno
Se a função for bem-sucedida, o valor retornado será o endereço inicial do modo de exibição mapeado.
Se a função falhar, o valor retornado será NULL. Para obter informações de erro estendidas, chame a função
Observações
O mapeamento de um arquivo torna a parte especificada do arquivo visível no espaço de endereço do processo de chamada.
Para arquivos maiores que o espaço de endereço, você pode mapear apenas uma pequena parte dos dados do arquivo ao mesmo tempo. Quando o primeiro modo de exibição for concluído, você o desaptoa e mapeie um novo modo de exibição.
Para obter o tamanho de uma exibição, use a função VirtualQueryEx.
O conteúdo inicial das páginas em um objeto de mapeamento de arquivo apoiado pelo arquivo de página é 0 (zero).
Se um endereço de mapeamento sugerido for fornecido, o arquivo será mapeado no endereço especificado (arredondado para baixo até o limite de 64 KB mais próximo) se houver espaço de endereço suficiente no endereço especificado. Se não houver espaço de endereço suficiente, a função falhará.
Normalmente, o endereço sugerido é usado para especificar que um arquivo deve ser mapeado no mesmo endereço em vários processos. Isso requer que a região do espaço de endereço esteja disponível em todos os processos envolvidos. Nenhuma outra alocação de memória pode ocorrer na região usada para mapeamento, incluindo o uso da função VirtualAllocExNuma para reservar memória.
Se o parâmetro lpBaseAddress especificar um deslocamento base, a função terá êxito se a região de memória especificada ainda não estiver em uso pelo processo de chamada. O sistema não garante que a mesma região de memória esteja disponível para o arquivo mapeado de memória em outros processos de 32 bits.
Várias exibições de um arquivo (ou um objeto de mapeamento de arquivo e seu arquivo mapeado) são coerentes se contiverem dados idênticos em um momento especificado. Isso ocorrerá se as exibições de arquivo forem derivadas do mesmo objeto de mapeamento de arquivo. Um processo pode duplicar um identificador de objeto de mapeamento de arquivo em outro processo usando a função
Com uma exceção importante, as exibições de arquivo derivadas de qualquer objeto de mapeamento de arquivo com o mesmo arquivo são coerentes ou idênticas em um momento específico. A coerência é garantida para exibições dentro de um processo e para exibições mapeadas por processos diferentes.
A exceção está relacionada a arquivos remotos. Embora MapViewOfFileExNuma funciona com arquivos remotos, ele não os mantém coerentes. Por exemplo, se dois computadores mapearem um arquivo como gravável e ambos mudarem a mesma página, cada computador verá apenas suas próprias gravações na página. Quando os dados são atualizados no disco, eles não são mesclados.
Não há garantia de que uma exibição mapeada de um arquivo seja coerente com um arquivo sendo acessado pela função readFile ou WriteFile.
Para se proteger contra exceções de EXCEPTION_IN_PAGE_ERROR, use o tratamento de exceção estruturado para proteger qualquer código que grava ou lê de uma exibição mapeada de memória de um arquivo diferente do arquivo de página. Para obter mais informações, consulte leitura e gravação de uma exibição de arquivo.
Ao modificar um arquivo por meio de uma exibição mapeada, o carimbo de data/hora da última modificação pode não ser atualizado automaticamente. Se necessário, o chamador deve usar SetFileTime para definir o carimbo de data/hora.
Para ter um arquivo com permissões executáveis, um aplicativo deve chamar a função
No Windows Server 2012, essa função é compatível com as tecnologias a seguir.
Tecnologia | Suportado |
---|---|
Protocolo SMB (Bloco de Mensagens do Servidor) 3.0 | Sim |
TFO (Failover Transparente) do SMB 3.0 | Sim |
SMB 3.0 com Compartilhamentos de Arquivos de Expansão (SO) | Sim |
Sistema de Arquivos de Volume Compartilhado de Cluster (CsvFS) | Sim |
ReFS (Sistema de Arquivos Resiliente) | Sim |
Requisitos
Requisito | Valor |
---|---|
de cliente com suporte mínimo | Windows Vista [somente aplicativos da área de trabalho] |
servidor com suporte mínimo | Windows Server 2008 [somente aplicativos da área de trabalho] |
da Plataforma de Destino |
Windows |
cabeçalho | winbase.h (inclua Windows.h) |
biblioteca | Kernel32.lib |
de DLL |
Kernel32.dll |
Consulte também
Funções de mapeamento de arquivos
de suporte do NUMA