Partager via


ZwAllocateVirtualMemory, fonction (ntifs.h)

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

Syntaxe

NTSYSAPI NTSTATUS ZwAllocateVirtualMemory(
  [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 ce paramètre 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 ce paramètre 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. Cette valeur doit être inférieure à 21 et est utilisée uniquement lorsque le système d’exploitation détermine où allouer la région, comme quand BaseAddress est NULL.

[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 ce paramètre 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. Le tableau suivant décrit ces indicateurs.

Drapeau Signification
MEM_COMMIT La région de pages spécifiée doit être validée. L’un des MEM_COMMIT, MEM_RESET ou MEM_RESERVE doit être défini.
MEM_PHYSICAL Allouez de la mémoire physique. Cet indicateur est uniquement utilisé avec la mémoire AWE (Address Windowing Extensions). Si MEM_PHYSICAL est défini, MEM_RESERVE doit également être défini, aucun autre indicateur ne peut être défini et Protéger doit être défini sur PAGE_READWRITE.
MEM_RESERVE La région spécifiée de pages doit être réservée. L’un des MEM_COMMIT, MEM_RESET ou MEM_RESERVE doit être défini.
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. L’un des MEM_COMMIT, MEM_RESET ou MEM_RESERVE doit être défini ; si MEM_RESET est défini, aucun autre indicateur ne peut être défini.
MEM_TOP_DOWN La région spécifiée doit être créée au niveau de l’adresse virtuelle la plus élevée possible en fonction de ZeroBits.

[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_EXECUTE_READWRITE L’exécution, la lecture et l’accès en écriture à la région validée des pages sont autorisé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

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

Remarques

ZwAllocateVirtualMemory pouvez effectuer les opérations suivantes :

  • Validez une région de pages réservée par un appel précédent à ZwAllocateVirtualMemory.

  • 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 ZwAllocateVirtualMemory pour réserver une plage d’adresses virtuelles accessibles aux applications dans le processus spécifié, puis effectuer des appels supplémentaires à ZwAllocateVirtualMemory 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. ZwAllocateVirtualMemory 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. ZwAllocateVirtualMemory peut valider une page réservée, mais elle ne peut pas la réserver une deuxième fois. ZwFreeVirtualMemory 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. ZwAllocateVirtualMemory 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. ZwFreeVirtualMemory 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 ZwAllocateVirtualMemory doit être libérée en appelant ZwFreeVirtualMemory.

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

Note

Si l’appel à la fonction ZwAllocateVirtualMemory 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(storport), PowerIrpDDis(wdm), SpNoWait(storport), StorPortStartIo(storport)

Voir aussi

à l’aide de versions Nt et Zw des routines natives des services système

ZwFreeVirtualMemory