記憶體保護常數
以下是記憶體保護選項;配置或保護記憶體中的頁面時,您必須指定下列其中一個值。 保護屬性無法指派給頁面的一部分;它們只能指派給整個頁面。
範例
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 |
---|---|
|
啟用對已認可頁面區域的執行存取。 嘗試寫入已認可的區域會導致存取違規。 CreateFileMapping函式不支援此旗標。 |
|
啟用對已認可頁面區域的執行或唯讀存取。 嘗試寫入已認可的區域會導致存取違規。 Windows Server 2003 和 Windows XP:CreateFileMapping函式不支援此屬性,直到 Windows XP SP2 和 Windows Server 2003 SP1 為止。 |
|
啟用對已認可頁面區域的執行、唯讀或讀取/寫入存取權。 Windows Server 2003 和 Windows XP:CreateFileMapping函式不支援此屬性,直到 Windows XP SP2 和 Windows Server 2003 SP1 為止。 |
|
對檔案對應物件的對應檢視啟用執行、唯讀或複製寫入權限。 嘗試在寫入頁面上寫入認可的複本,會導致針對進程建立頁面的私人複本。 私人頁面會標示為 PAGE_EXECUTE_READWRITE,並將變更寫入新頁面。 VirtualAlloc或VirtualAllocEx函式不支援此旗標。 Windows Vista、Windows Server 2003 和 Windows XP: 在具有 SP1 和 Windows Server 2008 的 Windows Vista 之前, CreateFileMapping 函式不支援此屬性。 |
|
停用對已認可頁面區域的所有存取。 嘗試讀取、寫入或執行認可的區域會導致存取違規。 CreateFileMapping函式不支援此旗標。 |
|
啟用對已認可頁面區域的唯讀存取。 嘗試寫入已認可的區域會導致存取違規。 如果已啟用 資料執行防止 ,嘗試在認可區域中執行程式碼會導致存取違規。 |
|
啟用對已認可頁面區域的唯讀或讀取/寫入存取。 如果已啟用 資料執行防止 ,嘗試在認可區域中執行程式碼會導致存取違規。 |
|
啟用檔案對應物件的對應檢視的唯讀或寫入時複製存取權。 嘗試在寫入頁面上寫入認可的複本,會導致針對進程建立頁面的私人複本。 私人頁面會標示為 PAGE_READWRITE,並將變更寫入新頁面。 如果已啟用 資料執行防止 ,嘗試在認可區域中執行程式碼會導致存取違規。 VirtualAlloc或VirtualAllocEx函式不支援此旗標。 |
|
將頁面中的所有位置設定為 CFG 不正確目標。 與任何執行頁面保護搭配使用,例如 PAGE_EXECUTE、 PAGE_EXECUTE_READ、 PAGE_EXECUTE_READWRITE 和 PAGE_EXECUTE_WRITECOPY。 對這些頁面中位置的任何間接呼叫都會失敗 CFG 檢查,且程式將會終止。 配置之可執行檔頁面的預設行為是標示 CFG 的有效呼叫目標。 VirtualProtect或CreateFileMapping函式不支援此旗標。 |
|
區域中的頁面在 VirtualProtect的保護變更時,不會更新其 CFG 資訊。 例如,如果區域中的頁面是使用 PAGE_TARGETS_INVALID來配置,則會在頁面保護變更時維護不正確資訊。 只有當保護變更為可執行檔案類型時,此旗標才有效,例如PAGE_EXECUTE、PAGE_EXECUTE_READ、PAGE_EXECUTE_READWRITE和PAGE_EXECUTE_WRITECOPY。
VirtualProtect保護變更為可執行檔的預設行為是將所有位置標示為 CFG 的有效呼叫目標。 |
以下是除了上表提供的選項以外,還可以使用的修飾詞。
常數/值 | Description |
---|---|
|
區域中的頁面會變成防護頁面。 任何嘗試存取防護頁面都會導致系統引發 STATUS_GUARD_PAGE_VIOLATION例外狀況 ,並關閉防護頁面狀態。 因此,防護頁面會作為一次性存取警示。 如需詳細資訊,請參閱 Creating Guard Pages (建立防護頁面)。 當存取嘗試導致系統關閉防護頁面狀態時,基礎頁面保護會接管。 如果在系統服務期間發生防護頁面例外狀況,服務通常會傳回失敗狀態指示器。 這個值不能與 PAGE_NOACCESS搭配使用。 CreateFileMapping函式不支援此旗標。 |
|
將所有頁面設定為不可快取。 應用程式不應該使用此屬性,除非裝置明確需要時。 使用與 SEC_NOCACHE 對應記憶體的內嵌函式可能會導致 EXCEPTION_ILLEGAL_INSTRUCTION 例外狀況。 PAGE_NOCACHE旗標不能與PAGE_GUARD、PAGE_NOACCESS或PAGE_WRITECOMBINE旗標搭配使用。 只有在配置具有VirtualAlloc、VirtualAllocEx或VirtualAllocExNuma函式的私人記憶體時,才能使用PAGE_NOCACHE旗標。 若要啟用共用記憶體的非快取記憶體存取,請在呼叫CreateFileMapping函式時指定SEC_NOCACHE旗標。 |
|
設定要合併的所有頁面。 應用程式不應該使用此屬性,除非裝置明確需要時。 使用內嵌函式搭配對應為寫入合併的記憶體,可能會導致 EXCEPTION_ILLEGAL_INSTRUCTION例外狀況 。 無法使用PAGE_NOACCESS、PAGE_GUARD和PAGE_NOCACHE旗標來指定PAGE_WRITECOMBINE旗標。 只有在使用VirtualAlloc、VirtualAllocEx或VirtualAllocExNuma函式配置私人記憶體時,才能使用PAGE_WRITECOMBINE旗標。 若要啟用共用記憶體的寫入合併記憶體存取,請在呼叫CreateFileMapping函式時指定SEC_WRITECOMBINE旗標。 Windows Server 2003 和 Windows XP: 在 Windows Server 2003 SP1 之前,不支援此旗標。 |
當您指定具有 Intel Software Guard Extensions (SGX) 架構的記憶體保護區時,下列常數只能與支援的函式搭配使用。
常數 | 描述 | 支援的函式 |
---|---|---|
|
表示頁面將會受到保護,以防止在記憶體保護區中進一步使用。 此旗標不得與任何其他旗標結合。 此旗標僅適用于 SGX2 記憶體保護區。 |
VirtualProtect |
|
此頁面包含 TCS) (執行緒控制項結構。 |
LoadEnclaveData VirtualProtect |
|
您提供的頁面內容會從使用 Intel SGX 程式設計模型的 EEXTEND 指令進行測量時排除。 |
LoadEnclaveData |
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 |
Windows XP [僅限傳統型應用程式] |
最低支援的伺服器 |
Windows Server 2003 [僅限傳統型應用程式] |
標頭 |
|