Partager via


VirtualAlloc2FromApp, 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.

À l’aide de cette fonction, vous pouvez : pour les nouvelles allocations, spécifier une plage d’espace d’adressage virtuel et une restriction d’alignement power-of-2 ; spécifier un nombre arbitraire de paramètres étendus ; spécifiez un nœud NUMA préféré pour la mémoire physique en tant que paramètre étendu ; et spécifiez une opération d’espace réservé (plus précisément, remplacement).

Pour spécifier le nœud NUMA, consultez le paramètre ExtendedParameters .

Syntaxe

PVOID VirtualAlloc2FromApp(
  [in, optional]      HANDLE                 Process,
  [in, optional]      PVOID                  BaseAddress,
  [in]                SIZE_T                 Size,
  [in]                ULONG                  AllocationType,
  [in]                ULONG                  PageProtection,
  [in, out, optional] MEM_EXTENDED_PARAMETER *ExtendedParameters,
  [in]                ULONG                  ParameterCount
);

Paramètres

[in, optional] Process

Handle d’un processus. La fonction alloue de la mémoire dans l’espace d’adressage virtuel de ce processus.

Le handle doit avoir le droit d’accès PROCESS_VM_OPERATION . Pour plus d’informations, consultez Droits d’accès et de sécurité des processus.

[in, optional] BaseAddress

Pointeur qui spécifie une adresse de départ souhaitée pour la région de pages que vous souhaitez allouer.

Si BaseAddress a la valeur NULL, la fonction détermine où allouer la région.

Si BaseAddress n’a pas la valeur NULL, toute structure de MEM_ADDRESS_REQUIREMENTS fournie doit se composer de tous les zéros, et l’adresse de base doit être un multiple de la granularité d’allocation du système. Pour déterminer la granularité de l’allocation, utilisez la fonction GetSystemInfo .

[in] Size

Taille de la région de mémoire à allouer, en octets.

La taille doit toujours être un multiple de la taille de la page.

Si BaseAddress n’a pas la valeur NULL, la fonction alloue toutes les pages qui contiennent un ou plusieurs octets dans la plage de BaseAddress à BaseAddress+Size. Cela signifie, par exemple, qu’une plage de 2 octets qui chevauche une limite de page entraîne l’allocation des deux pages par la fonction.

[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ées spécifiées. La fonction garantit également que lorsque l’appelant accède ensuite initialement à la mémoire, le contenu est égal à zéro. Les pages physiques réelles ne sont pas allouées, sauf si les adresses virtuelles sont réellement accessibles.

Pour réserver et valider des pages en une seule étape, appelez Virtual2AllocFromApp 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 une adresse baseAddress non NULL é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éterminer au préalable l’état d’engagement actuel de chaque page.

MEM_RESERVE
0x00002000
Réserve une plage de l’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 Virtual2AllocFromApp . Pour réserver et valider des pages en une seule étape, appelez Virtual2AllocFromApp avec MEM_COMMIT | MEM_RESERVE.

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

MEM_REPLACE_PLACEHOLDER
0x00004000
Remplace un espace réservé par une allocation privée normale. Seules les vues de section de données/pf-backed sont prises en charge (aucune image, mémoire physique, etc.). Lorsque vous remplacez un espace réservé, BaseAddress et Size doivent correspondre exactement à ceux de l’espace réservé, et toute structure de MEM_ADDRESS_REQUIREMENTS fournie doit se composer de tous les zéros.

Après avoir remplacé un espace réservé par une allocation privée, pour libérer cette allocation dans un espace réservé, consultez le paramètre dwFreeType de VirtualFree et VirtualFreeEx.

Un espace réservé est un type de région de mémoire réservée.

MEM_RESERVE_PLACEHOLDER
0x00040000
Pour créer un espace réservé, appelez VirtualAlloc2 avec MEM_RESERVE | MEM_RESERVE_PLACEHOLDER et PageProtection défini sur PAGE_NOACCESS. Pour libérer/fractionner/fusionner un espace réservé, consultez le paramètre dwFreeType de VirtualFree et VirtualFreeEx.

Un espace réservé est un type de région de mémoire réservée.

MEM_RESET
0x00080000
Indique que les données de la plage de mémoire spécifiée par BaseAddress et Size ne sont plus intéressantes. Les pages ne doivent pas être lues ou écrites dans le fichier de pagination. Toutefois, le bloc de mémoire sera à nouveau utilisé ultérieurement, de sorte qu’il ne doit pas être décompressé. Cette valeur ne peut pas être utilisée avec une autre valeur.

L’utilisation de cette valeur ne garantit pas que la plage exploité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 Virtual2AllocFromApp ignore la valeur de Protection. Toutefois, vous devez toujours définir Protection sur une valeur de protection valide, telle que PAGE_NOACCESS.

Virtual2AllocFromApp retourne une erreur si vous utilisez MEM_RESET et que la plage de mémoire est mappée à un fichier. Une vue partagée n’est acceptable que si elle est mappée à un fichier de pagination.

MEM_RESET_UNDO
0x1000000
MEM_RESET_UNDO ne doit être appelée que sur une plage d’adresses à laquelle MEM_RESET a été appliqué précédemment. Il indique que les données dans la plage de mémoire spécifiée spécifiée par BaseAddress et Size sont intéressantes pour l’appelant et tente 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é 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 Virtual2AllocFromApp 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 la prise en charge des grandes pages.

La taille et l’alignement doivent être un multiple du minimum de pages volumineuses. 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 les pages Extensions de fenêtrage d’adresses (AWE).

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 y a de nombreuses allocations.
MEM_WRITE_WATCH
0x00200000
Amène le système à suivre les pages écrites dans la région allouée. 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 dans depuis l’allocation de la région ou la réinitialisation de l’état de suivi de l’écriture, appelez la fonction GetWriteWatch . Pour réinitialiser l’état de suivi des écritures, appelez GetWriteWatch ou ResetWriteWatch. La fonctionnalité de suivi des écritures reste activée pour la région de mémoire jusqu’à ce que la région soit libérée.

[in] PageProtection

Protection de la mémoire pour la région de 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

[in, out, optional] ExtendedParameters

Pointeur facultatif vers un ou plusieurs paramètres étendus de type MEM_EXTENDED_PARAMETER. Chacune de ces valeurs de paramètre étendues peut elle-même avoir un champ Typede MemExtendedParameterAddressRequirements ou MemExtendedParameterNumaNode. Si aucun paramètre étendu MemExtendedParameterNumaNode n’est fourni, le comportement est le même que pour les fonctions VirtualAlloc/MapViewOfFile (autrement dit, le nœud NUMA préféré pour les pages physiques est déterminé en fonction du processeur idéal du thread qui accède d’abord à la mémoire).

[in] ParameterCount

Nombre de paramètres étendus pointés vers par ExtendedParameters.

Valeur retournée

Si la fonction réussit, la valeur de retour est l’adresse de base de la région de pages allouée.

Si la fonction échoue, la valeur de retour est NULL. Pour obtenir des informations détaillées sur l’erreur, appelez GetLastError.

Remarques

Cette API permet de prendre en charge les jeux hautes performances et les applications serveur, qui ont des exigences particulières en matière de gestion de leur espace d’adressage virtuel. Par exemple, le mappage de la mémoire au-dessus d’une région précédemment réservée ; cela est utile pour implémenter une mémoire tampon en anneau de wrapper automatiquement. Et l’allocation de mémoire avec un alignement spécifique ; par exemple, pour permettre à votre application de valider à la demande des régions mappées de grandes ou d’énormes pages.

Vous pouvez appeler Virtual2AllocFromApp à partir d’applications du Windows Store avec des fonctionnalités juste-à-temps (JIT) pour utiliser la fonctionnalité 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 Virtual2AllocFromApp 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
Virtual2AllocFromApp 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 ou non, et que la fonction n’échoue pas.

Vous pouvez utiliser Virtual2AllocFromApp pour réserver un bloc de pages, puis effectuer des appels supplémentaires à Virtual2AllocFromApp 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’a pas la valeur NULL, la fonction utilise les paramètres BaseAddress et Size pour calculer la région de pages à allouer. L’état actuel de l’ensemble de la plage 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.

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

La fonction Virtual2AllocFromApp peut être utilisée pour réserver une région AWE ( Address Windowing Extensions ) de 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 de la mémoire virtuelle comme requis par 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ésengager une page validée, libérer le stockage de la page, ou elle peut simultanément désengager et libérer 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 que le code a été défini en place. Sinon, les tentatives d’exécution du code à partir de la région nouvellement exécutable peuvent produire des résultats imprévisibles.

Exemples

Pour obtenir des exemples de code, consultez Virtual2Alloc.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows 10 (applications de bureau uniquement)
Serveur minimal pris en charge Windows Server 2016 (applications de bureau uniquement)
Plateforme cible Windows
En-tête memoryapi.h (inclure 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