VirtualProtect 함수(memoryapi.h)
호출 프로세스의 가상 주소 공간에서 커밋된 페이지의 영역에 대한 보호를 변경합니다.
모든 프로세스의 액세스 보호를 변경하려면 VirtualProtectEx 함수를 사용합니다.
구문
BOOL VirtualProtect(
[in] LPVOID lpAddress,
[in] SIZE_T dwSize,
[in] DWORD flNewProtect,
[out] PDWORD lpflOldProtect
);
매개 변수
[in] lpAddress
액세스 보호 특성을 변경해야 하는 페이지 영역의 시작 페이지 주소입니다.
지정된 지역의 모든 페이지는 MEM_RESERVE 사용하여 VirtualAlloc 또는 VirtualAllocEx 함수를 호출할 때 할당된 동일한 예약 지역 내에 있어야 합니다. 페이지는 MEM_RESERVE 사용하여 VirtualAlloc 또는 VirtualAllocEx에 대한 별도의 호출로 할당된 인접한 예약된 지역에 걸쳐 있습니다.
[in] dwSize
액세스 보호 특성을 변경할 지역의 크기(바이트)입니다. 영향을 받는 페이지의 영역에는 lpAddress 매개 변수 (lpAddress+dwSize)
에서 에 이르는 범위에서 하나 이상의 바이트가 포함된 모든 페이지가 포함됩니다. 즉, 페이지 경계에 걸쳐 있는 2 바이트 범위로 인해 두 페이지의 보호 특성이 변경됩니다.
[in] flNewProtect
메모리 보호 옵션입니다. 이 매개 변수는 메모리 보호 상수 중 하나일 수 있습니다.
매핑된 뷰의 경우 이 값은 뷰가 매핑될 때 지정된 액세스 보호와 호환되어야 합니다( MapViewOfFile, MapViewOfFileEx 및 MapViewOfFileExNuma 참조).
[out] lpflOldProtect
지정한 페이지 영역에 있는 첫 번째 페이지의 이전 액세스 보호 값을 받는 변수에 대한 포인터입니다. 이 매개 변수가 NULL 이거나 유효한 변수를 가리키지 않으면 함수가 실패합니다.
반환 값
함수가 성공하면 반환 값이 0이 아닙니다.
함수가 실패하면 반환 값은 0입니다. 확장 오류 정보를 가져오려면 GetLastError를 호출합니다.
설명
커밋된 페이지에서만 액세스 보호 값을 설정할 수 있습니다. 지정된 지역에 있는 페이지의 상태가 커밋되지 않으면 함수가 실패하고 지정된 지역에 있는 페이지의 액세스 보호를 수정하지 않고 반환됩니다.
PAGE_GUARD 보호 한정자는 보호 페이지를 설정합니다. 가드 페이지는 원샷 액세스 경보 역할을 합니다. 자세한 내용은 가드 페이지 만들기를 참조하세요.
여러 메모리 블록이 단일 페이지에 존재할 수 있으므로 VirtualProtect를 사용하여 GlobalAlloc, HeapAlloc 또는 LocalAlloc에서 할당한 메모리 블록에 대한 페이지 보호를 변경하지 않는 것이 가장 좋습니다. 힙 관리자는 힙의 모든 페이지가 적어도 읽기 및 쓰기 액세스 권한을 부여한다고 가정합니다.
실행 가능한 지역을 보호할 때 호출 프로그램은 코드가 설정되면 FlushInstructionCache 에 대한 적절한 호출을 통해 캐시 일관성을 보장할 책임이 있습니다. 그렇지 않으면 새로 실행 가능한 지역에서 코드를 실행하려고 시도하면 예측할 수 없는 결과가 발생할 수 있습니다.
요구 사항
지원되는 최소 클라이언트 | Windows XP [데스크톱 앱 | UWP 앱] |
지원되는 최소 서버 | Windows Server 2003 [데스크톱 앱 | UWP 앱] |
대상 플랫폼 | Windows |
헤더 | memoryapi.h(Windows.h, Memoryapi.h 포함) |
라이브러리 | onecore.lib |
DLL | Kernel32.dll |