ZwFreeVirtualMemory, fonction (ntifs.h)

La routine ZwFreeVirtualMemory libère, désengage, 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 résident les pages à libérer. 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 , BaseAddress doit être l’adresse de base retournée par ZwAllocateVirtualMemory lorsque la région était réservée.

[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 , la variable pointée par RegionSize doit être égale à zéro. ZwFreeVirtualMemory libère toute la région qui a été réservée dans l’appel d’allocation initial à ZwAllocateVirtualMemory.

Si l’indicateur de MEM_DECOMMIT est défini dans le paramètre FreeType , ZwFreeVirtualMemory déscommit toutes les pages mémoire qui contiennent un ou plusieurs octets dans la plage entre le paramètre BaseAddress et (BaseAddress + RegionSize). Cela signifie, par exemple, que si une région de mémoire de deux octets dépasse une limite de page, les deux pages sont décompatées.

ZwFreeVirtualMemory supprime la totalité de la région réservée par ZwAllocateVirtualMemory. Si les trois conditions suivantes sont remplies, l’ensemble de la région passe à 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 était 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 que ZwFreeVirtualMemory effectuera pour la région de pages spécifiée. Les valeurs possibles sont les suivantes :

  • MEM_DECOMMIT

    • ZwFreeVirtualMemory déscommit la région de pages spécifiée. Les pages entrent dans l’état réservé.

    • ZwFreeVirtualMemory n’échoue pas si vous tentez de supprimer une page non validée. Cela signifie que vous pouvez désengager 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 vers laquelle RegionSize pointe doit être égale à 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 commence par les désengagements, puis les libère.

ZwFreeVirtualMemory n’échoue pas si vous tentez de publier des pages qui se trouvent dans des états différents, certains réservés et d’autres validées. Cela signifie que vous pouvez publier une plage de pages sans déterminer au préalable leur état d’engagement actuel.

Valeur retournée

ZwFreeVirtualMemory retourne STATUS_SUCCESS ou une erreur status code. Les codes status d’erreur possibles incluent les éléments suivants.

Code de retour Description
STATUS_ACCESS_DENIED Un processus a demandé l’accès à un objet, mais ces droits d’accès n’ont pas été accordé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. Toute 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 les 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 aucun stockage physique associé. Toute 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 pour placer les pages de mémoire réservées à 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é à 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 à la première tentative de lecture ou d’écriture dans cette page.

    Lorsqu’un processus s’arrête, le système libère tout le stockage pour les pages validées.

    Vous pouvez utiliser ZwAllocateVirtualMemory pour placer les pages de mémoire validées dans l’état réservé ou libre.

ZwFreeVirtualMemory peut 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é.
  • Libérer une région de pages réservées. Après cette opération, les pages sont à l’état libre.
  • Désengagez et libérez une région de pages validées ou non validées. Après cette opération, les pages sont à l’état libre.

ZwFreeVirtualMemory peut annuler la validation d’une plage de pages qui se trouvent dans des états différents, certaines validées et d’autres non validées. Cela signifie que vous pouvez désengager 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, soit en mémoire, soit dans le fichier de pagination sur le disque.

Si une page est décommise, mais n’est pas publiée, son état passe à réservé. Vous pouvez ensuite appeler ZwFreeVirtualMemory pour le valider, ou ZwFreeVirtualMemory pour le libérer. Toute tentative de lecture ou d’écriture dans une page réservée entraîne une exception de violation d’accès.

ZwFreeVirtualMemory peut publier une plage de pages qui se trouvent dans des états différents, certaines réservées et d’autres validées. Cela signifie que vous pouvez publier une plage de pages sans déterminer au préalable l’état d’engagement actuel de chaque page. Toute la plage de pages initialement réservées par ZwAllocateVirtualMemory doit être publiée en même temps.

Si une page est publiée, son état passe à gratuit et est disponible pour les opérations d’allocation suivantes. Une fois la mémoire libérée ou libérée, vous ne pouvez plus jamais faire référence à la mémoire. Toutes les informations qui ont pu être dans cette mémoire ont disparu pour toujours. Toute 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ésengagez pas ou libérez la 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.

Notes

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

Pour les appels provenant de pilotes en mode noyau, les versions NtXxx et ZwXxx d’une routine Windows Native System Services peuvent se comporter différemment dans 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.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows 2000
Plateforme cible Universal
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)

Voir aussi

ZwAllocateVirtualMemory