ZwMapViewOfSection 함수(wdm.h)
ZwMapViewOfSection 루틴은 섹션 보기를 주체 프로세스의 가상 주소 공간에 매핑합니다.
구문
NTSYSAPI NTSTATUS ZwMapViewOfSection(
[in] HANDLE SectionHandle,
[in] HANDLE ProcessHandle,
[in, out] PVOID *BaseAddress,
[in] ULONG_PTR ZeroBits,
[in] SIZE_T CommitSize,
[in, out, optional] PLARGE_INTEGER SectionOffset,
[in, out] PSIZE_T ViewSize,
[in] SECTION_INHERIT InheritDisposition,
[in] ULONG AllocationType,
[in] ULONG Win32Protect
);
매개 변수
[in] SectionHandle
섹션 개체에 대한 핸들입니다. 이 핸들은 ZwCreateSection 또는 ZwOpenSection을 성공적으로 호출하여 만듭니다.
[in] ProcessHandle
뷰를 매핑해야 하는 프로세스를 나타내는 개체에 대한 핸들입니다. ZwCurrentProcess 매크로를 사용하여 현재 프로세스를 지정합니다. PROCESS_VM_OPERATION 액세스 권한 으로 핸들을 열어야 합니다.
[in, out] BaseAddress
뷰의 기본 주소를 받는 변수에 대한 포인터입니다. 이 매개 변수의 값이 NULL이 아닌 경우 뷰는 다음 64킬로바이트 주소 경계로 반올림된 지정된 가상 주소에서 시작하여 할당됩니다.
[in] ZeroBits
섹션 보기의 기본 주소에서 0이어야 하는 상위 주소 비트 수를 지정합니다. 이 매개 변수의 값은 21보다 작아야 하며 BaseAddress 가 NULL인 경우에만 사용됩니다. 즉, 호출자가 시스템에서 뷰를 할당할 위치를 결정할 수 있도록 허용하는 경우입니다.
[in] CommitSize
뷰의 처음 커밋된 영역의 크기(바이트)를 지정합니다. CommitSize 는 페이지 파일 지원 섹션에만 의미가 있으며 가장 가까운 PAGE_SIZE 배수로 반올림됩니다. 파일을 매핑하는 섹션의 경우 데이터와 이미지가 모두 섹션 생성 시 커밋됩니다.
[in, out, optional] SectionOffset
섹션의 시작 부분에서 뷰로 오프셋(바이트)을 수신하는 변수에 대한 포인터입니다. 이 포인터가 NULL이 아니면 오프셋이 다음 할당 세분성 크기 경계로 반올림됩니다.
[in, out] ViewSize
SIZE_T 변수에 대한 포인터입니다. 이 변수의 초기 값이 0이면 ZwMapViewOfSection 은 SectionOffset 에서 시작하여 섹션의 끝까지 계속되는 섹션의 보기를 매핑합니다. 그렇지 않으면 초기 값은 뷰의 크기(바이트)를 지정합니다. ZwMapViewOfSection 은 보기를 매핑하기 전에 항상 이 값을 PAGE_SIZE 가장 가까운 배수로 반올림합니다.
반환 시 값은 뷰의 실제 크기(바이트)를 받습니다.
[in] InheritDisposition
보기를 자식 프로세스와 공유하는 방법을 지정합니다. 가능한 값은 다음과 같습니다.
ViewShare
뷰는 나중에 만들어지는 모든 자식 프로세스에 매핑됩니다.
ViewUnmap
뷰는 자식 프로세스에 매핑되지 않습니다.
드라이버는 일반적으로 이 매개 변수에 ViewUnmap 을 지정해야 합니다.
[in] AllocationType
지정된 페이지 영역에 대해 수행할 할당 유형을 설명하는 플래그 집합을 지정합니다. 유효한 플래그는 MEM_RESERVE, MEM_TOP_DOWN, MEM_LARGE_PAGES, MEM_DIFFERENT_IMAGE_BASE_OK 및 MEM_REPLACE_PLACEHOLDER. MEM_COMMIT 허용되지 않지만 MEM_RESERVE 지정하지 않으면 암시됩니다. MEM_XXX 플래그에 대한 자세한 내용은 VirtualAlloc 및 MapViewOfFile3 루틴에 대한 설명을 참조하세요.
[in] Win32Protect
매핑된 보기에 적용할 페이지 보호를 지정합니다.
SEC_IMAGE 특성으로 만든 섹션 개체의 경우 Win32Protect 매개 변수는 효과가 없으며 PAGE_READONLY 같은 유효한 값으로 설정할 수 있습니다.
SEC_IMAGE_NO_EXECUTE 특성으로 만든 섹션 개체의 경우 Win32Protect 값을 PAGE_READONLY 설정해야 합니다.
이미지가 아닌 섹션의 경우 Win32Protect 매개 변수의 값은 ZwCreateSection이 호출될 때 지정된 섹션의 페이지 보호와 호환되어야 합니다.
ZwMapViewOfSection 은 섹션 개체를 만들 때 제공된 캐시 유형과 일치하도록 매핑된 페이지의 캐시 형식을 설정합니다. 예를 들어 ZwCreateSection이 SEC_NOCACHE 플래그를 사용하여 호출된 경우 Win32Protect 매개 변수에 PAGE_NOCACHE 플래그가 포함되어 있는지 여부에 관계없이 ZwMapViewOfSection 은 캐시되지 않은 페이지를 매핑합니다.
반환 값
ZwMapViewOfSection 은 NTSTATUS 값을 반환합니다. 가능한 반환 값은 다음과 같습니다.
반환 코드 | 설명 |
---|---|
STATUS_SUCCESS | 루틴이 요청된 작업을 성공적으로 수행했습니다. |
STATUS_CONFLICTING_ADDRESSES | 지정된 주소 범위가 이미 예약된 범위와 충돌합니다. |
STATUS_INVALID_PAGE_PROTECTION | Win32Protect 매개 변수에 지정된 값이 잘못되었습니다. |
STATUS_SECTION_PROTECTION | Win32Protect 매개 변수에 지정된 값은 섹션을 만들 때 지정된 페이지 보호와 호환되지 않습니다. |
설명
섹션의 여러 다른 보기를 하나 이상의 프로세스의 가상 주소 공간에 동시에 매핑할 수 있습니다.
드라이버가 MmAllocatePagesForMdlEx 또는 다른 시스템 구성 요소가 다른 MEMORY_CACHING_TYPE 값으로 동일한 메모리 범위를 매핑하지 않도록 보장하는 다른 메서드를 통해 메모리 범위를 직접 할당하지 않는 한 ZwMapViewOfSection을 사용하여 \Device\PhysicalMemory의 메모리 범위를 사용자 모드로 매핑하지 마세요.
사용자 애플리케이션은 WINDOWS Server 2003 SP1(서비스 팩 1)부터 직접 \Device\PhysicalMemory 에 액세스할 수 없으며 드라이버가 애플리케이션에 핸들을 전달하는 경우에만 액세스할 수 있습니다.
섹션 개체에 대한 자세한 내용은 섹션 개체 및 뷰를 참조하세요.
이 함수에 대한 호출이 사용자 모드에서 발생하는 경우 "ZwMapViewOfSection" 대신 "NtMapViewOfSection" 이름을 사용해야 합니다.
커널 모드 드라이버에서 호출하는 경우 Windows 네이티브 시스템 서비스 루틴의 NtXxx 및 ZwXxx 버전은 입력 매개 변수를 처리하고 해석하는 방식으로 다르게 동작할 수 있습니다. 루틴의 NtXxx 버전과 ZwXxx 버전 간의 관계에 대한 자세한 내용은 네이티브 시스템 서비스 루틴의 Nt 및 Zw 버전 사용을 참조하세요.
요구 사항
요구 사항 | 값 |
---|---|
대상 플랫폼 | 유니버설 |
헤더 | wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함) |
라이브러리 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
DDI 규정 준수 규칙 | HwStorPortProhibitedDDIs(storport), PowerIrpDDis(wdm) |