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