> ## 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 sur 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 cluster 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 émulant Anaconda, en mode de mémoire de titre Avancé, 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 à l'aide 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 à l'aide 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 destinée à stocker les numéros des pages de 64 Ko allouées. Pointeur vers un tableau destiné à 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**.

N'essayez pas de modifier cette mémoire tampon. Elle contient des données du système d'exploitation, et une corruption pourrait être catastrophique. Les informations contenues dans 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 demandé soient allouées. L'appelant doit vérifier la valeur du paramètre *NumberOfPages* au retour pour savoir combien de pages ont été allouées. Tous les numéros de cadres de page alloués sont placés séquentiellement 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 à mapper 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 en 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 clusters contigus de 2 Mo, tels que ceux retournés lorsque **XMEM\_2MB\_CLUSTERS** est spécifié, sont nécessaires lors du mappage dans des réservations effectuées avec **MEM\_2MB\_PAGES**. Seule la première page physique de chaque cluster 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/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/reference/system/xmem/xmem_members)<br />[XMemVirtualAlloc](/fr/reference/system/xmem/functions/xmemvirtualalloc)<br />[XMemMapPhysicalPages](/fr/reference/system/xmem/functions/xmemmapphysicalpages)<br />[XMemFreePhysicalPages](/fr/reference/system/xmem/functions/xmemfreephysicalpages)


## Related topics

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