다음을 통해 공유


CreateFileMappingFromApp 함수(memoryapi.h)

Windows 스토어 앱에서 지정된 파일에 대한 명명되거나 명명되지 않은 파일 매핑 개체를 만들거나 엽니다.

통사론

HANDLE CreateFileMappingFromApp(
  [in]           HANDLE               hFile,
  [in, optional] PSECURITY_ATTRIBUTES SecurityAttributes,
  [in]           ULONG                PageProtection,
  [in]           ULONG64              MaximumSize,
  [in, optional] PCWSTR               Name
);

매개 변수

[in] hFile

파일 매핑 개체를 만들 파일에 대한 핸들입니다.

flProtect 매개 변수가 지정하는 보호 플래그와 호환되는 액세스 권한으로 파일을 열어야 합니다. 필수는 아니지만 매핑하려는 파일을 단독 액세스를 위해 여는 것이 좋습니다. 자세한 내용은 파일 보안 및 액세스 권한참조하세요.

hFile INVALID_HANDLE_VALUE경우 호출 프로세스는 dwMaximumSizeHigh 파일 매핑 개체의 크기도 지정하고 dwMaximumSizeLow 매개 변수를 합니다. 이 시나리오에서 CreateFileMappingFromApp 파일 시스템의 파일 대신 시스템 페이징 파일에서 지원되는 지정된 크기의 파일 매핑 개체를 만듭니다.

[in, optional] SecurityAttributes

반환된 핸들을 자식 프로세스에서 상속할 수 있는지 여부를 결정하는 SECURITY_ATTRIBUTES 구조체에 대한 포인터입니다. SECURITY_ATTRIBUTES 구조체의 lpSecurityDescriptor 멤버는 새 파일 매핑 개체에 대한 보안 설명자를 지정합니다.

SecurityAttributes NULL경우 핸들을 상속할 수 없으며 파일 매핑 개체는 기본 보안 설명자를 가져옵니다. 파일 매핑 개체에 대한 기본 보안 설명자의 ACL(액세스 제어 목록)은 작성자의 기본 또는 가장 토큰에서 가져옵니다. 자세한 내용은 파일 매핑 보안 및 액세스 권한참조하세요.

[in] PageProtection

파일 매핑 개체의 페이지 보호를 지정합니다. 개체의 모든 매핑된 뷰는 이 보호와 호환되어야 합니다.

이 매개 변수는 다음 값 중 하나일 수 있습니다.

의미
PAGE_READONLY
0x02
읽기 전용 또는 쓰기 시 복사 액세스를 위해 보기를 매핑할 수 있습니다. 특정 지역에 쓰려고 시도하면 액세스 위반이 발생합니다.

hFile 매개 변수가 지정하는 파일 핸들은 GENERIC_READ 액세스 권한으로 만들어야 합니다.

PAGE_READWRITE
0x04
보기를 읽기 전용, 쓰기에 복사 또는 읽기/쓰기 액세스에 매핑할 수 있습니다.

hFile 매개 변수가 지정하는 파일 핸들은 GENERIC_READGENERIC_WRITE 액세스 권한으로 만들어야 합니다.

PAGE_WRITECOPY
0x08
읽기 전용 또는 쓰기 시 복사 액세스를 위해 보기를 매핑할 수 있습니다. 이 값은 PAGE_READONLY동일합니다.

hFile 매개 변수가 지정하는 파일 핸들은 GENERIC_READ 액세스 권한으로 만들어야 합니다.

 

애플리케이션은 이전 페이지 보호 값 중 하나와 결합하여 파일 매핑 개체에 대해 다음 특성 중 하나 이상을 지정할 수 있습니다.

의미
SEC_COMMIT
0x8000000
파일 매핑 개체가 운영 체제 페이징 파일에서 지원되는 경우(hfile 매개 변수가 INVALID_HANDLE_VALUE), 파일 보기가 프로세스 주소 공간에 매핑될 때 전체 페이지 범위가 예약되지 않고 커밋되도록 지정합니다. 시스템에 전체 매핑을 저장할 수 있는 커밋 가능한 페이지가 있어야 합니다. 그렇지 않으면 CreateFileMappingFromApp 실패합니다.

이 특성은 실행 파일 또는 데이터 파일에서 지원되는 파일 매핑 개체에 영향을 주지 않습니다(hfile 매개 변수는 파일 핸들).

SEC_COMMITSEC_RESERVE함께 사용할 수 없습니다.

특성을 지정하지 않으면 SEC_COMMIT 가정합니다.

SEC_IMAGE_NO_EXECUTE
0x11000000
hFile 매개 변수가 지정하는 파일이 실행되지 않는 실행 파일이며 로드된 이미지 파일에 강제 무결성 검사가 실행되지 않도록 지정합니다. 또한 SEC_IMAGE_NO_EXECUTE 특성으로 만든 파일 매핑 개체의 보기를 매핑해도 PsSetLoadImageNotifyRoutine 커널 API를 사용하여 등록된 드라이버 콜백이 호출되지 않습니다.

SEC_IMAGE_NO_EXECUTE 특성은 PAGE_READONLY 페이지 보호 값과 결합되어야 합니다. SEC_IMAGE_NO_EXECUTE다른 특성은 유효하지 않습니다.

SEC_LARGE_PAGES
0x80000000
운영 체제 페이징 파일(hfile 매개 변수가 INVALID_HANDLE_VALUE)에서 지원하는 파일 매핑 개체에 큰 페이지를 사용할 수 있습니다. 이 특성은 실행 가능한 이미지 파일 또는 데이터 파일에서 지원하는 파일 매핑 개체에 대해 지원되지 않습니다(hFile 매개 변수는 실행 파일 이미지 또는 데이터 파일에 대한 핸들입니다.)

파일 매핑 개체의 최대 크기는 GetLargePageMinimum 함수에서 반환하는 큰 페이지의 최소 크기의 배수여야 합니다. 그렇지 않으면 CreateFileMappingFromApp 실패합니다. SEC_LARGE_PAGES사용하여 만든 파일 매핑 개체의 뷰를 매핑하는 경우 기본 주소와 뷰 크기도 최소 큰 페이지 크기의 배수여야 합니다.

SEC_LARGE_PAGES 호출자의 토큰에서 SeLockMemoryPrivilege 권한을 사용하도록 설정해야 합니다.

SEC_LARGE_PAGES 지정한 경우 SEC_COMMIT 지정해야 합니다.

SEC_NOCACHE
0x10000000
모든 페이지를 캐시할 수 없도록 설정합니다.

애플리케이션은 디바이스에 명시적으로 필요한 경우를 제외하고 이 특성을 사용하면 안 됩니다. SEC_NOCACHE 매핑된 메모리와 함께 연동 함수를 사용하면 EXCEPTION_ILLEGAL_INSTRUCTION 예외가 발생할 수 있습니다.

SEC_NOCACHESEC_RESERVE 또는 SEC_COMMIT 특성을 설정해야 합니다.

SEC_RESERVE
0x4000000
파일 매핑 개체가 운영 체제 페이징 파일(hfile 매개 변수가 INVALID_HANDLE_VALUE)에 의해 지원되는 경우 파일 보기가 프로세스 주소 공간에 매핑될 때 전체 페이지 범위가 커밋되지 않고 프로세스에서 나중에 사용하도록 예약되도록 지정합니다.

예약된 페이지는 VirtualAlloc 함수에 대한 후속 호출에서 커밋할 수 있습니다. 페이지를 커밋한 후에는 VirtualFree 함수로 해제하거나 커밋 해제할 수 없습니다.

이 특성은 실행 파일 또는 데이터 파일에서 지원되는 파일 매핑 개체에 영향을 주지 않습니다(hfile 매개 변수는 파일 핸들).

SEC_RESERVESEC_COMMIT함께 사용할 수 없습니다.

SEC_WRITECOMBINE
0x40000000
모든 페이지를 쓰기 조합으로 설정합니다.

애플리케이션은 디바이스에 명시적으로 필요한 경우를 제외하고 이 특성을 사용하면 안 됩니다. SEC_WRITECOMBINE 매핑된 메모리와 함께 연동 함수를 사용하면 EXCEPTION_ILLEGAL_INSTRUCTION 예외가 발생할 수 있습니다.

SEC_WRITECOMBINESEC_RESERVE 또는 SEC_COMMIT 특성을 설정해야 합니다.

[in] MaximumSize

파일 매핑 개체의 최대 크기입니다.

길이가 0인 파일을 매핑하려고 시도하면 오류 코드가 ERROR_FILE_INVALID. 애플리케이션은 길이가 0인 파일을 테스트하고 해당 파일을 거부해야 합니다.

[in, optional] Name

파일 매핑 개체의 이름입니다.

이 매개 변수가 기존 매핑 개체의 이름과 일치하는 경우 함수는 flProtect 지정하는 보호를 사용하여 개체에 대한 액세스를 요청합니다.

이 매개 변수가 NULL경우 파일 매핑 개체는 이름 없이 만들어집니다.

lpName 기존 이벤트, 세마포, 뮤텍스, 대기 가능한 타이머 또는 작업 개체의 이름과 일치하면 함수가 실패하고 GetLastError 함수는 ERROR_INVALID_HANDLE반환합니다. 이러한 개체는 동일한 네임스페이스를 공유하기 때문에 발생합니다.

이름에는 전역 또는 세션 네임스페이스에서 개체를 명시적으로 만드는 "전역" 또는 "로컬" 접두사를 가질 수 있습니다. 이름의 나머지 부분에는 백슬래시 문자(\)를 제외한 모든 문자가 포함될 수 있습니다. 세션 0 이외의 세션에서 전역 네임스페이스에 파일 매핑 개체를 만들려면 SeCreateGlobalPrivilege 권한이 필요합니다. 자세한 내용은 커널 개체 네임스페이스참조하세요.

빠른 사용자 전환은 터미널 서비스 세션을 사용하여 구현됩니다. 로그온하는 첫 번째 사용자는 세션 0(0)을 사용하고, 로그온할 다음 사용자는 세션 1(1) 등을 사용합니다. 커널 개체 이름은 애플리케이션이 여러 사용자를 지원할 수 있도록 터미널 서비스에 대해 설명된 지침을 따라야 합니다.

반환 값

함수가 성공하면 반환 값은 새로 만든 파일 매핑 개체에 대한 핸들입니다.

함수 호출 전에 개체가 있는 경우 함수는 지정된 크기가 아닌 현재 크기로 기존 개체에 대한 핸들을 반환하고 GetLastErrorERROR_ALREADY_EXISTS반환합니다.

함수가 실패하면 반환 값은 NULL. 확장 오류 정보를 얻으려면 GetLastError호출합니다.

발언

파일 매핑 개체를 만든 후에는 파일 크기가 파일 매핑 개체의 크기를 초과하지 않아야 합니다. 이 경우 모든 파일 내용을 공유할 수 있는 것은 아닙니다.

애플리케이션이 디스크의 실제 명명된 파일 크기보다 큰 파일 매핑 개체의 크기를 지정하고 페이지 보호에서 쓰기 액세스를 허용하는 경우(즉, flProtect 매개 변수가 PAGE_READWRITE지정함) 디스크의 파일이 파일 매핑 개체의 지정된 크기와 일치하도록 증가합니다. 파일이 확장되면 파일의 이전 끝과 파일의 새 끝 사이의 파일 내용이 0으로 보장되지 않습니다. 동작은 파일 시스템에 의해 정의됩니다. 디스크의 파일을 늘릴 수 없으면 CreateFileMappingFromApp 실패하고 getLastError ERROR_DISK_FULL반환합니다.

운영 체제 페이징 파일에서 지원되는 파일 매핑 개체의 페이지 초기 콘텐츠는 0입니다.

CreateFileMappingFromApp 반환하는 핸들은 새 파일 매핑 개체에 대한 모든 액세스 권한을 가지며 파일 매핑 개체에 대한 핸들이 필요한 모든 함수와 함께 사용할 수 있습니다.

여러 프로세스는 단일 공유 파일 매핑 개체를 사용하거나 동일한 파일에서 지원되는 별도의 파일 매핑 개체를 만들어 동일한 파일의 보기를 공유할 수 있습니다. 프로세스 생성 시 핸들을 상속하거나, 핸들을 복제하거나, 이름으로 파일 매핑 개체를 열어 여러 프로세스에서 단일 파일 매핑 개체를 공유할 수 있습니다. 자세한 내용은 CreateProcess, DuplicateHandleOpenFileMapping 함수를 참조하세요.

파일 매핑 개체를 만들면 뷰가 실제로 프로세스 주소 공간에 매핑되지 않습니다. MapViewOfFileEx 함수는 파일 보기를 프로세스 주소 공간에 매핑합니다.

한 가지 중요한 예외를 제외하고 동일한 파일에서 지원되는 파일 매핑 개체에서 파생된 파일 뷰는 특정 시간에 일관되거나 동일합니다. 일관성은 프로세스 내의 뷰 및 다른 프로세스에 의해 매핑되는 뷰에 대해 보장됩니다.

예외는 원격 파일과 관련이 있습니다. CreateFileMappingFromApp 원격 파일에서 작동하지만 일관되게 유지되지는 않습니다. 예를 들어 두 컴퓨터가 모두 파일을 쓰기 가능으로 매핑하고 둘 다 동일한 페이지를 변경하는 경우 각 컴퓨터는 페이지에 대한 쓰기만 볼 수 있습니다. 디스크에서 데이터가 업데이트되면 병합되지 않습니다.

매핑된 파일과 입력 및 출력(I/O) 함수(ReadFileWriteFile)를 사용하여 액세스하는 파일은 반드시 일관되지는 않습니다.

파일 매핑 개체의 매핑된 뷰는 개체에 대한 내부 참조를 유지하며, 파일에 대한 모든 참조가 해제될 때까지 파일 매핑 개체가 닫히지 않습니다. 따라서 파일 매핑 개체를 완전히 닫기 위해 애플리케이션은 UnmapViewOfFile 호출하여 파일 매핑 개체의 매핑된 모든 뷰의 매핑을 해제하고 CloseHandle호출하여 파일 매핑 개체 핸들을 닫아야 합니다. 이러한 함수는 순서에 따라 호출할 수 있습니다.

매핑된 보기를 통해 파일을 수정하는 경우 마지막 수정 타임스탬프가 자동으로 업데이트되지 않을 수 있습니다. 필요한 경우 호출자는 SetFileTime 사용하여 타임스탬프를 설정해야 합니다.

구조적 예외 처리를 사용하여 파일 뷰에 쓰거나 파일 뷰에서 읽는 코드를 보호합니다. 자세한 내용은 파일 보기읽기 및 쓰기 참조하세요.

앱에 codeGeneration 기능이 있는 경우에만 실행 파일 보호를 요청할 수 있습니다.

요구 사항

요구
지원되는 최소 클라이언트 Windows 8 [데스크톱 앱 | UWP 앱]
지원되는 최소 서버 Windows Server 2012 [데스크톱 앱 | UWP 앱]
대상 플랫폼 Windows
헤더 memoryapi.h(Windows.h 포함)
라이브러리 onecore.lib
DLL Kernel32.dll

참고 항목

closeHandle

CreateFileMapping

파일 매핑 개체 만들기

DuplicateHandle

파일 매핑 함수

mapViewOfFile

mapViewOfFileEx

메모리 관리 함수

OpenFileMapping

ReadFile

SECURITY_ATTRIBUTES

UnmapViewOfFile

VirtualAlloc

WriteFile