메모리 보호 상수

다음은 메모리 보호 옵션입니다. 메모리에서 페이지를 할당하거나 보호할 때 다음 값 중 하나를 지정해야 합니다. 보호 특성은 페이지의 일부에 할당할 수 없습니다. 전체 페이지에만 할당할 수 있습니다.

예제

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 표시되고 변경 내용이 새 페이지에 기록됩니다.
이 플래그는 VirtualAlloc 또는 VirtualAllocEx 함수에서 지원되지 않습니다. Windows Vista, Windows Server 2003 및 Windows XP: 이 특성은 Windows Vista SP1 및 Windows Server 2008까지 CreateFileMapping 함수에서 지원되지 않습니다.

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_READWRITEPAGE_EXECUTE_WRITECOPY 같은 실행 페이지 보호와 함께 사용됩니다. 해당 페이지의 위치에 대한 간접 호출은 CFG 검사에 실패하고 프로세스가 종료됩니다. 할당된 실행 파일 페이지의 기본 동작은 CFG에 대한 유효한 호출 대상으로 표시되는 것입니다.
이 플래그는 VirtualProtect 또는 CreateFileMapping 함수에서 지원되지 않습니다.
PAGE_TARGETS_NO_UPDATE
0x40000000
VirtualProtect에 대한 보호가 변경되는 동안 지역의 페이지에는 CFG 정보가 업데이트되지 않습니다. 예를 들어 지역의 페이지가 PAGE_TARGETS_INVALID 사용하여 할당된 경우 페이지 보호가 변경되는 동안 잘못된 정보가 유지됩니다. 이 플래그는 보호가 PAGE_EXECUTE, PAGE_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_GUARD, PAGE_NOACCESS 또는 PAGE_WRITECOMBINE 플래그와 함께 사용할 수 없습니다.
PAGE_NOCACHE 플래그는 VirtualAlloc, VirtualAllocEx 또는VirtualAllocExNuma 함수를 사용하여 프라이빗 메모리를 할당하는 경우에만 사용할 수 있습니다. 공유 메모리에 대해 캐시되지 않은 메모리 액세스를 사용하도록 설정하려면 CreateFileMapping 함수를 호출할 때 SEC_NOCACHE 플래그를 지정합니다.
PAGE_WRITECOMBINE
0x400
모든 페이지를 쓰기 결합으로 설정합니다.
애플리케이션은 디바이스에 명시적으로 필요한 경우를 제외하고 이 특성을 사용하면 안 됩니다. 쓰기 결합으로 매핑된 메모리와 함께 연동 함수를 사용하면 EXCEPTION_ILLEGAL_INSTRUCTION 예외가 발생할 수 있습니다.
PAGE_NOACCESS, PAGE_GUARDPAGE_NOCACHE 플래그를 사용하여 PAGE_WRITECOMBINE 플래그를 지정할 수 없습니다.
PAGE_WRITECOMBINE 플래그는 VirtualAlloc, VirtualAllocEx 또는VirtualAllocExNuma 함수를 사용하여 프라이빗 메모리를 할당하는 경우에만 사용할 수 있습니다. 공유 메모리에 대해 쓰기 결합 메모리 액세스를 사용하도록 설정하려면 CreateFileMapping 함수를 호출할 때 SEC_WRITECOMBINE 플래그를 지정합니다.
Windows Server 2003 및 Windows XP: 이 플래그는 Windows Server 2003 SP1까지 지원되지 않습니다.

다음 상수는 Intel SGX(Software Guard Extensions) 아키텍처가 있는 enclave를 지정하는 경우에만 지원되는 함수와 함께 사용할 수 있습니다.

상수 Description 지원되는 함수
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