VirtualAllocEx, fonction (memoryapi.h)
Réserve, valide ou modifie l’état d’une région de mémoire dans l’espace d’adressage virtuel d’un processus spécifié. La fonction initialise la mémoire qu’elle alloue à zéro.
Pour spécifier le nœud NUMA pour la mémoire physique, consultez VirtualAllocExNuma.
Syntaxe
LPVOID VirtualAllocEx(
[in] HANDLE hProcess,
[in, optional] LPVOID lpAddress,
[in] SIZE_T dwSize,
[in] DWORD flAllocationType,
[in] DWORD flProtect
);
Paramètres
[in] hProcess
Handle vers un processus. La fonction alloue de la mémoire dans l’espace d’adressage virtuel de ce processus.
Le handle doit disposer du droit d’accès PROCESS_VM_OPERATION. Pour plus d’informations, consultez Processus de sécurité et de droits d’accès.
[in, optional] lpAddress
Pointeur qui spécifie une adresse de départ souhaitée pour la région des pages que vous souhaitez allouer.
Si vous réservez de la mémoire, la fonction arrondit cette adresse au multiple le plus proche de la granularité d’allocation.
Si vous validez la mémoire déjà réservée, la fonction arrondit cette adresse à la limite de page la plus proche. Pour déterminer la taille d’une page et la granularité d’allocation sur l’ordinateur hôte, utilisez la fonction GetSystemInfo.
Si lpAddress est NULL, la fonction détermine où allouer la région.
Si cette adresse se trouve dans une enclave que vous n’avez pas initialisée en appelant InitializeEnclave, VirtualAllocEx alloue une page de zéros pour l’enclave à cette adresse. La page doit être précédemment non validée et ne sera pas mesurée avec l’instruction EEXTEND du modèle de programmation Extensions Intel Software Guard.
Si l’adresse dans une enclave que vous avez initialisée, l’opération d’allocation échoue avec l’erreur ERROR_INVALID_ADDRESS. Cela est vrai pour les enclaves qui ne prennent pas en charge la gestion de la mémoire dynamique (par exemple SGX1). Les enclaves SGX2 autorisent l’allocation et la page doit être acceptée par l’enclave une fois qu’elle a été allouée.
[in] dwSize
Taille de la région de mémoire à allouer, en octets.
Si lpAddress est NULL, la fonction arrondit dwSize jusqu’à la limite de page suivante.
Si lpAddress n’est pas NULL, la fonction alloue toutes les pages qui contiennent un ou plusieurs octets de la plage de lpAddress à lpAddress+dwSize. Cela signifie, par exemple, qu’une plage de 2 octets qui chevauche une limite de page entraîne l’allocation des deux pages par fonction.
[in] flAllocationType
Type d’allocation de mémoire. Ce paramètre doit contenir l’une des valeurs suivantes.
Valeur | Signification |
---|---|
|
Alloue des frais de mémoire (à partir de la taille globale de la mémoire et des fichiers de pagination sur le disque) pour les pages de mémoire réservée spécifiées. La fonction garantit également que lorsque l’appelant accède ultérieurement à la mémoire, le contenu sera égal à zéro. Les pages physiques réelles ne sont pas allouées, sauf si/tant que les adresses virtuelles ne sont pas réellement accessibles.
Pour réserver et valider des pages en une seule étape, appelez VirtualAllocEx avec La tentative de validation d’une plage d’adresses spécifique en spécifiant MEM_COMMIT sans MEM_RESERVE et unNULLlpAddress échoue, sauf si la plage entière a déjà été réservée. Le code d’erreur résultant est ERROR_INVALID_ADDRESS. Une tentative de validation d’une page déjà validée n’entraîne pas l’échec de la fonction. Cela signifie que vous pouvez valider des pages sans d’abord déterminer l’état d’engagement actuel de chaque page. Si lpAddress spécifie une adresse dans une enclave, flAllocationType doit être MEM_COMMIT. |
|
Réserve une plage d’espace d’adressage virtuel du processus sans allouer de stockage physique réel en mémoire ou dans le fichier de pagination sur le disque.
Vous validez les pages réservées en appelant VirtualAllocEx à nouveau avec MEM_COMMIT. Pour réserver et valider des pages en une seule étape, appelez VirtualAllocEx avec D’autres fonctions d’allocation de mémoire, telles que malloc et LocalAlloc, ne peuvent pas utiliser la mémoire réservée tant qu’elle n’a pas été libérée. |
|
Indique que les données de la plage de mémoire spécifiées par lpAddress et dwSize n’est plus intéressante. Les pages ne doivent pas être lues ou écrites dans le fichier de pagination. Toutefois, le bloc de mémoire sera utilisé à nouveau ultérieurement, de sorte qu’il ne doit pas être omis. Cette valeur ne peut pas être utilisée avec une autre valeur.
L’utilisation de cette valeur ne garantit pas que la plage utilisée avec MEM_RESET contiendra des zéros. Si vous souhaitez que la plage contienne des zéros, supprimez la mémoire, puis recommencez-la. Lorsque vous utilisez VirtualAllocEx retourne une erreur si vous utilisez MEM_RESET et que la plage de mémoire est mappée à un fichier. Une vue partagée est acceptable uniquement si elle est mappée à un fichier de pagination. |
|
MEM_RESET_UNDO ne doit être appelé que sur une plage d’adresses à laquelle MEM_RESET a été appliquée précédemment. Il indique que les données de la plage de mémoire spécifiée par lpAddress et dwSize intéressent l’appelant et tentent d’inverser les effets de MEM_RESET. Si la fonction réussit, cela signifie que toutes les données de la plage d’adresses spécifiée sont intactes. Si la fonction échoue, au moins certaines données de la plage d’adresses ont été remplacées par des zéros.
Cette valeur ne peut pas être utilisée avec une autre valeur. Si MEM_RESET_UNDO est appelée sur une plage d’adresses qui n’était pas MEM_RESET précédemment, le comportement n’est pas défini. Lorsque vous spécifiez MEM_RESET, la fonction VirtualAllocEx ignore la valeur de flProtect. Toutefois, vous devez toujours définir flProtect sur une valeur de protection valide, telle que PAGE_NOACCESS. Windows Server 2008 R2, Windows 7, Windows Server 2008, Windows Vista, Windows Server 2003 et Windows XP : l’indicateur MEM_RESET_UNDO n’est pas pris en charge tant que Windows 8 et Windows Server 2012. |
Ce paramètre peut également spécifier les valeurs suivantes, comme indiqué.
Valeur | Signification |
---|---|
|
Alloue de la mémoire à l’aide de prise en charge des grandes pages.
La taille et l’alignement doivent être un multiple du minimum de grande page. Pour obtenir cette valeur, utilisez la fonction GetLargePageMinimum. Si vous spécifiez cette valeur, vous devez également spécifier MEM_RESERVE et MEM_COMMIT. |
|
Réserve une plage d’adresses qui peut être utilisée pour mapper pages AWE (Address Windowing Extensions).
Cette valeur doit être utilisée avec MEM_RESERVE et aucune autre valeur. |
|
Alloue de la mémoire à l’adresse la plus élevée possible. Cela peut être plus lent que les allocations régulières, en particulier lorsqu’il existe de nombreuses allocations. |
[in] flProtect
Protection de la mémoire pour la région des pages à allouer. Si les pages sont validées, vous pouvez spécifier l’une des constantes de protection de la mémoire .
Si lpAddress spécifie une adresse dans une enclave, flProtect ne peut pas être l’une des valeurs suivantes :
- PAGE_NOACCESS
- PAGE_GUARD
- PAGE_NOCACHE
- PAGE_WRITECOMBINE
Lors de l’allocation de mémoire dynamique pour une enclave, le paramètre flProtect doit être PAGE_READWRITE ou PAGE_EXECUTE_READWRITE.
Valeur de retour
Si la fonction réussit, la valeur de retour est l’adresse de base de la région allouée de pages.
Si la fonction échoue, la valeur de retour est NULL . Pour obtenir des informations d’erreur étendues, appelez GetLastError.
Remarques
Chaque page a un état de page associé. La fonction VirtualAllocEx peut effectuer les opérations suivantes :
- Valider une région de pages réservées
- Réserver une région de pages gratuites
- Réserver et valider simultanément une région de pages libres
Vous pouvez utiliser VirtualAllocEx pour réserver un bloc de pages, puis effectuer des appels supplémentaires à VirtualAllocEx pour valider des pages individuelles à partir du bloc réservé. Cela permet à un processus de réserver une plage de son espace d’adressage virtuel sans consommer de stockage physique jusqu’à ce qu’il soit nécessaire.
Si le paramètre
Pour exécuter du code généré dynamiquement, utilisez virtualAllocEx pour allouer de la mémoire et la fonction VirtualProtectEx pour accorder PAGE_EXECUTE accès.
La fonction VirtualAllocEx peut être utilisée pour réserver une 'extension de fenêtre d’adresse (AWE) de la mémoire dans l’espace d’adressage virtuel d’un processus spécifié. Cette région de mémoire peut ensuite être utilisée pour mapper des pages physiques dans et hors mémoire virtuelle, selon les besoins de l’application. Les valeurs
La fonction VirtualFreeEx peut décommit une page validée, libérer le stockage de la page ou libérer simultanément une page validée. Il peut également libérer une page réservée, ce qui en fait une page gratuite.
Lors de la création d’une région qui sera exécutable, le programme appelant a la responsabilité de garantir la cohérence du cache via un appel approprié à FlushInstructionCache une fois le code en place. Sinon, les tentatives d’exécution de code hors de la région nouvellement exécutable peuvent produire des résultats imprévisibles.
Exigences
Exigence | Valeur |
---|---|
client minimum pris en charge | Windows XP [applications de bureau | Applications UWP] |
serveur minimum pris en charge | Windows Server 2003 [applications de bureau | Applications UWP] |
plateforme cible | Windows |
d’en-tête | memoryapi.h (include Windows.h, Memoryapi.h) |
bibliothèque | onecore.lib |
DLL | Kernel32.dll |
Voir aussi
fonctions de gestion de la mémoire