Partager via


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 , BaseAddress doit être l’adresse de base retournée par ZwAllocateVirtualMemory lorsque la région a été 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 réservée dans l’appel d’allocation initial pour ZwAllocateVirtualMemory.

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

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)

Voir aussi

ZwAllocateVirtualMemory