記憶體保護常數

以下是記憶體保護選項;配置或保護記憶體中的頁面時,您必須指定下列其中一個值。 保護屬性無法指派給頁面的一部分;它們只能指派給整個頁面。

範例

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 );
}

從 GitHub 上的 Windows 傳統範例加以範例

常數

常數/值 Description
PAGE_EXECUTE
0x10
啟用對已認可頁面區域的執行存取。 嘗試寫入已認可的區域會導致存取違規。
CreateFileMapping函式不支援此旗標。
PAGE_EXECUTE_READ
0x20
啟用對已認可頁面區域的執行或唯讀存取。 嘗試寫入已認可的區域會導致存取違規。
Windows Server 2003 和 Windows XP:CreateFileMapping函式不支援此屬性,直到 Windows XP SP2 和 Windows Server 2003 SP1 為止。
PAGE_EXECUTE_READWRITE
0x40
啟用對已認可頁面區域的執行、唯讀或讀取/寫入存取權。
Windows Server 2003 和 Windows XP:CreateFileMapping函式不支援此屬性,直到 Windows XP SP2 和 Windows Server 2003 SP1 為止。
PAGE_EXECUTE_WRITECOPY
0x80
對檔案對應物件的對應檢視啟用執行、唯讀或複製寫入權限。 嘗試在寫入頁面上寫入認可的複本,會導致針對進程建立頁面的私人複本。 私人頁面會標示為 PAGE_EXECUTE_READWRITE,並將變更寫入新頁面。
VirtualAllocVirtualAllocEx函式不支援此旗標。 Windows Vista、Windows Server 2003 和 Windows XP: 在具有 SP1 和 Windows Server 2008 的 Windows Vista 之前, CreateFileMapping 函式不支援此屬性。

PAGE_NOACCESS
0x01
停用對已認可頁面區域的所有存取。 嘗試讀取、寫入或執行認可的區域會導致存取違規。
CreateFileMapping函式不支援此旗標。
PAGE_READONLY
0x02
啟用對已認可頁面區域的唯讀存取。 嘗試寫入已認可的區域會導致存取違規。 如果已啟用 資料執行防止 ,嘗試在認可區域中執行程式碼會導致存取違規。
PAGE_READWRITE
0x04
啟用對已認可頁面區域的唯讀或讀取/寫入存取。 如果已啟用 資料執行防止 ,嘗試在認可區域中執行程式碼會導致存取違規。
PAGE_WRITECOPY
0x08
啟用檔案對應物件的對應檢視的唯讀或寫入時複製存取權。 嘗試在寫入頁面上寫入認可的複本,會導致針對進程建立頁面的私人複本。 私人頁面會標示為 PAGE_READWRITE,並將變更寫入新頁面。 如果已啟用 資料執行防止 ,嘗試在認可區域中執行程式碼會導致存取違規。
VirtualAllocVirtualAllocEx函式不支援此旗標。
PAGE_TARGETS_INVALID
0x40000000
將頁面中的所有位置設定為 CFG 不正確目標。 與任何執行頁面保護搭配使用,例如 PAGE_EXECUTEPAGE_EXECUTE_READPAGE_EXECUTE_READWRITEPAGE_EXECUTE_WRITECOPY。 對這些頁面中位置的任何間接呼叫都會失敗 CFG 檢查,且程式將會終止。 配置之可執行檔頁面的預設行為是標示 CFG 的有效呼叫目標。
VirtualProtectCreateFileMapping函式不支援此旗標。
PAGE_TARGETS_NO_UPDATE
0x40000000
區域中的頁面在 VirtualProtect的保護變更時,不會更新其 CFG 資訊。 例如,如果區域中的頁面是使用 PAGE_TARGETS_INVALID來配置,則會在頁面保護變更時維護不正確資訊。 只有當保護變更為可執行檔案類型時,此旗標才有效,例如PAGE_EXECUTE、PAGE_EXECUTE_READ、PAGE_EXECUTE_READWRITEPAGE_EXECUTE_WRITECOPY VirtualProtect保護變更為可執行檔的預設行為是將所有位置標示為 CFG 的有效呼叫目標。

以下是除了上表提供的選項以外,還可以使用的修飾詞。

常數/值 Description
PAGE_GUARD
0x100
區域中的頁面會變成防護頁面。 任何嘗試存取防護頁面都會導致系統引發 STATUS_GUARD_PAGE_VIOLATION例外狀況 ,並關閉防護頁面狀態。 因此,防護頁面會作為一次性存取警示。 如需詳細資訊,請參閱 Creating Guard Pages (建立防護頁面)。
當存取嘗試導致系統關閉防護頁面狀態時,基礎頁面保護會接管。
如果在系統服務期間發生防護頁面例外狀況,服務通常會傳回失敗狀態指示器。
這個值不能與 PAGE_NOACCESS搭配使用。
CreateFileMapping函式不支援此旗標。
PAGE_NOCACHE
0x200
將所有頁面設定為不可快取。 應用程式不應該使用此屬性,除非裝置明確需要時。 使用與 SEC_NOCACHE 對應記憶體的內嵌函式可能會導致 EXCEPTION_ILLEGAL_INSTRUCTION 例外狀況。
PAGE_NOCACHE旗標不能與PAGE_GUARDPAGE_NOACCESSPAGE_WRITECOMBINE旗標搭配使用。
只有在配置具有VirtualAlloc、VirtualAllocExVirtualAllocExNuma函式的私人記憶體時,才能使用PAGE_NOCACHE旗標。 若要啟用共用記憶體的非快取記憶體存取,請在呼叫CreateFileMapping函式時指定SEC_NOCACHE旗標。
PAGE_WRITECOMBINE
0x400
設定要合併的所有頁面。
應用程式不應該使用此屬性,除非裝置明確需要時。 使用內嵌函式搭配對應為寫入合併的記憶體,可能會導致 EXCEPTION_ILLEGAL_INSTRUCTION例外狀況
無法使用PAGE_NOACCESSPAGE_GUARD和PAGE_NOCACHE旗標來指定PAGE_WRITECOMBINE旗標。
只有在使用VirtualAlloc、VirtualAllocExVirtualAllocExNuma函式配置私人記憶體時,才能使用PAGE_WRITECOMBINE旗標。 若要啟用共用記憶體的寫入合併記憶體存取,請在呼叫CreateFileMapping函式時指定SEC_WRITECOMBINE旗標。
Windows Server 2003 和 Windows XP: 在 Windows Server 2003 SP1 之前,不支援此旗標。

當您指定具有 Intel Software Guard Extensions (SGX) 架構的記憶體保護區時,下列常數只能與支援的函式搭配使用。

常數 描述 支援的函式
PAGE_ENCLAVE_DECOMMIT
表示頁面將會受到保護,以防止在記憶體保護區中進一步使用。
此旗標不得與任何其他旗標結合。
此旗標僅適用于 SGX2 記憶體保護區。
VirtualProtect
PAGE_ENCLAVE_THREAD_CONTROL
此頁面包含 TCS) (執行緒控制項結構。
LoadEnclaveData
VirtualProtect
PAGE_ENCLAVE_UNVALIDATED
您提供的頁面內容會從使用 Intel SGX 程式設計模型的 EEXTEND 指令進行測量時排除。
LoadEnclaveData

規格需求

需求
最低支援的用戶端
Windows XP [僅限傳統型應用程式]
最低支援的伺服器
Windows Server 2003 [僅限傳統型應用程式]
標頭
WinNT.h (包含 Windows.h)

另請參閱

CreateFileMapping

記憶體保護

VirtualAlloc

VirtualAllocEx

LoadEnclaveData