다음을 통해 공유


MmMapLockedPagesSpecifyCache 함수(wdm.h)

MmMapLockedPagesSpecifyCache 루틴은 MDL에서 설명하는 실제 페이지를 가상 주소에 매핑하고 호출자가 매핑을 만드는 데 사용되는 캐시 특성을 지정할 수 있도록 합니다.

구문

PVOID MmMapLockedPagesSpecifyCache(
  [in]           PMDL                                                                          MemoryDescriptorList,
  [in]           __drv_strictType(KPROCESSOR_MODE / enum _MODE,__drv_typeConst)KPROCESSOR_MODE AccessMode,
  [in]           __drv_strictTypeMatch(__drv_typeCond)MEMORY_CACHING_TYPE                      CacheType,
  [in, optional] PVOID                                                                         RequestedAddress,
  [in]           ULONG                                                                         BugCheckOnFailure,
  [in]           ULONG                                                                         Priority
);

매개 변수

[in] MemoryDescriptorList

매핑할 MDL에 대한 포인터입니다. 이 MDL은 잠긴 실제 페이지를 설명해야 합니다. 잠긴 MDL은 MmProbeAndLockPages 또는 MmAllocatePagesForMdlEx 루틴을 통해 빌드할 수 있습니다. 사용자 공간에 대한 매핑의 경우 MmBuildMdlForNonPagedPool 루틴으로 빌드된 MDL을 사용할 수 있습니다.

[in] AccessMode

MDL을 매핑할 액세스 모드( KernelMode 또는 UserMode)를 지정합니다. 거의 모든 드라이버는 KernelMode를 사용해야 합니다.

[in] CacheType

MDL을 매핑하는 데 사용할 캐시 특성을 나타내는 MEMORY_CACHING_TYPE 값을 지정합니다. 자세한 내용은 아래 설명 부분을 참조하십시오.

[in, optional] RequestedAddress

AccessMode = UserMode인 경우 이 매개 변수는 MDL을 매핑할 시작 사용자 가상 주소를 지정하거나 시스템이 시작 주소를 선택할 수 있도록 NULL로 설정합니다. 시스템은 주소 경계 요구 사항에 맞게 요청된 주소를 반올림할 수 있으므로 호출자는 반환 값을 검사 합니다.

[in] BugCheckOnFailure

시스템 리소스가 부족하여 MDL을 매핑할 수 없는 경우 AccessMode = KernelMode 에 대한 루틴의 동작을 지정합니다. TRUE이면 시스템에서 버그 검사 발급합니다. FALSE이면 루틴이 NULL을 반환합니다. 드라이버는 이 매개 변수를 FALSE로 설정해야 합니다.

[in] Priority

PTE(페이지 테이블 항목)가 부족한 경우 성공의 중요성을 나타내는 MM_PAGE_PRIORITY 값입니다. Windows 8 시작하여 MdlMappingNoWrite 또는 MdlMappingNoExecute 플래그를 사용하여 지정된 우선 순위 값을 비트 단위로 ORed하여 쓰기 또는 명령 실행이 비활성화된 메모리를 지정할 수 있습니다. Priority의 가능한 값에 대한 자세한 내용은 MmGetSystemAddressForMdlSafe를 참조하세요.

반환 값

MmMapLockedPagesSpecifyCache 는 매핑된 페이지의 시작 주소를 반환합니다. 페이지를 매핑할 수 없고 BugCheckOnFailureFALSE이면 루틴은 NULL을 반환합니다.

설명

MmUnmapLockedPages를 사용하여 MmMapLockedPagesSpecifyCache에 의해 매핑된 실제 페이지의 매핑을 해제합니다.

AccessModeKernelMode이고 MmMapLockedPagesSpecifyCache가 지정된 페이지를 매핑할 수 없는 경우 루틴은 NULL(BugCheckOnFailure = FALSE인 경우)을 반환하거나 운영 체제에서 버그 검사(BugCheckOnFailure = TRUE인 경우)를 실행합니다.

AccessModeUserMode인 경우 다음 세부 정보를 알고 있어야 합니다.

  • 지정된 페이지를 매핑할 수 없는 경우 루틴에서 예외가 발생합니다. UserMode를 지정하는 호출자는 try/except 블록에서 MmMapLockedPagesSpecifyCache에 대한 호출을 래핑해야 합니다. 자세한 내용은 예외 처리를 참조하세요.

  • 루틴은 드라이버가 실행되는 프로세스의 컨텍스트에서 유효한 사용자 주소를 반환합니다. 예를 들어 64비트 드라이버가 32비트 애플리케이션의 컨텍스트에서 실행되는 경우 버퍼는 애플리케이션의 32비트 주소 범위에 있는 주소에 매핑됩니다.

  • AccessModeUserMode인 경우 실행 불가능한 매핑이 항상 만들어집니다. 따라서 이 시나리오에서는 Priority 매개 변수와 함께 MdlMappingNoExecute 플래그를 사용할 필요가 없습니다. 그러나 이 시나리오에서 MdlMappingNoWrite 플래그를 Priority 매개 변수와 함께 사용하여 읽기 전용 매핑을 요청할 수 있습니다.

  • 매핑의 실행 불가능 보호 및 Priority 매개 변수와 함께 MdlMappingNoWrite 플래그를 사용하여 지정한 매핑의 쓰기 보호는 사용자 모드에서 실행되는 코드에서 변경할 수 없습니다. 예를 들어 드라이버가 일부 페이지를 사용자 프로세스에 매핑하고 MdlMappingNoWrite 플래그를 지정하는 경우 시스템은 프로세스가 페이지를 수정할 수 없음을 보장합니다.

루틴은 MDL에서 설명하는 페이지에 캐시 형식이 연결되어 있지 않은 경우에만 CacheType 매개 변수를 사용합니다. 그러나 거의 모든 경우에 페이지에는 이미 연결된 캐시 유형이 있으며 이 캐시 형식은 새 매핑에서 사용됩니다. 이 규칙의 예외는 특정 캐시 형식이 연결되어 있지 않은 MmAllocatePagesForMdl에 의해 할당된 페이지에 대한 것입니다. 이러한 페이지의 경우 CacheType 매개 변수는 매핑의 캐시 유형을 결정합니다.

드라이버는 MDL에 대해 둘 이상의 시스템 주소 공간 매핑을 만들려고 시도해서는 안됩니다. 또한 MmBuildMdlForNonPagedPool 루틴에 의해 빌드된 MDL이 이미 시스템 주소 공간에 매핑되어 있으므로 드라이버는 MmMapLockedPagesSpecifyCache 루틴을 사용하여 이 MDL을 시스템 주소 공간에 다시 매핑하려고 시도해서는 안 됩니다(사용자 주소 공간 매핑 만들기는 허용되지만). 잠긴 MDL에 시스템 주소 공간 매핑이 이미 있는지 여부를 알 수 없는 경우 드라이버는 MmMapLockedPagesSpecifyCache 대신 MmGetSystemAddressForMdlSafe 매크로를 사용할 수 있습니다. MDL이 시스템 주소 공간에 이미 매핑된 경우 MmGetSystemAddressForMdlSafe 는 새 매핑을 만드는 대신 기존 시스템 주소 공간 매핑을 반환합니다.

경고

커널 메모리를 사용자 주소 공간에 매핑하는 드라이버는 잠재적으로 중요한 커널 데이터를 신뢰할 수 없는 프로세스에 노출하지 않아야 합니다. 풀에서 할당된 버퍼와 같이 초기화되지 않은 버퍼는 매핑되기 전에 명시적으로 0으로 채워야 합니다. 또한 풀에서 할당된 사용자 모드 버퍼의 크기는 버퍼의 페이지 일부가 다른 할당에 사용되지 않도록 하려면 가상 메모리 페이지 크기의 배수여야 합니다. 마지막으로 버퍼는 여전히 사용자 주소 공간에 매핑되는 동안 풀로 다시 해제되어서는 안 됩니다.

AccessModeUserMode인 경우 호출자는 IRQL <= APC_LEVEL 실행 중이어야 합니다. AccessModeKernelMode인 경우 호출자는 IRQL <= DISPATCH_LEVEL 실행 중이어야 합니다.

요구 사항

요구 사항
대상 플랫폼 유니버설
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL 설명 섹션을 참조하십시오.
DDI 규정 준수 규칙 HwStorPortProhibitedDDIs(storport)

추가 정보

MmAllocatePagesForMdl

MmAllocatePagesForMdlEx

MmBuildMdlForNonPagedPool

MmGetSystemAddressForMdlSafe

MmProbeAndLockPages

MmUnmapLockedPages