Costanti di protezione della memoria

Di seguito sono riportate le opzioni di protezione della memoria; è necessario specificare uno dei valori seguenti durante l'allocazione o la protezione di una pagina in memoria. Gli attributi di protezione non possono essere assegnati a una parte di una pagina; possono essere assegnati solo a una pagina intera.

Esempio

STDMETHODIMP CExtBuffer::FInit
    (
    ULONG cItemMax,     //@parm IN | Maximum number of items ever
    ULONG cbItem,       //@parm IN | Size of each item, in bytes
    ULONG cbPage        //@parm IN | Size of system page size (from SysInfo)
    )
{
    BYTE  *pb;

    m_cbReserved = ((cbItem *cItemMax) / cbPage + 1) *cbPage;
    m_rgItem = (BYTE *) VirtualAlloc( NULL, m_cbReserved, MEM_RESERVE, PAGE_READWRITE );

    if (m_rgItem == NULL)
        return ResultFromScode( E_OUTOFMEMORY );

    m_cbItem  = cbItem;
    m_dbAlloc = (cbItem / cbPage + 1) *cbPage;
    pb = (BYTE *) VirtualAlloc( m_rgItem, m_dbAlloc, MEM_COMMIT, PAGE_READWRITE );
    if (pb == NULL)
        {
        VirtualFree((VOID *) m_rgItem, 0, MEM_RELEASE );
        m_rgItem = NULL;
        return ResultFromScode( E_OUTOFMEMORY );
        }

    m_cbAlloc = m_dbAlloc;
    return ResultFromScode( S_OK );
}

Esempio di esempi classici di Windows in GitHub.

Costanti

Costante/valore Descrizione
PAGE_EXECUTE
0x10
Consente di eseguire l'accesso all'area di commit delle pagine. Un tentativo di scrittura nell'area di commit comporta una violazione di accesso.
Questo flag non è supportato dalla funzione CreateFileMapping .
PAGE_EXECUTE_READ
0x20
Consente di eseguire o di sola lettura l'accesso all'area di commit delle pagine. Un tentativo di scrittura nell'area di commit comporta una violazione di accesso.
Windows Server 2003 e Windows XP: Questo attributo non è supportato dalla funzione CreateFileMapping finché Windows XP con SP2 e Windows Server 2003 con SP1.
PAGE_EXECUTE_READWRITE
0x40
Consente l'esecuzione, la sola lettura o l'accesso in lettura/scrittura all'area di commit delle pagine.
Windows Server 2003 e Windows XP: Questo attributo non è supportato dalla funzione CreateFileMapping finché Windows XP con SP2 e Windows Server 2003 con SP1.
PAGE_EXECUTE_WRITECOPY
0x80
Abilita l'accesso in scrittura, di sola lettura o di esecuzione a una visualizzazione mappata di un oggetto mapping di file. Un tentativo di scrittura in una pagina di scrittura di copia con commit comporta una copia privata della pagina eseguita per il processo. La pagina privata viene contrassegnata come PAGE_EXECUTE_READWRITE e la modifica viene scritta nella nuova pagina.
Questo flag non è supportato dalle funzioni VirtualAlloc o VirtualAllocEx. Windows Vista, Windows Server 2003 e Windows XP: Questo attributo non è supportato dalla funzione CreateFileMapping finché Windows Vista con SP1 e Windows Server 2008.

PAGE_NOACCESS
0x01
Disabilita tutti gli accessi all'area di commit delle pagine. Un tentativo di lettura, scrittura o esecuzione dell'area di commit genera una violazione di accesso.
Questo flag non è supportato dalla funzione CreateFileMapping .
PAGE_READONLY
0x02
Abilita l'accesso in sola lettura all'area di commit delle pagine. Un tentativo di scrittura nell'area di commit comporta una violazione di accesso. Se la prevenzione dell'esecuzione dei dati è abilitata, un tentativo di esecuzione del codice nell'area di commit comporta una violazione di accesso.
PAGE_READWRITE
0x04
Abilita l'accesso in sola lettura o scrittura all'area di commit delle pagine. Se la prevenzione dell'esecuzione dei dati è abilitata, il tentativo di eseguire il codice nell'area di commit comporta una violazione di accesso.
PAGE_WRITECOPY
0x08
Abilita l'accesso in sola lettura o in scrittura a una visualizzazione mappata di un oggetto di mapping dei file. Un tentativo di scrittura in una pagina di scrittura di copia con commit comporta una copia privata della pagina eseguita per il processo. La pagina privata viene contrassegnata come PAGE_READWRITE e la modifica viene scritta nella nuova pagina. Se la prevenzione dell'esecuzione dei dati è abilitata, il tentativo di eseguire il codice nell'area di commit comporta una violazione di accesso.
Questo flag non è supportato dalle funzioni VirtualAlloc o VirtualAllocEx.
PAGE_TARGETS_INVALID
0x40000000
Imposta tutte le posizioni nelle pagine come destinazioni non valide per CFG. Usato insieme a qualsiasi protezione della pagina di esecuzione, ad esempio PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE e PAGE_EXECUTE_WRITECOPY. Qualsiasi chiamata indiretta alle posizioni di tali pagine avrà esito negativo sui controlli CFG e il processo verrà terminato. Il comportamento predefinito per le pagine eseguibili allocato deve essere contrassegnato come destinazioni di chiamata valide per CFG.
Questo flag non è supportato dalle funzioni VirtualProtect o CreateFileMapping .
PAGE_TARGETS_NO_UPDATE
0x40000000
Le pagine nell'area non avranno le informazioni cfG aggiornate mentre la protezione cambia per VirtualProtect. Ad esempio, se le pagine nell'area sono state allocate usando PAGE_TARGETS_INVALID, le informazioni non valide verranno mantenute mentre la protezione della pagina cambia. Questo flag è valido solo quando la protezione cambia in un tipo eseguibile come PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE e PAGE_EXECUTE_WRITECOPY. Il comportamento predefinito per la protezione di VirtualProtect cambia in file eseguibile consiste nel contrassegnare tutte le posizioni come destinazioni di chiamata valide per CFG.

Di seguito sono riportati i modificatori che possono essere usati oltre alle opzioni fornite nella tabella precedente, ad eccezione di quanto indicato.

Costante/valore Descrizione
PAGE_GUARD
0x100
Le pagine nell'area diventano pagine guardie. Qualsiasi tentativo di accesso a una pagina di protezione causa la generazione di un'eccezione STATUS_GUARD_PAGE_VIOLATION e la disattivazione dello stato della pagina di protezione. Le pagine guard agiscono quindi come allarme di accesso one-time. Per altre informazioni, vedere Creating Guard Pages (Creazione di guard page).
Quando un tentativo di accesso porta il sistema a disattivare lo stato della pagina guard, la protezione della pagina sottostante assume il ruolo.
Se si verifica un'eccezione di pagina guard durante un servizio di sistema, il servizio restituisce in genere un indicatore di stato di errore.
Questo valore non può essere usato con PAGE_NOACCESS.
Questo flag non è supportato dalla funzione CreateFileMapping .
PAGE_NOCACHE
0x200
Imposta tutte le pagine da non cachable. Le applicazioni non devono usare questo attributo tranne quando è necessario in modo esplicito per un dispositivo. L'uso delle funzioni interlock con memoria mappata con SEC_NOCACHE può causare un'eccezione EXCEPTION_ILLEGAL_INSTRUCTION .
Impossibile usare il flag PAGE_NOCACHE con i flag PAGE_GUARD, PAGE_NOACCESS o PAGE_WRITECOMBINE.
Il flag di PAGE_NOCACHE può essere usato solo quando si alloca la memoria privata con le funzioni VirtualAlloc, VirtualAllocEx o VirtualAllocExNuma. Per abilitare l'accesso alla memoria non memorizzata nella cache per la memoria condivisa, specificare il flag SEC_NOCACHE quando si chiama la funzione CreateFileMapping .
PAGE_WRITECOMBINE
0x400
Imposta tutte le pagine da combinare in scrittura.
Le applicazioni non devono usare questo attributo tranne quando è necessario in modo esplicito per un dispositivo. L'uso delle funzioni interlock con memoria mappata come scrittura combinata può causare un'eccezione EXCEPTION_ILLEGAL_INSTRUCTION .
Impossibile specificare il flag PAGE_WRITECOMBINE con i flag PAGE_NOACCESS, PAGE_GUARD e PAGE_NOCACHE.
Il flag di PAGE_WRITECOMBINE può essere usato solo quando si alloca la memoria privata con le funzioni VirtualAlloc, VirtualAllocEx o VirtualAllocExNuma. Per abilitare l'accesso alla memoria combinata in scrittura per la memoria condivisa, specificare il flag di SEC_WRITECOMBINE quando si chiama la funzione CreateFileMapping .
Windows Server 2003 e Windows XP: Questo flag non è supportato fino a Windows Server 2003 con SP1.

Le costanti seguenti possono essere usate solo con la funzione supportata quando si specifica un enclave con l'architettura SGX (Intel Software Guard Extensions).

Costante Descrizione Funzione supportata
PAGE_ENCLAVE_DECOMMIT
Indica che la pagina sarà protetta per impedire un ulteriore uso in un enclave.
Questo flag non deve essere combinato con altri flag.
Questo flag è valido solo per le enclave SGX2.
VirtualProtect
PAGE_ENCLAVE_THREAD_CONTROL
La pagina contiene una struttura di controllo thread (TCS).
LoadEnclaveData
VirtualProtect
PAGE_ENCLAVE_UNVALIDATED
Il contenuto della pagina fornito viene escluso dalla misurazione con l'istruzione EEXTEND del modello di programmazione Intel SGX.
LoadEnclaveData

Requisiti

Requisito Valore
Client minimo supportato
Windows XP [solo app desktop]
Server minimo supportato
Windows Server 2003 [solo app desktop]
Intestazione
WinNT.h (include Windows.h)

Vedi anche

CreateFileMapping

Protezione della memoria

Virtualalloc

VirtualAllocEx

LoadEnclaveData