VirtualFreeEx, fonction (memoryapi.h)
Libère, désengage ou libère et désengage une région de mémoire dans l’espace d’adressage virtuel d’un processus spécifié.
Syntaxe
BOOL VirtualFreeEx(
[in] HANDLE hProcess,
[in] LPVOID lpAddress,
[in] SIZE_T dwSize,
[in] DWORD dwFreeType
);
Paramètres
[in] hProcess
Handle d’un processus. La fonction libère de la mémoire dans l’espace d’adressage virtuel du processus.
Le handle doit avoir le droit d’accès PROCESS_VM_OPERATION . Pour plus d’informations, consultez Droits d’accès et de sécurité des processus.
[in] lpAddress
Pointeur vers l’adresse de départ de la région de mémoire à libérer.
Si le paramètre dwFreeType est MEM_RELEASE, lpAddress doit être l’adresse de base retournée par la fonction VirtualAllocEx lorsque la région est réservée.
[in] dwSize
Taille de la région de mémoire à libérer, en octets.
Si le paramètre dwFreeType est MEM_RELEASE, dwSize doit être égal à 0 (zéro). La fonction libère toute la région qui est réservée dans l’appel d’allocation initial à VirtualAllocEx.
Si dwFreeType est MEM_DECOMMIT, la fonction désactive toutes les pages mémoire qui contiennent un ou plusieurs octets dans la plage allant du paramètre lpAddress à (lpAddress+dwSize)
. Cela signifie, par exemple, qu’une zone de mémoire de 2 octets qui chevauche une limite de page entraîne la décompression des deux pages. Si lpAddress est l’adresse de base retournée par VirtualAllocEx et que dwSize a la valeur 0 (zéro), la fonction désactive la région entière allouée par VirtualAllocEx. Après cela, toute la région est dans l’état réservé.
[in] dwFreeType
Type d’opération gratuite. Ce paramètre peut prendre les valeurs suivantes.
Valeur | Signification |
---|---|
|
Déscommit la région spécifiée des pages validées. Après l’opération, les pages sont dans l’état réservé.
La fonction n’échoue pas si vous tentez de supprimer une page non validée. Cela signifie que vous pouvez désengagement d’une plage de pages sans d’abord déterminer l’état de l’engagement actuel. La valeur MEM_DECOMMIT n’est pas prise en charge lorsque le paramètre lpAddress fournit l’adresse de base d’une enclave. Cela est vrai pour les enclaves qui ne prennent pas en charge la gestion dynamique de la mémoire (par exemple, SGX1). Les enclaves SGX2 autorisent MEM_DECOMMIT n’importe où dans l’enclave. |
|
Libère la région de pages spécifiée ou l’espace réservé (pour un espace réservé, l’espace d’adressage est libéré et disponible pour d’autres allocations). Après cette opération, les pages sont à l’état libre.
Si vous spécifiez cette valeur, dwSize doit être égal à 0 (zéro) et lpAddress doit pointer vers l’adresse de base retournée par la fonction VirtualAlloc lorsque la région est réservée. La fonction échoue si l’une de ces conditions n’est pas remplie. Si des pages de la région sont validées actuellement, la fonction les désengage d’abord, puis les libère. La fonction n’échoue pas si vous tentez de libérer 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 l’état de l’engagement actuel. |
Lorsque vous utilisez MEM_RELEASE, ce paramètre peut également spécifier l’une des valeurs suivantes.
Valeur | Signification |
---|---|
|
Pour fusionner deux espaces réservés adjacents, spécifiez MEM_RELEASE | MEM_COALESCE_PLACEHOLDERS . Lorsque vous fusionnez des espaces réservés, lpAddress et dwSize doivent correspondre exactement à la plage globale des espaces réservés à fusionner.
|
|
Libère une allocation dans un espace réservé (après avoir remplacé un espace réservé par une allocation privée à l’aide de VirtualAlloc2 ou Virtual2AllocFromApp).
Pour fractionner un espace réservé en deux espaces réservés, spécifiez |
Valeur retournée
Si la fonction réussit, la valeur de retour est une valeur différente de zéro.
Si la fonction échoue, la valeur de retour est zéro (0). Pour obtenir des informations détaillées sur l’erreur, appelez GetLastError.
Remarques
Chaque page de mémoire d’un espace d’adressage virtuel de processus a un état page. La fonction VirtualFreeEx peut supprimer une plage de pages qui se trouvent dans des états différents, certains validés et d’autres non validés. 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é. Par la suite, vous pouvez appeler VirtualAllocEx pour le valider, ou VirtualFreeEx 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.
La fonction VirtualFreeEx peut libérer une plage de 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 l’état d’engagement actuel de chaque page. Toute la plage de pages initialement réservées par VirtualAllocEx 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. Les tentatives de lecture ou d’écriture dans une page gratuite entraînent une exception de violation d’accès. Si vous avez besoin de conserver des informations, ne désengagez pas ou libérez la mémoire qui contient les informations.
La fonction VirtualFreeEx peut être utilisée sur une région de mémoire AWE et invalide tous les mappages de pages physiques dans la région lors de la libération de l’espace d’adressage. Toutefois, les pages physiques ne sont pas supprimées et l’application peut les utiliser. L’application doit appeler explicitement FreeUserPhysicalPages pour libérer les pages physiques. Lorsque le processus est terminé, toutes les ressources sont automatiquement nettoyées.
Windows 10, version 1709 et ultérieures et Windows 11 : pour supprimer l’enclave lorsque vous avez terminé de l’utiliser, appelez DeleteEnclave. Vous ne pouvez pas supprimer une enclave VBS en appelant la fonction VirtualFree ou VirtualFreeEx . Vous pouvez toujours supprimer une enclave SGX en appelant VirtualFree ou VirtualFreeEx.
Windows 10, version 1507, Windows 10, version 1511, Windows 10, version 1607 et Windows 10, version 1703 : pour supprimer l’enclave lorsque vous avez terminé de l’utiliser, appelez la fonction VirtualFree ou VirtualFreeEx et spécifiez les valeurs suivantes :
- Adresse de base de l’enclave pour le paramètre lpAddress .
- 0 pour le paramètre dwSize .
- MEM_RELEASE pour le paramètre dwFreeType .
Configuration requise
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Windows XP [applications de bureau | applications UWP] |
Serveur minimal pris en charge | Windows Server 2003 [applications de bureau | applications UWP] |
Plateforme cible | Windows |
En-tête | memoryapi.h (inclure Windows.h, Memoryapi.h) |
Bibliothèque | onecore.lib |
DLL | Kernel32.dll |
Voir aussi
Fonctions de gestion de la mémoire