> ## 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 alloue des pages physiques contiguës pour un processus cible dans le GDK XBOX, avec des indicateurs de taille de page et de mise en cache.

# XMemAllocatePhysicalPages

Alloue des pages physiques contiguës pour le processus cible spécifié.

## Syntaxe

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

### Paramètres

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

Spécifie les exigences relatives aux pages allouées.

| Type | Détails |
| - | - |
| **XMEM\_2MB\_CLUSTERS**<br />0x20000000 | Exige que les pages allouées soient retournées par groupes de 32 pages contiguës (2 Mo).  Chaque grappe de 32 pages commence sur un alignement physique de 2 Mo.  NumberOfPages doit être un multiple de 32 lorsque cet indicateur est utilisé. |

Sur les appareils Anaconda et les appareils Dante qui émulent Anaconda, lorsque le mode de mémoire de titre Avancé est utilisé, les paramètres suivants peuvent également être appliqués.  Ces paramètres sont ignorés dans tous les autres cas.

| Valeur | Signification |
| - | - |
| **XMEM\_STD\_BW\_REQ** ou <br />**XMEM\_STANDARD\_BANDWIDTH\_REQUIRED**<br />0x00000080 | Spécifie que les allocations doivent être satisfaites au moyen de mémoire à bande passante standard. |
| **XMEM\_STD\_BW\_PREF** ou <br />**XMEM\_STANDARD\_BANDWIDTH\_PREFERRED**<br />0x00000180 | Spécifie que les allocations doivent privilégier la mémoire à bande passante standard et n'utiliser la mémoire à bande passante optimale pour le GPU que si la mémoire à bande passante standard est épuisée. |
| **XMEM\_GPU\_OPTBW\_REQ** ou <br />**XMEM\_GPU\_OPTIMAL\_BANDWIDTH\_REQUIRED**<br />0x00000280 | Spécifie que les allocations doivent être satisfaites au moyen de mémoire à bande passante optimale pour le GPU. |
| **XMEM\_GPU\_OPTBW\_PREF** ou <br />**XMEM\_GPU\_OPTIMAL\_BANDWIDTH\_PREFERRED**<br />0x00000380 | Spécifie que les allocations doivent privilégier la mémoire à bande passante optimale pour le GPU et n'utiliser la mémoire à bande passante standard que si la mémoire à bande passante optimale pour le GPU est épuisée. |

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

Pointeur vers une variable contenant le nombre de pages de 64 Ko à allouer. À la fin de l'opération, retourne le nombre de pages de 64 Ko *réellement* allouées.

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

Pointeur vers la mémoire utilisateur dans laquelle stocker les numéros des pages de 64 Ko allouées. Pointeur vers un tableau dans lequel stocker les numéros de cadres de page de la mémoire allouée.

La taille du tableau alloué doit être au moins égale à *NumberOfPages* multiplié par la taille du type de données **ULONG\_PTR**.

Ne tentez pas de modifier cette mémoire tampon. Elle contient des données du système d'exploitation, et sa corruption pourrait avoir des conséquences catastrophiques. Les informations de la mémoire tampon ne sont d'aucune utilité pour une application.

### Valeur de retour

Type : BOOL

Si la fonction réussit, la valeur de retour est **TRUE**.

Il est possible que moins de pages que le nombre demandé soient allouées. L'appelant doit vérifier la valeur du paramètre *NumberOfPages* au retour pour savoir combien de pages sont allouées. Tous les numéros de cadres de page alloués sont placés de façon séquentielle dans la mémoire pointée par le paramètre *PageArray*.

Si la fonction échoue, la valeur de retour est **FALSE** et aucun cadre n'est alloué. Pour obtenir des informations d'erreur étendues, appelez <a href="https://msdn.microsoft.com/library/windows/desktop/ms679360(v=vs.85).aspx">GetLastError</a>.

## Remarques

Cette API alloue des pages de mémoire physique destinées à être mappées dans une région d'un processus spécifié.

**XMemAllocatePhysicalPages** est utile lorsqu'il peut être souhaitable pour les applications de préallouer de nombreuses séries de pages physiquement contiguës et de les subdiviser en pages distinctes de 64 Ko en fonction de conditions changeantes déterminées dynamiquement à l'exécution. **XMemAllocatePhysicalPages** permet d'allouer des pages physiques sans les placer dans l'espace d'adressage virtuel.

**XMemAllocatePhysicalPages** alloue la quantité de mémoire demandée sous forme de pages physiques. Que **XMEM\_2MB\_CLUSTERS** soit utilisé ou non, les numéros de page du tableau retourné font référence à des pages individuelles de 64 Ko.  Ces pages peuvent être utilisées librement lors du mappage dans des réservations effectuées avec **MEM\_64K\_PAGES**.  Toutefois, des grappes contiguës de 2 Mo, comme celles retournées lorsque **XMEM\_2MB\_CLUSTERS** est spécifié, sont requises lors du mappage dans des réservations effectuées avec **MEM\_2MB\_PAGES**. Seule la première page physique de chaque grappe de 2 Mo est utilisée lors du mappage dans des réservations effectuées avec **MEM\_2MB\_PAGES**.

Au retour, *NumberOfPages* peut indiquer un nombre de pages inférieur au nombre demandé.

Pour libérer les pages allouées avec **XMemAllocatePhysicalPages**, appelez [XMemFreePhysicalPages](/fr-CA/reference/system/xmem/functions/xmemfreephysicalpages).

Exemple :

```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);
```

## Configuration requise

**En-tête :** xmem.h

**Bibliothèque :** xmem.lib

**Plateformes prises en charge :** consoles de la famille XBOX One et consoles XBOX Series

## Voir aussi

[Référence XMem](/fr-CA/reference/system/xmem/xmem_members)<br />[XMemVirtualAlloc](/fr-CA/reference/system/xmem/functions/xmemvirtualalloc)<br />[XMemMapPhysicalPages](/fr-CA/reference/system/xmem/functions/xmemmapphysicalpages)<br />[XMemFreePhysicalPages](/fr-CA/reference/system/xmem/functions/xmemfreephysicalpages)


## Related topics

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