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