> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# XMemAllocatePhysicalPages

> XMemAllocatePhysicalPages aloca páginas físicas contíguas para um processo de destino no GDK do XBOX, com sinalizadores de tamanho de página e capacidade de cache.

# XMemAllocatePhysicalPages

Aloca páginas físicas contíguas para o processo de destino especificado.

## Sintaxe

```cpp theme={null}
BOOL XMemAllocatePhysicalPages(  
         ULONGLONG XMemFlags,  
         PULONG_PTR NumberOfPages,  
         PULONG_PTR PageArray  
)  
```

### Parâmetros

*XMemFlags*   \_In\_<br />Tipo: ULONGLONG

Especifica os requisitos das páginas alocadas.

| Tipo | Detalhes |
| - | - |
| **XMEM\_2MB\_CLUSTERS**<br />0x20000000 | Exige que as páginas alocadas sejam retornadas em grupos de 32 páginas contíguas (2MB).  Cada cluster de 32 páginas começará em um alinhamento físico de 2MB.  NumberOfPages deve ser um múltiplo de 32 quando esse sinalizador for usado. |

Em dispositivos Anaconda e dispositivos Dante emulando Anaconda, ao usar o modo de memória de título Avançado, os parâmetros a seguir também podem ser aplicados.  Esses parâmetros são ignorados em todos os outros casos.

| Valor | Significado |
| - | - |
| **XMEM\_STD\_BW\_REQ** ou <br />**XMEM\_STANDARD\_BANDWIDTH\_REQUIRED**<br />0x00000080 | Especifica que as alocações devem ser atendidas usando memória de largura de banda padrão. |
| **XMEM\_STD\_BW\_PREF** ou <br />**XMEM\_STANDARD\_BANDWIDTH\_PREFERRED**<br />0x00000180 | Especifica que as alocações devem preferir memória de largura de banda padrão e só usar memória de largura de banda ideal para GPU se a memória de largura de banda padrão estiver esgotada. |
| **XMEM\_GPU\_OPTBW\_REQ** ou <br />**XMEM\_GPU\_OPTIMAL\_BANDWIDTH\_REQUIRED**<br />0x00000280 | Especifica que as alocações devem ser atendidas usando memória de largura de banda ideal para GPU. |
| **XMEM\_GPU\_OPTBW\_PREF** ou <br />**XMEM\_GPU\_OPTIMAL\_BANDWIDTH\_PREFERRED**<br />0x00000380 | Especifica que as alocações devem preferir memória de largura de banda ideal para GPU e só usar memória de largura de banda padrão se a memória de largura de banda ideal para GPU estiver esgotada. |

*NumberOfPages*   \_Inout\_<br />Tipo: PULONG\_PTR

Ponteiro para uma variável que contém o número de páginas de 64KB a serem alocadas. Após a conclusão, retorna o número de páginas de 64 KB *realmente* alocadas.

*PageArray*   \_Out\_writes\_to\_(\*NumberOfPages,\*NumberOfPages)<br />Tipo: PULONG\_PTR

Ponteiro para a memória do usuário para armazenar os números das páginas de 64KB alocadas. Ponteiro para uma matriz para armazenar os números de quadros de página da memória alocada.

O tamanho da matriz alocada deve ser pelo menos *NumberOfPages* vezes o tamanho do tipo de dados **ULONG\_PTR**.

Não tente modificar esse buffer. Ele contém dados do sistema operacional, e sua corrupção pode ser catastrófica. As informações no buffer não são úteis para um aplicativo.

### Valor retornado

Tipo: BOOL

Se a função for bem-sucedida, o valor retornado será **TRUE**.

Podem ser alocadas menos páginas do que o solicitado. O chamador deve verificar o valor do parâmetro *NumberOfPages* no retorno para ver quantas páginas foram alocadas. Todos os números de quadros de página alocados são colocados sequencialmente na memória apontada pelo parâmetro *PageArray*.

Se a função falhar, o valor retornado será **FALSE** e nenhum quadro será alocado. Para obter informações de erro estendidas, chame <a href="https://msdn.microsoft.com/library/windows/desktop/ms679360(v=vs.85).aspx">GetLastError</a>.

## Comentários

Essa API aloca páginas de memória física a serem mapeadas em uma região de um processo especificado.

**XMemAllocatePhysicalPages** é útil nos momentos em que pode ser desejável que os aplicativos pré-aloquem muitas sequências de páginas fisicamente contíguas e as subdividam em páginas separadas de 64KB com base em condições variáveis determinadas dinamicamente em tempo de execução. **XMemAllocatePhysicalPages** oferece alocação de páginas físicas sem colocá-las no espaço de endereço virtual.

**XMemAllocatePhysicalPages** aloca a quantidade de memória solicitada em páginas físicas. Independentemente do uso de **XMEM\_2MB\_CLUSTERS**, os números de página na matriz retornada referem-se a páginas individuais de 64KB.  Essas páginas podem ser usadas livremente ao mapear em reservas feitas usando **MEM\_64K\_PAGES**.  No entanto, clusters contíguos de 2MB, como os retornados quando **XMEM\_2MB\_CLUSTERS** é especificado, são necessários ao mapear em reservas feitas com **MEM\_2MB\_PAGES**. Somente a primeira página física de cada cluster de 2MB é usada ao mapear em reservas feitas com **MEM\_2MB\_PAGES**.

No retorno, *NumberOfPages* pode retornar menos do que o número de páginas solicitado.

Para liberar páginas alocadas com **XMemAllocatePhysicalPages**, chame [XMemFreePhysicalPages](/pt-BR/reference/system/xmem/functions/xmemfreephysicalpages).

Exemplo:

```cpp theme={null}
ULONG_PTR PageArray[64];
ULONG_PTR PageCount = RTL_NUMBER_OF(PageArray);
XMemAllocatePhysicalPages(XMEM_2MB_CLUSTERS, &PageCount, PageArray);

// Allocate 4MB of reserved space as both 64KB page sizes and 2MB page sizes
PVOID RWAddress = XMemVirtualAlloc(NULL,
    4 * 1024 * 1024,
    MEM_64K_PAGES | MEM_RESERVE,
    XMEM_CPU | XMEM_MAPPABLE,
    PAGE_READWRITE);

PVOID ROAddress = XMemVirtualAlloc(NULL,
    4 * 1024 * 1024,
    MEM_2MB_PAGES | MEM_RESERVE,
    XMEM_CPU | XMEM_MAPPABLE,
    PAGE_READONLY);

// Map the physical pages into the 64k address reservation
XMemMapPhysicalPages(RWAddress, PageCount, PageArray);

// Map the physical pages into the 2MB address reservation
// Use only the first physical page of each 2MB run
ULONG_PTR PageArray2MB[2];
PageArray2MB[0] = PageArray[0];
PageArray2MB[1] = PageArray[32];
XMemMapPhysicalPages(ROAddress, 2, PageArray2MB);

memset(RWAddress, 0x17, 4 * 1024 * 1024);
assert (memcmp(RWAddress, ROAddress, 4 * 1024 * 1024)==0);

// Unmap the regions, the address reservation is preserved
XMemMapPhysicalPages(ROAddress, 2, NULL);
XMemMapPhysicalPages(RWAddress, 64, NULL);

// Release the physical pages back to the MM
XMemFreePhysicalPages(PageCount, PageArray);

// Release the two reserved address regions
VirtualFree(RWAddress, 0, MEM_RELEASE);
VirtualFree(ROAddress, 0, MEM_RELEASE);
```

## Requisitos

**Cabeçalho:** xmem.h

**Biblioteca:** xmem.lib

**Plataformas compatíveis:** consoles da família XBOX One e consoles XBOX Series

## Confira também

[Referência de XMem](/pt-BR/reference/system/xmem/xmem_members)<br />[XMemVirtualAlloc](/pt-BR/reference/system/xmem/functions/xmemvirtualalloc)<br />[XMemMapPhysicalPages](/pt-BR/reference/system/xmem/functions/xmemmapphysicalpages)<br />[XMemFreePhysicalPages](/pt-BR/reference/system/xmem/functions/xmemfreephysicalpages)


## Related topics

- [XMemFreePhysicalPages](/reference/system/xmem/functions/xmemfreephysicalpages.md)
- [XMemMapPhysicalPages](/reference/system/xmem/functions/xmemmapphysicalpages.md)
