메모리 보호 상수
다음은 메모리 보호 옵션입니다. 메모리에서 페이지를 할당하거나 보호할 때 다음 값 중 하나를 지정해야 합니다. 보호 특성은 페이지의 일부에 할당할 수 없습니다. 전체 페이지에만 할당할 수 있습니다.
예제
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: 이 특성은 Windows Vista SP1 및 Windows Server 2008까지 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 플래그와 함께 사용할 수 없습니다. PAGE_NOCACHE 플래그는 VirtualAlloc, VirtualAllocEx 또는VirtualAllocExNuma 함수를 사용하여 프라이빗 메모리를 할당하는 경우에만 사용할 수 있습니다. 공유 메모리에 대해 캐시되지 않은 메모리 액세스를 사용하도록 설정하려면 CreateFileMapping 함수를 호출할 때 SEC_NOCACHE 플래그를 지정합니다. |
|
모든 페이지를 쓰기 결합으로 설정합니다. 애플리케이션은 디바이스에 명시적으로 필요한 경우를 제외하고 이 특성을 사용하면 안 됩니다. 쓰기 결합으로 매핑된 메모리와 함께 연동 함수를 사용하면 EXCEPTION_ILLEGAL_INSTRUCTION 예외가 발생할 수 있습니다. PAGE_NOACCESS, PAGE_GUARD및PAGE_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 | 지원되는 함수 |
---|---|---|
|
Enclave에서 추가 사용을 방지하기 위해 페이지가 보호됨을 나타냅니다. 이 플래그는 다른 플래그와 결합해서는 안 됩니다. 이 플래그는 SGX2 enclave에만 유효합니다. |
VirtualProtect |
|
페이지에는 TCS(스레드 제어 구조)가 포함되어 있습니다. |
LoadEnclaveData VirtualProtect |
|
제공하는 페이지 콘텐츠는 Intel SGX 프로그래밍 모델의 EEXTEND 명령으로 측정에서 제외됩니다. |
LoadEnclaveData |
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 |
Windows XP [데스크톱 앱만 해당] |
지원되는 최소 서버 |
Windows Server 2003 [데스크톱 앱만 해당] |
헤더 |
|