Funzione VirtualProtect (memoryapi.h)
Modifica la protezione in un'area di pagine di cui è stato eseguito il commit nello spazio degli indirizzi virtuali del processo chiamante.
Per modificare la protezione di accesso di qualsiasi processo, usare la funzione VirtualProtectEx .
Sintassi
BOOL VirtualProtect(
[in] LPVOID lpAddress,
[in] SIZE_T dwSize,
[in] DWORD flNewProtect,
[out] PDWORD lpflOldProtect
);
Parametri
[in] lpAddress
Indirizzo della pagina iniziale dell'area delle pagine i cui attributi di protezione di accesso devono essere modificati.
Tutte le pagine nell'area specificata devono trovarsi nella stessa area riservata allocata quando si chiama la funzione VirtualAlloc o VirtualAllocEx usando MEM_RESERVE. Le pagine non possono estendersi su aree riservate adiacenti allocate da chiamate separate a VirtualAlloc o VirtualAllocEx tramite MEM_RESERVE.
[in] dwSize
Dimensione dell'area i cui attributi di protezione di accesso devono essere modificati, in byte. L'area delle pagine interessate include tutte le pagine contenenti uno o più byte nell'intervallo compreso tra il parametro lpAddress e (lpAddress+dwSize)
. Ciò significa che un intervallo di 2 byte che si allontana da un limite di pagina fa sì che gli attributi di protezione di entrambe le pagine vengano modificati.
[in] flNewProtect
Opzione di protezione della memoria. Questo parametro può essere una delle costanti di protezione della memoria.
Per le visualizzazioni mappate, questo valore deve essere compatibile con la protezione di accesso specificata al momento del mapping della visualizzazione(vedere MapViewOfFile, MapViewOfFileEx e MapViewOfFileExNuma).
[out] lpflOldProtect
Puntatore a una variabile che riceve il valore di protezione dell'accesso precedente della prima pagina nell'area di pagine specificata. Se questo parametro è NULL o non punta a una variabile valida, la funzione ha esito negativo.
Valore restituito
Se la funzione ha esito positivo, il valore restituito è diverso da zero.
Se la funzione ha esito negativo, il valore restituito è zero. Per informazioni dettagliate sull'errore, chiamare GetLastError.
Commenti
È possibile impostare il valore di protezione di accesso solo nelle pagine di cui è stato eseguito il commit. Se lo stato di una pagina nell'area specificata non viene eseguito il commit, la funzione ha esito negativo e restituisce senza modificare la protezione di accesso di qualsiasi pagina nell'area specificata.
Il modificatore di protezione PAGE_GUARD stabilisce le pagine di protezione. Le pagine guard fungono da allarmi di accesso mono colpo. Per altre informazioni, vedere Creating Guard Pages (Creazione di guard page).
È consigliabile evitare di usare VirtualProtect per modificare le protezioni delle pagine nei blocchi di memoria allocati da GlobalAlloc, HeapAlloc o LocalAlloc, perché in una singola pagina possono esistere più blocchi di memoria. Il responsabile dell'heap presuppone che tutte le pagine dell'heap concedono almeno l'accesso in lettura e scrittura.
Quando si protegge un'area eseguibile, il programma chiamante è responsabile della coerenza della cache tramite una chiamata appropriata a FlushInstructionCache dopo che il codice è stato impostato. In caso contrario, i tentativi di eseguire codice dall'area appena eseguibile possono produrre risultati imprevedibili.
Requisiti
Client minimo supportato | Windows XP [app desktop | App UWP] |
Server minimo supportato | Windows Server 2003 [app desktop | App UWP] |
Piattaforma di destinazione | Windows |
Intestazione | memoryapi.h (include Windows.h, Memoryapi.h) |
Libreria | onecore.lib |
DLL | Kernel32.dll |
Vedere anche
Funzioni di gestione della memoria