内存保护常量
以下是内存保护选项:分配或保护内存中的页面时,必须指定以下值之一。 无法将保护属性分配给页面的某一部分;它们只能分配给整个页面。
示例
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 经典示例中 示例示例。
常量
常量/值 | 说明 |
---|---|
|
启用对页面已提交区域的执行访问。 尝试写入已提交区域会导致访问冲突。 CreateFileMapping 函数不支持此标志。 |
|
启用对页面已提交区域的执行或只读访问。 尝试写入已提交区域会导致访问冲突。 Windows Server 2003 和 Windows XP: 在 Windows XP SP2 和 Windows Server 2003 SP1 之前, CreateFileMapping 函数不支持此属性。 |
|
启用对已提交页面区域的执行、只读或读/写访问权限。 Windows Server 2003 和 Windows XP: 在 Windows XP SP2 和 Windows Server 2003 SP1 之前, CreateFileMapping 函数不支持此属性。 |
|
启用对文件映射对象的映射视图的执行、只读或写入时复制访问权限。 尝试写入已提交的写入时复制页会导致为进程创建页面的专用副本。 专用页面标记为 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 的有效调用目标。 |
除了上表中提供的选项外,以下修饰符还可以使用,但如前所述除外。
常量/值 | 说明 |
---|---|
|
区域中的页面将成为保护页。 任何访问保护页的尝试都会导致系统引发 STATUS_GUARD_PAGE_VIOLATION 异常并关闭保护页状态。 因此,保护页充当一次性访问警报。 有关更多信息,请参见创建保护页。 当访问尝试导致系统关闭保护页状态时,基础页面保护将接管。 如果在系统服务期间发生保护页异常,该服务通常会返回失败状态指示器。 此值不能与 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) 体系结构的 enclave 时,才能将以下常量与受支持的函数一起使用。
返回的常量 | 说明 | 支持的函数 |
---|---|---|
|
指示页面将受到保护,以防止在 enclave 中进一步使用。 此标志不得与任何其他标志组合使用。 此标志仅对 SGX2 enclave 有效。 |
VirtualProtect |
|
该页包含 TCS) (线程控制结构。 |
LoadEnclaveData VirtualProtect |
|
使用 Intel SGX 编程模型的 EEXTEND 指令,将您提供的页面内容排除在度量范围之外。 |
LoadEnclaveData |
要求
要求 | 值 |
---|---|
最低受支持的客户端 |
Windows XP [仅限桌面应用] |
最低受支持的服务器 |
Windows Server 2003 [仅限桌面应用] |
标头 |
|