MapViewOfFile 함수(memoryapi.h)
호출 프로세스의 주소 공간에 파일 매핑 보기를 매핑합니다.
뷰에 대해 제안된 기본 주소를 지정하려면 MapViewOfFileEx 함수를 사용합니다. 그러나 이 방법은 권장되지 않습니다.
통사론
LPVOID MapViewOfFile(
[in] HANDLE hFileMappingObject,
[in] DWORD dwDesiredAccess,
[in] DWORD dwFileOffsetHigh,
[in] DWORD dwFileOffsetLow,
[in] SIZE_T dwNumberOfBytesToMap
);
매개 변수
[in] hFileMappingObject
파일 매핑 개체에 대한 핸들입니다. CreateFileMapping 및 OpenFileMapping 함수는 이 핸들을 반환합니다.
[in] dwDesiredAccess
페이지의 페이지 보호를 결정하는 파일 매핑 개체에 대한 액세스 유형입니다. 이 매개 변수는 다음 값 중 하나이거나 적절한 경우 여러 값의 비트 OR 조합일 수 있습니다.
비트 OR를 사용하여 위의 값을 이러한 값과 결합할 수 있습니다.
값 | 의미 |
---|---|
|
파일의 쓰기 복사 보기가 매핑됩니다. 파일 매핑 개체는 PAGE_READONLY, PAGE_EXECUTE_READ, PAGE_WRITECOPY, PAGE_EXECUTE_WRITECOPY, PAGE_READWRITE또는 PAGE_EXECUTE_READWRITE 보호를 사용하여 만들어야 합니다.
프로세스에서 쓰기 복사 페이지에 쓰는 경우 시스템은 원본 페이지를 프로세스에 비공개인 새 페이지로 복사합니다. 새 페이지는 페이징 파일에서 지원됩니다. 새 페이지의 보호는 쓰기에 복사에서 읽기/쓰기로 변경됩니다. 쓰기에 대한 복사 액세스 권한이 지정되면 호출 프로세스가 보기의 모든 페이지에 쓸 수 있으므로 모든 페이지를 비공개로 만들 수 있으므로 전체 보기에 대한 시스템 및 프로세스 커밋 요금이 청구됩니다. 새 페이지의 콘텐츠는 원래 파일에 다시 기록되지 않으며 보기가 매핑 해제되면 손실됩니다. |
|
파일의 실행 가능한 뷰가 매핑됩니다(매핑된 메모리는 코드로 실행할 수 있습니다). 파일 매핑 개체는 PAGE_EXECUTE_READ, PAGE_EXECUTE_WRITECOPY또는 PAGE_EXECUTE_READWRITE 보호를 사용하여 만들어야 합니다.
Windows Server 2003 및 Windows XP: 이 값은 WINDOWS XP SP2 및 Windows Server 2003 SP1부터 사용할 수 있습니다. |
|
Windows 10 버전 1703부터 이 플래그는 큰 페이지 지원사용하여 뷰를 매핑해야 한다고 지정합니다. 보기의 크기는 GetLargePageMinimum 함수에서 보고한 큰 페이지 크기의 배수여야 하며 SEC_LARGE_PAGES 옵션을 사용하여 파일 매핑 개체를 만들어야 합니다.
lpBaseAddressnull이 아닌 값을 제공하는 경우 값은 GetLargePageMinimum배수여야 합니다. 참고: Windows 10 버전 1703 이전 OS 버전에서는 FILE_MAP_LARGE_PAGES 플래그가 적용되지 않습니다. 이 릴리스에서는 SEC_LARGE_PAGES 플래그 집합을 사용하여 섹션을 만든 경우 큰 페이지를 사용하여 보기가 자동으로 매핑됩니다. |
|
매핑된 파일의 모든 위치를 CFG(Control Flow Guard)의 잘못된 대상으로 설정합니다. 이 플래그는 PAGE_TARGETS_INVALID비슷합니다. 실행 액세스 권한 FILE_MAP_EXECUTE함께 이 플래그를 사용합니다. 해당 페이지의 위치에 대한 간접 호출은 CFG 검사에 실패하고 프로세스가 종료됩니다. 할당된 실행 파일에 대한 기본 동작은 CFG에 대한 유효한 호출 대상으로 표시되는 것입니다. |
SEC_IMAGE 특성으로 만든 파일 매핑 개체의 경우 dwDesiredAccess 매개 변수는 효과가 없으며 FILE_MAP_READ같은 유효한 값으로 설정해야 합니다.
파일 매핑 개체에 대한 액세스에 대한 자세한 내용은 파일 매핑 보안 및 액세스 권한참조하세요.
[in] dwFileOffsetHigh
보기가 시작되는 파일 오프셋의 상위 DWORD.
[in] dwFileOffsetLow
보기가 시작될 파일 오프셋의 하위 순서 DWORD. 높음 및 낮음 오프셋의 조합은 파일 매핑 내에서 오프셋을 지정해야 합니다. 또한 시스템의 가상 메모리 할당 세분성과 일치해야 합니다. 즉, 오프셋은 VirtualAlloc 할당 세분성의 배수여야 합니다. 시스템의 VirtualAlloc 메모리 할당 세분성을 가져오려면 SYSTEM_INFO 구조체의 멤버를 채우는 GetSystemInfo 함수를 사용합니다.
[in] dwNumberOfBytesToMap
뷰에 매핑할 파일 매핑의 바이트 수입니다. 모든 바이트는 CreateFileMapping지정된 최대 크기 내에 있어야 합니다. 이 매개 변수가 0이면 매핑이 지정된 오프셋에서 파일 매핑의 끝까지 확장됩니다.
반환 값
함수가 성공하면 반환 값은 매핑된 뷰의 시작 주소입니다.
함수가 실패하면 반환 값은 NULL
발언
파일을 매핑하면 호출 프로세스의 주소 공간에 파일의 지정된 부분이 표시됩니다.
주소 공간보다 큰 파일의 경우 파일 데이터의 작은 부분만 한 번에 매핑할 수 있습니다. 첫 번째 보기가 완료되면 매핑을 해제하고 새 보기를 매핑할 수 있습니다.
보기의 크기를 가져오려면 VirtualQuery 함수를 사용합니다.
파일(또는 파일 매핑 개체 및 매핑된 파일)의 여러 보기는 지정된 시간에 동일한 데이터를 포함하는 경우 일관된
한 가지 중요한 예외를 제외하고 동일한 파일에서 지원되는 파일 매핑 개체에서 파생된 파일 뷰는 특정 시간에 일관되거나 동일합니다. 일관성은 프로세스 내의 뷰 및 다른 프로세스에 의해 매핑되는 뷰에 대해 보장됩니다.
예외는 원격 파일과 관련이 있습니다. MapViewOfFile 원격 파일에서 작동하지만 일관되게 유지되지는 않습니다. 예를 들어 두 컴퓨터가 모두 파일을 쓰기 가능으로 매핑하고 둘 다 동일한 페이지를 변경하는 경우 각 컴퓨터는 페이지에 대한 쓰기만 볼 수 있습니다. 디스크에서 데이터가 업데이트되면 병합되지 않습니다.
파일의 매핑된 뷰는 ReadFile 또는 WriteFile 함수에서 액세스하는 파일과 일관성이 보장되지 않습니다.
메모리 매핑된 파일에 포인터를 저장하지 마세요. 매핑을 모든 주소에서 사용할 수 있도록 파일 매핑의 기준에서 오프셋을 저장합니다.
EXCEPTION_IN_PAGE_ERROR 예외를 방지하려면 구조적 예외 처리를 사용하여 페이지 파일이 아닌 파일의 메모리 매핑 보기에서 쓰거나 읽는 코드를 보호합니다. 자세한 내용은 파일 보기읽기 및 쓰기
매핑된 보기를 통해 파일을 수정하는 경우 마지막 수정 타임스탬프가 자동으로 업데이트되지 않을 수 있습니다. 필요한 경우 호출자는 SetFileTime 사용하여 타임스탬프를 설정해야 합니다.
파일 매핑 개체가 페이징 파일에 의해 지원되는 경우(CreateFileMappinghFile 매개 변수가 INVALID_HANDLE_VALUE설정됨) 페이징 파일은 전체 매핑을 저장할 수 있을 만큼 커야 합니다. 그렇지 않으면 MapViewOfFile 실패합니다. 페이징 파일에서 지원되는 파일 매핑 개체의 페이지 초기 콘텐츠는 0입니다.
페이징 파일에서 지원되는 파일 매핑 개체를 만들 때 호출자는 MapViewOfFile 동시에 페이지를 예약하고 커밋할지(SEC_COMMIT) 또는 단순히 페이지(SEC_RESERVE)를 예약할지 여부를 지정할 수 있습니다. 파일을 매핑하면 전체 매핑된 가상 주소 범위를 프로세스의 다른 할당에 사용할 수 없게 됩니다. 예약된 범위의 페이지를 커밋한 후에는 VirtualFree호출하여 해제하거나 커밋 해제할 수 없습니다. 보기가 매핑 해제되고 파일 매핑 개체가 닫혀 있으면 예약된 페이지와 커밋된 페이지가 해제됩니다. 자세한 내용은 UnmapViewOfFile 및 CloseHandle 함수를 참조하세요.
실행 권한이 있는 파일을 사용하려면 애플리케이션이 PAGE_EXECUTE_READWRITE 또는 PAGE_EXECUTE_READCreateFileMapping 호출한 다음 FILE_MAP_EXECUTE | 또는 FILE_MAP_EXECUTE | MapViewOfFile 호출해야 합니다.
Windows Server 2012에서 이 함수는 다음 기술에서 지원됩니다.
기술 | 지원 |
---|---|
SMB(서버 메시지 블록) 3.0 프로토콜 | 예 |
SMB 3.0 TFO(투명한 장애 조치(failover) | 예 |
SO(스케일 아웃 파일 공유)가 있는 SMB 3.0 | 예 |
CsvFS(클러스터 공유 볼륨 파일 시스템) | 예 |
ReFS(복원 파일 시스템) | 예 |
CsvF가 일시 중지되면 잠금 충돌이 있음을 나타내는 오류와 함께 이 호출이 실패할 수 있습니다.
예제
예제는 명명된 공유 메모리만드는
요구 사항
요구 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows XP [데스크톱 앱만 해당] |
지원되는 최소 서버 | Windows Server 2003 [데스크톱 앱만 해당] |
대상 플랫폼 | Windows |
헤더 | memoryapi.h(Windows.h, Memoryapi.h 포함) |
라이브러리 | onecore.lib |
DLL | Kernel32.dll |
참고 항목
CreateFileMapping
파일 뷰 만들기
GetSystemInfo
mapViewOfFileEx
OpenFileMapping
UnmapViewOfFile