内存保护常量

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

示例

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

从 Windows上的经典示例中GitHub。

常量

常量/值 说明
页面 _EXECUTE
0x10
启用对已提交页面区域执行访问权限。 尝试写入已提交区域会导致访问冲突。
CreateFileMapping函数不支持此标志。
页面 _EXECUTE _ READ
0x20
启用对已提交页面区域执行或只读访问。 尝试写入已提交区域会导致访问冲突。
Windows Server 2003 和 Windows XP:CreateFileMapping函数不支持此属性,除非 Windows SP2 的 XP 和 sp1 Windows Server 2003。
页面 _EXECUTE _ READWRITE
0x40
启用对已提交页面区域执行、只读或读/写访问。
Windows Server 2003 和 Windows XP:CreateFileMapping函数不支持此属性,除非 Windows SP2 的 XP 和 sp1 Windows Server 2003。
页面 _EXECUTE _ WRITECOPY
0x80
允许对文件映射对象的映射视图执行、只读或写入时复制访问。 尝试写入已提交写入时复制页会导致为进程创建页面的专用副本。 专用页标记为 PAGE _ EXECUTE _ READWRITE,更改将写入新页。
VirtualAllocVirtualAllocEx函数不支持此标志。 Windows Vista、Windows Server 2003 和 Windows XP:CreateFileMapping函数不支持此属性,除非 Windows SP1 和 Windows Server 2008 的 Vista。

页面 _NOACCESS
0x01
禁用对已提交页面区域的所有访问。 尝试读取、写入或执行已提交区域会导致访问冲突。
CreateFileMapping函数不支持此标志。
页面 _READONLY
0x02
允许对已提交页面区域进行只读访问。 尝试写入已提交区域会导致访问冲突。 如果 启用了数据 执行保护,则尝试在已提交区域执行代码会导致访问冲突。
页面 _READWRITE
0x04
启用对已提交页面区域进行只读或读/写访问。 如果 启用了数据执行 保护,则尝试在已提交区域执行代码会导致访问冲突。
页面 _WRITECOPY
0x08
启用对文件映射对象的映射视图的只读或写入时复制访问。 尝试写入已提交写入时复制页会导致为进程创建页面的专用副本。 专用页标记为 PAGE _ READWRITE, 更改将写入新页。 如果 启用了数据执行 保护,则尝试在已提交区域执行代码会导致访问冲突。
VirtualAllocVirtualAllocEx函数不支持此标志。
页面 _目标 _ 无效0x40000000
将页面中的所有位置都设置为 CFG 的无效目标。 与任何执行页保护一起使用,如 PAGE _ EXECUTE、PAGE EXECUTE _ _ READ、PAGE EXECUTE _ _ READWRITEPAGE EXECUTE _ _ WRITECOPY。 对这些页中位置的任何间接调用都将失败 CFG 检查,并且该过程将终止。 分配的可执行页的默认行为是标记为 CFG 的有效调用目标。
VirtualProtectCreateFileMapping函数不支持此标志。
页面 _目标 _ NO _ UPDATE
0x40000000
VirtualProtect的保护发生更改时,该区域中的页面不会更新其 CFG 信息。 例如,如果使用 PAGE _ TARGETS _ INVALID 分配了该区域中的页,则当页面保护更改时,将保留无效信息。 此标志仅在保护更改为可执行类型(如 PAGE _ EXECUTE、PAGE _ EXECUTE _ READ、PAGE EXECUTE _ _ READWRITEPAGE EXECUTE _ _ WRITECOPY)时有效VirtualProtect 保护更改为可执行文件的默认行为是,将所有位置标记为 CFG 的有效调用目标。

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

常量/值 说明
页面 _GUARD
0x100
该区域中的页面将成为保护页。 任何访问保护页的尝试都会导致系统引发 STATUS _ GUARD _ PAGE _ VIOLATION 异常并关闭保护页状态。 因此,保护页充当一次访问警报。 有关更多信息,请参见创建保护页
当访问尝试导致系统关闭保护页状态时,基础页面保护将接管。
如果在系统服务期间发生保护页异常,该服务通常会返回故障状态指示器。
此值不能与 PAGE _ NOACCESS 一起使用
CreateFileMapping函数不支持此标志。
页面 _NOCACHE
0x200
将所有页面都设置为不可访问。 除非设备明确要求,否则应用程序不应使用此属性。 将互锁函数与使用 SEC _ NOCACHE 映射的内存一起使用可能会导致 EXCEPTION _ ILLEGAL _ 指令 异常。
PAGE _ NOCACHE 标志不能与 PAGE _ GUARD、PAGE _ NOACCESSPAGE _ WRITECOMBINE 标志一同使用。
只有在使用 VirtualAlloc、VirtualAllocExVirtualAllocExNuma 函数分配专用内存时,才能使用 PAGE _ NOCACHE 标志。 若要为共享内存启用非缓存内存访问,在调用 CreateFileMapping函数时指定 SEC _ NOCACHE 标志。
页面 _WRITECOMBINE
0x400
设置要写入的所有页。
除非设备明确要求,否则应用程序不应使用此属性。 将互锁函数与映射为写入组合的内存一起使用可能会导致 EXCEPTION ILLEGAL _ _ INSTRUCTION 异常。
不能使用 PAGE _ NOACCESS、PAGE _ GUARDPAGE _ NOCACHE 标志指定 PAGE _ WRITECOMBINE 标志。
只有在使用 VirtualAlloc、VirtualAllocExVirtualAllocExNuma函数 分配专用内存时,才能使用 PAGE _ WRITECOMBINE 标志。 若要为共享内存启用写入组合内存访问,在调用 CreateFileMapping函数时指定 SEC _ WRITECOMBINE 标志。
Windows Server 2003 和 Windows XP: 此标志在 SP1 Windows Server 2003 之前不受支持。

以下常量只能与 LoadEnclaveData 函数一起使用,因为指定的 enclave 具有 Intel Software Guard Extensions (SGX) 体系结构。

返回的常量 说明
PAGE _ ENCLAVE _ 线程 _ 控制
该页包含 TCS (线程) 。
PAGE _ ENCLAVE _ UNVALIDATED
使用 Intel SGX 编程模型的 EEXTEND 指令将你提供的页面内容从度量中排除。

要求

要求
最低受支持的客户端
Windows仅 [ XP 桌面应用]
最低受支持的服务器
Windows仅服务器 2003 [ 桌面应用]
标头
WinNT.h (包括 Windows.h)

另请参阅

CreateFileMapping

内存保护

VirtualAlloc

VirtualAllocEx

LoadEnclaveData