다음을 통해 공유


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, MapViewOfFileExMapViewOfFileExNuma 참조).

[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

참고 항목

메모리 관리 함수

메모리 보호 상수

가상 메모리 함수

VirtualAlloc

VirtualProtectEx

VBS Enclave에서 사용할 수 있는 Vertdll API