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보다 작아야 하며 BaseAddressNULL인 경우에만 사용됩니다. 즉, 호출자가 시스템에서 뷰를 할당할 위치를 결정할 수 있도록 허용하는 경우입니다.

[in] CommitSize

뷰의 처음 커밋된 영역의 크기(바이트)를 지정합니다. CommitSize 는 페이지 파일 지원 섹션에만 의미가 있으며 가장 가까운 PAGE_SIZE 배수로 반올림됩니다. 파일을 매핑하는 섹션의 경우 데이터와 이미지가 모두 섹션 생성 시 커밋됩니다.

[in, out, optional] SectionOffset

섹션의 시작 부분에서 뷰로 오프셋(바이트)을 수신하는 변수에 대한 포인터입니다. 이 포인터가 NULL이 아니면 오프셋이 다음 할당 세분성 크기 경계로 반올림됩니다.

[in, out] ViewSize

SIZE_T 변수에 대한 포인터입니다. 이 변수의 초기 값이 0이면 ZwMapViewOfSectionSectionOffset 에서 시작하여 섹션의 끝까지 계속되는 섹션의 보기를 매핑합니다. 그렇지 않으면 초기 값은 뷰의 크기(바이트)를 지정합니다. ZwMapViewOfSection 은 보기를 매핑하기 전에 항상 이 값을 PAGE_SIZE 가장 가까운 배수로 반올림합니다.

반환 시 값은 뷰의 실제 크기(바이트)를 받습니다.

[in] InheritDisposition

보기를 자식 프로세스와 공유하는 방법을 지정합니다. 가능한 값은 다음과 같습니다.

ViewShare

뷰는 나중에 만들어지는 모든 자식 프로세스에 매핑됩니다.

ViewUnmap

뷰는 자식 프로세스에 매핑되지 않습니다.

드라이버는 일반적으로 이 매개 변수에 ViewUnmap 을 지정해야 합니다.

[in] AllocationType

지정된 페이지 영역에 대해 수행할 할당 유형을 설명하는 플래그 집합을 지정합니다. 유효한 플래그는 MEM_LARGE_PAGES, MEM_RESERVE 및 MEM_TOP_DOWN. MEM_COMMIT 허용되지 않지만 MEM_RESERVE 지정하지 않으면 암시됩니다. MEM_XXX 플래그에 대한 자세한 내용은 VirtualAlloc 루틴에 대한 설명을 참조하세요.

[in] Win32Protect

처음에 커밋된 페이지의 영역에 대한 보호 유형을 지정합니다. 디바이스 및 중간 드라이버는 이 값을 PAGE_READWRITE 설정해야 합니다.

반환 값

ZwMapViewOfSection 은 NTSTATUS 값을 반환합니다. 가능한 반환 값은 다음과 같습니다.

반환 코드 설명
STATUS_SUCCESS 루틴이 요청된 작업을 성공적으로 수행했습니다.
STATUS_CONFLICTING_ADDRESSES 지정된 주소 범위가 이미 예약된 주소 범위와 충돌하거나 지정된 캐시 특성 유형이 주소 범위의 기존 캐시 특성과 충돌합니다. 예를 들어 매핑되는 메모리가 이미 완전히 캐시된 것으로 매핑된 큰 페이지 내에 있는 경우 이 메모리를 캐시되지 않거나 쓰기가 결합된 메모리로 매핑하도록 요청하는 것은 불법입니다.
STATUS_INVALID_PAGE_PROTECTION Protect 매개 변수에 지정된 값이 잘못되었습니다.
STATUS_SECTION_PROTECTION AllocationType 매개 변수에 지정된 값은 섹션을 만들 때 지정된 보호 유형과 호환되지 않습니다.

설명

섹션의 여러 다른 보기를 하나 이상의 프로세스의 가상 주소 공간에 동시에 매핑할 수 있습니다.

지정된 섹션이 없거나 요청된 액세스가 허용되지 않으면 ZwMapViewOfSection 에서 오류를 반환합니다.

드라이버가 MmAllocatePagesForMdl 또는 다른 시스템 구성 요소가 다른 MEMORY_CACHING_TYPE 값으로 동일한 메모리 범위를 매핑하지 않도록 보장하는 다른 메서드를 통해 메모리 범위를 직접 할당하지 않는 한 ZwMapViewOfSection을 사용하여 \Device\PhysicalMemory의 메모리 범위를 사용자 모드로 매핑하지 마세요.

사용자 애플리케이션은 WINDOWS Server 2003 SP1(서비스 팩 1)부터 직접 \Device\PhysicalMemory 에 액세스할 수 없으며 드라이버가 애플리케이션에 핸들을 전달하는 경우에만 액세스할 수 있습니다.

섹션 개체에 대한 자세한 내용은 섹션 개체 및 뷰를 참조하세요.

이 함수에 대한 호출이 사용자 모드에서 발생하는 경우 "ZwMapViewOfSection" 대신 "NtMapViewOfSection" 이름을 사용해야 합니다.

커널 모드 드라이버에서 호출하는 경우 Windows 네이티브 시스템 서비스 루틴의 NtXxxZwXxx 버전은 입력 매개 변수를 처리하고 해석하는 방식으로 다르게 동작할 수 있습니다. 루틴의 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)

추가 정보

MEMORY_CACHING_TYPE

MmAllocatePagesForMdl

네이티브 시스템 서비스 루틴의 Nt 및 Zw 버전 사용

VirtualAlloc

ZwCurrentProcess

ZwOpenSection

ZwUnmapViewOfSection