Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
La NtFreeVirtualMemory versions de routine, decommits ou à la fois des versions et des décommits, une région de pages dans l’espace d’adressage virtuel d’un processus spécifié.
Syntaxe
__kernel_entry NTSYSCALLAPI NTSTATUS NtFreeVirtualMemory(
[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 base 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 NtAllocateVirtualMemory 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 *FreeType, *RegionSize doit être égal à zéro. NtFreeVirtualMemory libère toute la région réservée dans l’appel d’allocation initial pour NtAllocateVirtualMemory.
Si l’indicateur MEM_DECOMMIT est défini dans *FreeType, NtFreeVirtualMemory décommit toutes les pages de mémoire qui contiennent un ou plusieurs octets de la plage de *BaseAddress à (*BaseAddress + *RegionSize). 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.
NtFreeVirtualMemory décommit la région entière réservée par NtAllocateVirtualMemory. 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 NtAllocateVirtualMemory lorsque la région a été réservée.
- *RegionSize est égal à zéro.
[in] FreeType
Masque de bits contenant des indicateurs qui décrivent le type d’opération libre qui NtFreeVirtualMemory s’exécute pour la région de pages spécifiée. Les valeurs possibles sont répertoriées dans le tableau suivant.
Valeur de retour
NtFreeVirtualMemory 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 dans le tableau suivant.
| État | Signification |
|---|---|
| LIBRE | 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 NtFreeVirtualMemory pour placer des pages réservées ou validées dans l’état libre. |
| 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 NtFreeVirtualMemory 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. |
| ENGAGÉ | 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 NtAllocateVirtualMemory pour placer des pages de mémoire validées dans l’état réservé ou libre. |
NtFreeVirtualMemory 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é.
- 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.
NtFreeVirtualMemory 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 NtAllocateVirtualMemory pour le valider, ou NtFreeVirtualMemory la libérer. La tentative de lecture ou d’écriture dans une page réservée entraîne une exception de violation d’accès.
NtFreeVirtualMemory peut libérer une plage de pages qui se trouvent dans différents états, 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. La plage entière de pages réservées à l’origine par NtAllocateVirtualMemory 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 NtFreeVirtualMemory 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, PowerIrpDDis |