Partager via


NtAllocateVirtualMemory, fonction (ntifs.h)

La NtAllocateVirtualMemory réserve, valide ou les deux, une région de pages au sein de l’espace d’adressage virtuel en mode utilisateur d’un processus spécifié.

Syntaxe

__kernel_entry NTSYSCALLAPI NTSTATUS NtAllocateVirtualMemory(
  [in]      HANDLE    ProcessHandle,
  [in, out] PVOID     *BaseAddress,
  [in]      ULONG_PTR ZeroBits,
  [in, out] PSIZE_T   RegionSize,
  [in]      ULONG     AllocationType,
  [in]      ULONG     Protect
);

Paramètres

[in] ProcessHandle

Handle pour le processus pour lequel le mappage doit être effectué. Utilisez la macro NtCurrentProcess, définie dans Ntddk.h, pour spécifier le processus actuel.

[in, out] BaseAddress

Pointeur vers une variable qui recevra l’adresse de base de la région allouée de pages. Si la valeur initiale de BaseAddress n’est pasNULL, la région est allouée à partir de l’adresse virtuelle spécifiée arrondie à la limite d’adresse de taille de page hôte suivante. Si la valeur initiale de BaseAddress est NULL, le système d’exploitation détermine où allouer la région.

[in] ZeroBits

Nombre de bits d’adresse de commande élevée qui doivent être zéro dans l’adresse de base de la vue de section. Utilisé uniquement lorsque le système d’exploitation détermine où allouer la région, comme quand BaseAddress* est NULL. Notez que lorsque ZeroBits est supérieur à 32, il devient un masque de bits.

[in, out] RegionSize

Pointeur vers une variable qui recevra la taille réelle, en octets, de la région allouée de pages. La valeur initiale de RegionSize spécifie la taille, en octets, de la région et est arrondie à la limite de taille de page hôte suivante. RegionSize ne peut pas être égal à zéro lors de l’entrée.

[in] AllocationType

Masque de bits contenant des indicateurs qui spécifient le type d’allocation à effectuer pour la région de pages spécifiée. Le tableau suivant décrit les indicateurs les plus courants. Pour obtenir la liste complète des indicateurs et descriptions possibles, consultez VirtualAlloc.

Note

L’un des MEM_COMMIT, MEM_RESET ou MEM_RESERVE doit être défini.

Drapeau Signification
MEM_COMMIT La région de pages spécifiée doit être validée.
MEM_RESERVE La région spécifiée de pages doit être réservée.
MEM_RESET Réinitialisez l’état de la région spécifiée afin que si les pages se trouvent dans le fichier de pagination, elles sont ignorées et les pages de zéros sont insérées. Si les pages sont en mémoire et modifiées, elles sont marquées comme non modifiées afin qu’elles ne soient pas écrites dans le fichier de pagination. Le contenu n’est pas zéro. Le paramètre Protect n’est pas utilisé, mais il doit être défini sur une valeur valide. Si MEM_RESET est défini, aucun autre indicateur ne peut être défini.
Autres indicateurs deXXX MEM_ Consultez VirtualAlloc.

[in] Protect

Masque de bits contenant des indicateurs de protection de page qui spécifient la protection souhaitée pour la région validée des pages. Le tableau suivant décrit ces indicateurs.

Drapeau Signification
PAGE_NOACCESS Aucun accès à la région validée des pages n’est autorisé. Une tentative de lecture, d’écriture ou d’exécution de la région validée entraîne une exception de violation d’accès, appelée erreur de protection générale (GP).
PAGE_READONLY L’accès en lecture seule et l’exécution à la région validée des pages est autorisé. Une tentative d’écriture de la région validée entraîne une violation d’accès.
PAGE_READWRITE L’accès en lecture, écriture et exécution à la région validée des pages est autorisé. Si l’accès en écriture à la section sous-jacente est autorisé, une seule copie des pages est partagée. Sinon, les pages sont partagées en lecture seule/copie en écriture.
PAGE_EXECUTE L’accès à la région validée des pages est autorisé. Une tentative de lecture ou d’écriture dans la région validée entraîne une violation d’accès.
PAGE_EXECUTE_READ L’exécution et l’accès en lecture à la région validée des pages sont autorisés. Une tentative d’écriture dans la région validée entraîne une violation d’accès.
PAGE_GUARD Les pages de la région deviennent des pages de garde. Toute tentative de lecture ou d’écriture dans une page de garde entraîne la levée d’une exception STATUS_GUARD_PAGE par le système. Les pages de garde agissent ainsi comme une alarme d’accès unique. Cet indicateur est un modificateur de protection de page, valide uniquement lorsqu’il est utilisé avec l’un des indicateurs de protection de page autres que PAGE_NOACCESS. Lorsqu’une tentative d’accès conduit le système à désactiver l’état de la page de protection, la protection de page sous-jacente prend le relais. Si une exception de page guard se produit pendant un service système, le service retourne généralement un indicateur d’état d’échec.
PAGE_NOCACHE La région des pages doit être allouée comme non mise en cache. PAGE_NOCACHE n’est pas autorisé pour les sections.
PAGE_WRITECOMBINE Active la combinaison d’écritures, c’est-à-dire la fusion des écritures du cache vers la mémoire principale, où le matériel le prend en charge. Cet indicateur est principalement utilisé pour la mémoire tampon d’images afin que les écritures dans la même ligne de cache soient combinées dans la mesure du possible avant d’être écrites sur l’appareil. Cela peut considérablement réduire les écritures dans le bus dans (par exemple) la mémoire vidéo. Si le matériel ne prend pas en charge la combinaison d’écritures, l’indicateur est ignoré. Cet indicateur est un modificateur de protection de page, valide uniquement lorsqu’il est utilisé avec l’un des indicateurs de protection de page autres que PAGE_NOACCESS.

Valeur de retour

NtAllocateVirtualMemory retourne STATUS_SUCCESS ou un code d’état d’erreur. Les codes d’état d’erreur possibles sont les suivants :

  • STATUS_ACCESS_DENIED
  • STATUS_ALREADY_COMMITTED
  • STATUS_COMMITMENT_LIMIT
  • STATUS_CONFLICTING_ADDRESSES
  • STATUS_INSUFFICIENT_RESOURCES
  • STATUS_INVALID_HANDLE
  • STATUS_INVALID_PAGE_PROTECTION
  • STATUS_NO_MEMORY
  • STATUS_OBJECT_TYPE_MISMATCH
  • STATUS_PROCESS_IS_TERMINATING

Remarques

NtAllocateVirtualMemory peut effectuer les opérations suivantes :

  • Validez une région de pages réservée par un appel précédent à NtAllocateVirtualMemory.
  • Réservez une région de pages libres.
  • Réservez et validez une région de pages libres.

Les pilotes en mode noyau peuvent utiliser NtAllocateVirtualMemory pour réserver une plage d’adresses virtuelles accessibles par l’application dans le processus spécifié, puis effectuer des appels supplémentaires à NtAllocateVirtualMemory pour valider des pages individuelles à partir de la plage réservée. 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.

Chaque page de l’espace d’adressage virtuel du processus se trouve dans l’un des trois états décrits dans le tableau suivant.

État Signification
LIBRE La page n’est pas validée ou réservée et n’est pas accessible au processus. NtAllocateVirtualMemory peut réserver, ou réserver et valider simultanément, une page gratuite.
RÉSERVÉ La plage d’adresses ne peut pas être utilisée par d’autres fonctions d’allocation, mais la page n’est pas accessible au processus et n’a pas de stockage physique associé à celui-ci. NtAllocateVirtualMemory peut valider une page réservée, mais elle ne peut pas la réserver une deuxième fois. NtFreeVirtualMemory pouvez publier une page réservée, ce qui en fait une page gratuite.
ENGAGÉ Le stockage physique est alloué à la page et l’accès est contrôlé par un code de protection. Le système initialise et charge chaque page validée en mémoire physique uniquement lors de la première tentative de lecture ou d’écriture dans cette page. Lorsque le processus se termine, le système libère le stockage des pages validées. NtAllocateVirtualMemory 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. NtFreeVirtualMemory peut décommit une page validée, libérer le stockage de la page ou libérer simultanément une page validée.

La mémoire allouée en appelant NtAllocateVirtualMemory doit être libérée en appelant NtFreeVirtualMemory.

Pour plus d’informations sur la gestion de la mémoire, consultez Gestion de la mémoire pour les pilotes Windows.

Remarque Si l’appel à la fonction NtAllocateVirtualMemory se produit en mode utilisateur, vous devez utiliser le nom «NtAllocateVirtualMemory» au lieu de «ZwAllocateVirtualMemory».

Pour les appels à partir de pilotes en mode noyau, les versions NtXxx et ZwXxx d’une routine Windows Native System Services peuvent se comporter différemment de la façon dont elles gèrent et interprètent les paramètres d’entrée. Pour plus d’informations sur la relation entre les versions NtXxx et ZwXxx d’une routine, consultez Using Nt and Zw Versions of the Native System Services Routines.

Exigences

Exigence Valeur
client minimum pris en charge Windows 2000
plateforme cible Universel
d’en-tête ntifs.h (include Ntifs.h)
bibliothèque NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
règles de conformité DDI HwStorPortProhibitedDDIs, PowerIrpDDis, SpNoWait, StorPortStartIo

Voir aussi

NtFreeVirtualMemory