内存保护常量

以下是内存保护选项:分配或保护内存中的页面时,必须指定以下值之一。 无法将保护属性分配给页面的某一部分;它们只能分配给整个页面。

示例

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 经典示例中 示例示例。

常量

常量/值 说明
PAGE_EXECUTE
0x10
启用对页面已提交区域的执行访问。 尝试写入已提交区域会导致访问冲突。
CreateFileMapping 函数不支持此标志。
PAGE_EXECUTE_READ
0x20
启用对页面已提交区域的执行或只读访问。 尝试写入已提交区域会导致访问冲突。
Windows Server 2003 和 Windows XP: 在 Windows XP SP2 和 Windows Server 2003 SP1 之前, CreateFileMapping 函数不支持此属性。
PAGE_EXECUTE_READWRITE
0x40
启用对已提交页面区域的执行、只读或读/写访问权限。
Windows Server 2003 和 Windows XP: 在 Windows XP SP2 和 Windows Server 2003 SP1 之前, CreateFileMapping 函数不支持此属性。
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_EXECUTEPAGE_EXECUTE_READ、PAGE_EXECUTE_READWRITEPAGE_EXECUTE_WRITECOPY)时,此标志才有效。 VirtualProtect 保护更改为可执行文件的默认行为是将所有位置标记为 CFG 的有效调用目标。

除了上表中提供的选项外,以下修饰符还可以使用,但如前所述除外。

常量/值 说明
PAGE_GUARD
0x100
区域中的页面将成为保护页。 任何访问保护页的尝试都会导致系统引发 STATUS_GUARD_PAGE_VIOLATION 异常并关闭保护页状态。 因此,保护页充当一次性访问警报。 有关更多信息,请参见创建保护页
当访问尝试导致系统关闭保护页状态时,基础页面保护将接管。
如果在系统服务期间发生保护页异常,该服务通常会返回失败状态指示器。
此值不能与 PAGE_NOACCESS 一起使用。
CreateFileMapping 函数不支持此标志。
PAGE_NOCACHE
0x200
将所有页面设置为不可缓存。 应用程序不应使用此属性,除非设备显式需要。 将互锁 函数与SEC_NOCACHE 映射的内存配合使用可能会导致 EXCEPTION_ILLEGAL_INSTRUCTION 异常。
PAGE_NOCACHE标志不能与PAGE_GUARDPAGE_NOACCESSPAGE_WRITECOMBINE标志一起使用。
仅当使用 VirtualAlloc、VirtualAllocEx 或 VirtualAllocExNuma 函数分配专用内存时,才能使用 PAGE_NOCACHE 标志。 若要为共享内存启用非缓存内存访问,请在调用 CreateFileMapping 函数时指定SEC_NOCACHE标志。
PAGE_WRITECOMBINE
0x400
设置要写入组合的所有页面。
应用程序不应使用此属性,除非设备显式需要。 将互锁函数与映射为写入组合的内存结合使用可能会导致 EXCEPTION_ILLEGAL_INSTRUCTION 异常。
不能使用PAGE_NOACCESS、PAGE_GUARDPAGE_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) 体系结构的 enclave 时,才能将以下常量与受支持的函数一起使用。

返回的常量 说明 支持的函数
PAGE_ENCLAVE_DECOMMIT
指示页面将受到保护,以防止在 enclave 中进一步使用。
此标志不得与任何其他标志组合使用。
此标志仅对 SGX2 enclave 有效。
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