Partager via


VirtualAllocFromApp, fonction (memoryapi.h)

Réserve, valide ou modifie l’état d’une région de pages dans l’espace d’adressage virtuel du processus appelant. La mémoire allouée par cette fonction est automatiquement initialisée à zéro.

Syntaxe

PVOID VirtualAllocFromApp(
  [in, optional] PVOID  BaseAddress,
  [in]           SIZE_T Size,
  [in]           ULONG  AllocationType,
  [in]           ULONG  Protection
);

Paramètres

[in, optional] BaseAddress

Adresse de départ de la région à allouer. Si la mémoire est réservée, l’adresse spécifiée est arrondie au multiple le plus proche de la granularité d’allocation. Si la mémoire est déjà réservée et est validée, l’adresse est arrondie à la limite de page suivante. Pour déterminer la taille d’une page et la granularité d’allocation sur l’ordinateur hôte, utilisez la fonction GetSystemInfo. Si ce paramètre est NULL, le système détermine où allouer la région.

[in] Size

Taille de la région, en octets. Si le paramètre BaseAddress est NULL, cette valeur est arrondie à la limite de page suivante. Sinon, les pages allouées incluent toutes les pages contenant un ou plusieurs octets de la plage de BaseAddress à BaseAddress+Size. Cela signifie qu’une plage de 2 octets s’écartant d’une limite de page entraîne l’inclusion des deux pages dans la région allouée.

[in] AllocationType

Type d’allocation de mémoire. Ce paramètre doit contenir l’une des valeurs suivantes.

Valeur Signification
MEM_COMMIT
0x00001000
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 VirtualAllocFromApp avec MEM_COMMIT | MEM_RESERVE.

La tentative de validation d’une plage d’adresses spécifique en spécifiant MEM_COMMIT sans MEM_RESERVE et unNULLBaseAddress é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.

MEM_RESERVE
0x00002000
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 pouvez valider les pages réservées dans les appels suivants à la fonction VirtualAllocFromApp. Pour réserver et valider des pages en une seule étape, appelez VirtualAllocFromApp avec MEM_COMMIT | MEM_RESERVE.

D’autres fonctions d’allocation de mémoire, telles que malloc et LocalAlloc, ne peuvent pas utiliser une plage réservée de mémoire tant qu’elle n’est pas libérée.

MEM_RESET
0x00080000
Indique que les données de la plage de mémoire spécifiées par BaseAddress et Taille 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 spécifiez MEM_RESET, la fonction VirtualAllocFromApp ignore la valeur de Protection. Toutefois, vous devez toujours définir Protection sur une valeur de protection valide, telle que PAGE_NOACCESS.

VirtualAllocFromApp 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
0x1000000
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 BaseAddress et Taille 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 VirtualAllocFromApp ignore la valeur de Protection. Toutefois, vous devez toujours définir Protection sur une valeur de protection valide, telle que PAGE_NOACCESS.

 

Ce paramètre peut également spécifier les valeurs suivantes, comme indiqué.

Valeur Signification
MEM_LARGE_PAGES
0x20000000
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.

MEM_PHYSICAL
0x00400000
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.

MEM_TOP_DOWN
0x00100000
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.
MEM_WRITE_WATCH
0x00200000
Provoque le suivi des pages écrites dans la région allouée par le système. Si vous spécifiez cette valeur, vous devez également spécifier MEM_RESERVE.

Pour récupérer les adresses des pages qui ont été écrites depuis l’allocation de la région ou l’état de suivi de l’écriture a été réinitialisé, appelez la fonction GetWriteWatch. Pour réinitialiser l’état de suivi d’écriture, appelez GetWriteWatch ou ResetWriteWatch. La fonctionnalité de suivi de l’écriture reste activée pour la région de mémoire jusqu’à ce que la région soit libérée.

[in] Protection

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 . Les constantes suivantes génèrent une erreur :

  • PAGE_EXECUTE
  • PAGE_EXECUTE_READ
  • PAGE_EXECUTE_READWRITE
  • PAGE_EXECUTE_WRITECOPY

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

Vous pouvez appeler VirtualAllocFromApp à partir d’applications du Windows Store avec des fonctionnalités juste-à-temps (JIT) pour utiliser les fonctionnalités JIT. L’application doit inclure la fonctionnalité codeGeneration dans le fichier manifeste de l’application pour utiliser les fonctionnalités JIT.

Chaque page a un état de page associé. La fonction VirtualAllocFromApp 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
VirtualAllocFromApp ne peut pas réserver une page réservée. Il peut valider une page déjà validée. Cela signifie que vous pouvez valider une plage de pages, qu’elles aient déjà été validées et que la fonction ne échoue pas.

Vous pouvez utiliser VirtualAllocFromApp pour réserver un bloc de pages, puis effectuer des appels supplémentaires à VirtualAllocFromApp 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 BaseAddress n’est pas NULL, la fonction utilise les paramètres BaseAddress et Size pour calculer la région des pages à allouer. L’état actuel de la plage entière de pages doit être compatible avec le type d’allocation spécifié par le paramètre AllocationType. Sinon, la fonction échoue et aucune des pages n’est allouée. Cette exigence de compatibilité n’empêche pas la validation d’une page déjà validée, comme mentionné précédemment.

VirtualAllocFromApp n’autorise pas la création de pages exécutables.

La fonction VirtualAllocFromApp peut être utilisée pour réserver une zone de mémoire AWE (Address Windowing Extensions) 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 MEM_PHYSICAL et MEM_RESERVE doivent être définies dans le paramètre AllocationType . La valeur MEM_COMMIT ne doit pas être définie. La protection de page doit être définie sur PAGE_READWRITE.

La fonction VirtualFree 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 10 [applications de bureau | Applications UWP]
serveur minimum pris en charge Windows Server 2016 [applications de bureau | Applications UWP]
plateforme cible Windows
d’en-tête memoryapi.h (include Windows.h)
bibliothèque WindowsApp.lib
DLL Kernel32.dll

Voir aussi

fonctions de gestion de la mémoire

fonctions de mémoire virtuelle

VirtualAlloc

virtualAllocEx

VirtualFree

VirtualLock

VirtualProtectFromApp

virtualQuery