ZwFreeVirtualMemory, fonction (ntifs.h)
La ZwFreeVirtualMemory versions de routine, decommits ou les deux, une région de pages dans l’espace d’adressage virtuel d’un processus spécifié.
Syntaxe
NTSYSAPI NTSTATUS ZwFreeVirtualMemory(
[in] HANDLE ProcessHandle,
[in, out] PVOID *BaseAddress,
[in, out] PSIZE_T RegionSize,
[in] ULONG FreeType
);
Paramètres
[in] ProcessHandle
Handle pour le processus dans lequel les pages à libérer résident. 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 virtuelle de la région libérée des pages.
Si l’indicateur MEM_RELEASE est défini dans le paramètre FreeType
[in, out] RegionSize
Pointeur vers une variable qui recevra la taille réelle, en octets, de la région libérée des pages. La routine arrondit la valeur initiale de cette variable jusqu’à la limite de taille de page hôte suivante et écrit la valeur arrondie dans cette variable.
Si l’indicateur MEM_RELEASE est défini dans le paramètre FreeType
Si l’indicateur de MEM_DECOMMIT est défini dans le paramètre FreeType
ZwFreeVirtualMemory décommit toute la région réservée par ZwAllocateVirtualMemory. Si les trois conditions suivantes sont remplies, la région entière entre dans l’état réservé :
- L’indicateur MEM_DECOMMIT est défini.
- baseAddress est l’adresse de base retournée par ZwAllocateVirtualMemory lorsque la région a été réservée.
- RegionSize< est égal à zéro.
[in] FreeType
Masque de bits qui contient des indicateurs qui décrivent le type d’opération libre qui ZwFreeVirtualMemory s’effectue pour la région spécifiée de pages. Les valeurs possibles sont les suivantes :
MEM_DECOMMIT
ZwFreeVirtualMemory décommit la région de pages spécifiée. Les pages entrent dans l’état réservé.
ZwFreeVirtualMemory ne échoue pas si vous tentez de supprimer une page non validée. Cela signifie que vous pouvez décommit une plage de pages sans d’abord déterminer leur état d’engagement actuel.
MEM_RELEASE
ZwFreeVirtualMemory libère la région de pages spécifiée. Les pages entrent dans l’état libre.
Si vous spécifiez cet indicateur, la variable qui RegionSize points doit être zéro et BaseAddress doit pointer vers l’adresse de base retournée par ZwAllocateVirtualMemory lorsque la région a été réservée. ZwFreeVirtualMemory échoue si l’une de ces conditions n’est pas remplie.
Si des pages de la région sont actuellement validées, ZwFreeVirtualMemory les décommits d’abord, puis les libère.
ZwFreeVirtualMemory n’échoue pas si vous essayez de publier des pages qui se trouvent dans des états différents, certains réservés et certains validés. Cela signifie que vous pouvez libérer une plage de pages sans d’abord déterminer leur état d’engagement actuel.
Valeur de retour
ZwFreeVirtualMemory retourne STATUS_SUCCESS ou un code d’état d’erreur. Les codes d’état d’erreur possibles sont les suivants.
Retourner le code | Description |
---|---|
STATUS_ACCESS_DENIED | Un processus a demandé l’accès à un objet, mais n’a pas reçu ces droits d’accès. |
STATUS_INVALID_HANDLE | Une valeur ProcessHandle non valide a été spécifiée. |
STATUS_OBJECT_TYPE_MISMATCH | Il existe une incompatibilité entre le type d’objet requis par l’opération demandée et le type d’objet spécifié dans la requête. |
Remarques
Chaque page de l’espace d’adressage virtuel du processus se trouve dans l’un des trois états décrits comme suit.
L’état est GRATUIT
La page n’est ni validée ni réservée. La page n’est pas accessible au processus. La tentative de lecture ou d’écriture dans une page gratuite entraîne une exception de violation d’accès.
Vous pouvez utiliser ZwFreeVirtualMemory pour placer des pages réservées ou validées dans l’état libre.
L’état est RÉSERVÉ
La page est réservée. La plage d’adresses ne peut pas être utilisée par d’autres fonctions d’allocation. La page n’est pas accessible au processus et n’a pas de stockage physique associé. La tentative de lecture ou d’écriture dans une page réservée entraîne une exception de violation d’accès.
Vous pouvez utiliser ZwFreeVirtualMemory pour placer les pages de mémoire validées dans l’état réservé et placer les pages de mémoire réservée dans l’état libre.
L’état est COMMITTED
La page est validée. Le stockage physique en mémoire ou dans le fichier de pagination sur le disque est alloué pour 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.
Lorsqu’un processus se termine, le système libère tout le stockage des pages validées.
Vous pouvez utiliser ZwAllocateVirtualMemory pour placer des pages de mémoire validées dans l’état réservé ou libre.
ZwFreeVirtualMemory pouvez effectuer les opérations suivantes :
- Décommit une région de pages validées ou non validées. Après cette opération, les pages sont dans l’état réservé.
- Relâchez une région de pages réservées. Après cette opération, les pages sont dans l’état libre.
- Décommit et relâchez une région de pages validées ou non validées. Après cette opération, les pages sont dans l’état libre.
ZwFreeVirtualMemory peut décommit une plage de pages qui se trouvent dans différents états, certaines validées et certaines non validées. Cela signifie que vous pouvez décommit une plage de pages sans d’abord déterminer l’état d’engagement actuel de chaque page. La suppression d’une page libère son stockage physique, en mémoire ou dans le fichier de pagination sur le disque.
Si une page est validée mais non publiée, son état passe à réservé. Vous pouvez ensuite appeler ZwFreeVirtualMemory pour le valider, ou ZwFreeVirtualMemory le libérer. La tentative de lecture ou d’écriture dans une page réservée entraîne une exception de violation d’accès.
ZwFreeVirtualMemory peut libérer une plage de pages qui se trouvent dans des états différents, certains réservés et certains validés. Cela signifie que vous pouvez libérer une plage de pages sans d’abord déterminer l’état d’engagement actuel de chaque page. Toute la plage de pages réservées à l’origine par ZwAllocateVirtualMemory doit être publiée en même temps.
Si une page est publiée, son état devient gratuit et il est disponible pour les opérations d’allocation suivantes. Une fois la mémoire libérée ou validée, vous ne pouvez jamais faire référence à la mémoire. Toutes les informations qui ont pu être dans cette mémoire sont toujours passées. La tentative de lecture ou d’écriture dans une page gratuite entraîne une exception de violation d’accès. Si vous avez besoin d’informations, ne décommit pas ou ne libérez pas de mémoire qui contient ces informations.
Pour plus d’informations sur la prise en charge de la gestion de la mémoire pour les pilotes en mode noyau, consultez Gestion de la mémoire pour les pilotes Windows.
Note
Si l’appel à la fonction ZwFreeVirtualMemory se produit en mode utilisateur, vous devez utiliser le nom «NtFreeVirtualMemory» au lieu de «ZwFreeVirtualMemory».
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, Fltkernel.h) |
bibliothèque | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
règles de conformité DDI | HwStorPortProhibitedDDIs(storport), PowerIrpDDis(wdm) |