Fonction VirtualProtectFromApp (memoryapi.h)

Modifie la protection sur une région de pages validées dans l’espace d’adressage virtuel du processus d’appel.

Syntaxe

BOOL VirtualProtectFromApp(
  [in]  PVOID  Address,
  [in]  SIZE_T Size,
  [in]  ULONG  NewProtection,
  [out] PULONG OldProtection
);

Paramètres

[in] Address

Pointeur : adresse qui décrit la page de départ de la région de pages dont les attributs de protection d’accès doivent être modifiés.

Toutes les pages de la région spécifiée doivent se trouver dans la même région réservée allouée lors de l’appel de la fonction VirtualAlloc, VirtualAllocFromApp ou VirtualAllocEx à l’aide de MEM_RESERVE. Les pages ne peuvent pas couvrir les régions réservées adjacentes qui ont été allouées par des appels distincts à VirtualAlloc, VirtualAllocFromApp ou VirtualAllocEx à l’aide de MEM_RESERVE.

[in] Size

Taille de la région dont les attributs de protection d’accès doivent être modifiés, en octets. La région des pages affectées inclut toutes les pages contenant un ou plusieurs octets dans la plage du paramètre Address à (Address+Size). Cela signifie qu’une plage de 2 octets chevauchant une limite de page entraîne la modification des attributs de protection des deux pages.

[in] NewProtection

Option de protection de la mémoire. Ce paramètre peut être l’une des constantes de protection de la mémoire.

Pour les vues mappées, cette valeur doit être compatible avec la protection d’accès spécifiée lors du mappage de la vue (consultez MapViewOfFile, MapViewOfFileEx et MapViewOfFileExNuma).

Les constantes suivantes génèrent une erreur :

  • PAGE_EXECUTE_READWRITE
  • PAGE_EXECUTE_WRITECOPY
Les constantes suivantes sont autorisées uniquement pour les applications qui ont la fonctionnalité codeGeneration :
  • PAGE_EXECUTE
  • PAGE_EXECUTE_READ

[out] OldProtection

Pointeur vers une variable qui reçoit la valeur de protection d’accès précédente de la première page dans la région de pages spécifiée. Si ce paramètre a la valeur NULL ou ne pointe pas vers une variable valide, la fonction échoue.

Valeur retournée

Si la fonction réussit, la valeur de retour est différente de zéro.

Si la fonction échoue, la valeur de retour est égale à zéro. Pour obtenir des informations détaillées sur l’erreur, appelez GetLastError.

Remarques

Vous pouvez appeler VirtualProtectFromApp à partir d’applications du Windows Store avec des fonctionnalités juste-à-temps (JIT) pour utiliser la fonctionnalité JIT. L’application doit inclure la fonctionnalité codeGeneration dans le fichier manifeste de l’application pour utiliser les fonctionnalités JIT.

Vous pouvez définir la valeur de protection d’accès uniquement sur les pages validées. Si l’état d’une page dans la région spécifiée n’est pas validé, la fonction échoue et retourne sans modifier la protection d’accès des pages de la région spécifiée.

Le modificateur de protection PAGE_GUARD établit des pages de protection. Les pages de protection agissent comme des alarmes d’accès one-shot. Pour plus d’informations, consultez Création de pages de garde.

Il est préférable d’éviter d’utiliser VirtualProtectFromApp pour modifier les protections de page sur les blocs de mémoire alloués par GlobalAlloc, HeapAlloc ou LocalAlloc, car plusieurs blocs de mémoire peuvent exister sur une même page. Le gestionnaire de tas suppose que toutes les pages du tas accordent au moins un accès en lecture et en écriture.

VirtualProtectFromApp vous permet de marquer les pages comme exécutables, mais ne vous permet pas de définir les autorisations d’écriture et d’exécution en même temps.

Lors de la protection d’une région qui sera exécutable, le programme appelant a la responsabilité de garantir la cohérence du cache via un appel approprié à FlushInstructionCache une fois que le code a été défini en place. Sinon, les tentatives d’exécution du code à partir de la région nouvellement exécutable peuvent produire des résultats imprévisibles.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows 10 [applications de bureau | Applications UWP]
Serveur minimal pris en charge Windows Server 2016 [applications de bureau | Applications UWP]
Plateforme cible Windows
En-tête memoryapi.h (inclure Windows.h)
Bibliothèque WindowsApp.lib
DLL Kernel32.dll

Voir aussi

Fonctions de gestion de la mémoire

Fonctions de mémoire virtuelle

VirtualAllocFromApp

VirtualProtect

VirtualProtectEx