Поделиться через


Константы защиты памяти

Ниже приведены параметры защиты памяти. При выделении или защите страницы в памяти необходимо указать одно из следующих значений. Атрибуты защиты не могут быть назначены части страницы; они могут быть назначены только целой странице.

Пример

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.

Константы

Констант/значение Описание
PAGE_EXECUTE
0x10
Разрешает выполнение доступа к зафиксированной области страниц. Попытка записи в зафиксированный регион приводит к нарушению доступа.
Этот флаг не поддерживается функцией CreateFileMapping .
PAGE_EXECUTE_READ
0x20
Обеспечивает доступ к зафиксированной области страниц в режиме выполнения или только для чтения. Попытка записи в зафиксированный регион приводит к нарушению доступа.
Windows Server 2003 и Windows XP: Этот атрибут не поддерживается функцией CreateFileMapping до Windows XP с пакетом обновления 2 (SP2) и Windows Server 2003 с пакетом обновления 1 (SP1).
PAGE_EXECUTE_READWRITE
0x40
Предоставляет доступ на выполнение, только для чтения или чтение и запись к зафиксированной области страниц.
Windows Server 2003 и Windows XP: Этот атрибут не поддерживается функцией CreateFileMapping до Windows XP с пакетом обновления 2 (SP2) и Windows Server 2003 с пакетом обновления 1 (SP1).
PAGE_EXECUTE_WRITECOPY
0x80
Позволяет выполнять, только для чтения или копировать при записи доступ к сопоставленным представлениям объекта сопоставления файлов. Попытка записи на зафиксированную страницу копирования при записи приводит к тому, что для процесса создается закрытая копия страницы. Частная страница помечается как PAGE_EXECUTE_READWRITE, а изменения записываются на новую страницу.
Этот флаг не поддерживается функциями VirtualAlloc или VirtualAllocEx . Windows Vista, Windows Server 2003 и Windows XP: Этот атрибут не поддерживается функцией CreateFileMapping до Windows Vista с пакетом обновления 1 (SP1) и Windows Server 2008.

PAGE_NOACCESS
0x01
Отключает весь доступ к зафиксированной области страниц. Попытка чтения, записи или выполнения зафиксированного региона приводит к нарушению доступа.
Этот флаг не поддерживается функцией CreateFileMapping .
PAGE_READONLY
0x02
Обеспечивает доступ только для чтения к зафиксированной области страниц. Попытка записи в зафиксированный регион приводит к нарушению доступа. Если включено предотвращение выполнения данных , попытка выполнить код в зафиксированном регионе приведет к нарушению доступа.
PAGE_READWRITE
0x04
Разрешает доступ только для чтения или для чтения и записи к зафиксированной области страниц. Если включено предотвращение выполнения данных , попытка выполнить код в зафиксированном регионе приводит к нарушению доступа.
PAGE_WRITECOPY
0x08
Разрешает доступ только для чтения или копирования при записи к сопоставленным представлениям объекта сопоставления файлов. Попытка записи на зафиксированную страницу копирования при записи приводит к тому, что для процесса создается закрытая копия страницы. Частная страница помечается как PAGE_READWRITE, а изменения записываются на новую страницу. Если включено предотвращение выполнения данных , попытка выполнить код в зафиксированном регионе приводит к нарушению доступа.
Этот флаг не поддерживается функциями VirtualAlloc или VirtualAllocEx .
PAGE_TARGETS_INVALID
0x40000000
Задает все расположения на страницах как недопустимые целевые объекты для CFG. Используется вместе с любой защитой страницы выполнения, например PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE и PAGE_EXECUTE_WRITECOPY. Любой косвенный вызов расположений на этих страницах не пройдет проверку CFG, и процесс будет завершен. Поведение по умолчанию для выделенных исполняемых страниц — помечать допустимые целевые объекты вызова для CFG.
Этот флаг не поддерживается функциями VirtualProtect или CreateFileMapping .
PAGE_TARGETS_NO_UPDATE
0x40000000
На страницах в регионе не будут обновляться сведения о CFG, пока изменяется защита для VirtualProtect. Например, если страницы в регионе были выделены с помощью PAGE_TARGETS_INVALID, то при изменении защиты страниц будут сохраняться недопустимые сведения. Этот флаг действителен, только если защита изменяется на исполняемый тип , например PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE и PAGE_EXECUTE_WRITECOPY. Поведение по умолчанию для изменения защиты VirtualProtect на исполняемый файл заключается в том, чтобы пометить все расположения как допустимые целевые объекты вызова для CFG.

Ниже приведены модификаторы, которые можно использовать в дополнение к параметрам, указанным в предыдущей таблице, за исключением указанных ниже.

Констант/значение Описание
PAGE_GUARD
0x100
Страницы в регионе становятся защищенными страницами. Любая попытка доступа к странице защиты приводит к тому, что система вызывает исключение STATUS_GUARD_PAGE_VIOLATION и отключает состояние страницы защиты. Таким образом, страницы защиты выступают в качестве одноразового оповещения о доступе. Дополнительные сведения см. в разделе Creating Guard Pages.
Когда попытка доступа приводит к тому, что система отключает состояние защиты страницы, базовая защита страницы берет на себя.
Если во время системной службы возникает исключение страницы защиты, служба обычно возвращает индикатор состояния сбоя.
Это значение нельзя использовать с PAGE_NOACCESS.
Этот флаг не поддерживается функцией CreateFileMapping .
PAGE_NOCACHE
0x200
Устанавливает все страницы как некэшируемые. Приложения не должны использовать этот атрибут, за исключением случаев, когда это явно требуется для устройства. Использование взаимосвязанных функций с памятью, сопоставленной с SEC_NOCACHE , может привести к EXCEPTION_ILLEGAL_INSTRUCTION исключению.
Флаг PAGE_NOCACHE нельзя использовать с флагами PAGE_GUARD, PAGE_NOACCESS или PAGE_WRITECOMBINE .
Флаг PAGE_NOCACHE можно использовать только при выделении частной памяти с помощью функций VirtualAlloc, VirtualAllocEx или VirtualAllocExNuma . Чтобы включить доступ к общей памяти без кэширования, укажите флаг SEC_NOCACHE при вызове функции CreateFileMapping .
PAGE_WRITECOMBINE
0x400
Задает все страницы для объединения записей.
Приложения не должны использовать этот атрибут, за исключением случаев, когда это явно требуется для устройства. Использование заблокированных функций с памятью, сопоставленной как объединенная для записи, может привести к EXCEPTION_ILLEGAL_INSTRUCTION исключению.
Флаг PAGE_WRITECOMBINE нельзя указать с помощью флагов PAGE_NOACCESS, PAGE_GUARD и PAGE_NOCACHE .
Флаг PAGE_WRITECOMBINE можно использовать только при выделении частной памяти с помощью функций VirtualAlloc, VirtualAllocEx или VirtualAllocExNuma . Чтобы включить объединенный доступ к памяти записи для общей памяти, укажите флаг SEC_WRITECOMBINE при вызове функции CreateFileMapping .
Windows Server 2003 и Windows XP: Этот флаг не поддерживается до Windows Server 2003 с пакетом обновления 1 (SP1).

Следующие константы можно использовать с поддерживаемой функцией только при указании анклава с архитектурой intel Software Guard Extensions (SGX).

Константа Описание Поддерживаемая функция
PAGE_ENCLAVE_DECOMMIT
Указывает, что страница будет защищена, чтобы предотвратить дальнейшее использование в анклаве.
Этот флаг не должен сочетаться с другими флагами.
Этот флаг действителен только для анклавов SGX2.
VirtualProtect
PAGE_ENCLAVE_THREAD_CONTROL
Страница содержит структуру управления потоками (TCS).
LoadEnclaveData
VirtualProtect
PAGE_ENCLAVE_UNVALIDATED
Указанное содержимое страницы исключается из измерения с помощью инструкции EEXTEND модели программирования Intel SGX.
LoadEnclaveData

Требования

Требование Значение
Минимальная версия клиента
Windows XP [только классические приложения]
Минимальная версия сервера
Windows Server 2003 [только классические приложения]
Заголовок
WinNT.h (включая Windows.h)

См. также раздел

CreateFileMapping

Защита памяти

VirtualAlloc

VirtualAllocEx

LoadEnclaveData