MmGetSystemAddressForMdlSafe 함수(wdm.h)

MmGetSystemAddressForMdlSafe 매크로는 지정된 MDL에서 설명하는 버퍼에 대해 페이지가 없는 시스템 공간 가상 주소를 반환합니다.

구문

PVOID MmGetSystemAddressForMdlSafe(
  [in] PMDL  Mdl,
  [in] ULONG Priority
);

매개 변수

[in] Mdl

해당 기본 가상 주소를 매핑할 버퍼에 대한 포인터입니다.

[in] Priority

사용 가능한 PTE 조건에서 성공의 중요성을 나타내는 MM_PAGE_PRIORITY 값을 지정합니다. LowPagePriority, NormalPagePriority 또는 HighPagePriority의 우선 순위 값을 지정합니다. Windows 8 시작하여 MdlMappingNoWrite 또는 MdlMappingNoExecute 플래그를 사용하여 지정된 우선 순위 값을 비트 단위로 ORed할 수 있습니다.

  • LowPagePriority 는 시스템이 리소스가 상당히 부족한 경우 매핑 요청이 실패할 수 있음을 나타냅니다. 이 상황의 예는 드라이버가 매핑 실패를 처리할 수 있는 비임계 네트워크 연결입니다.

  • NormalPagePriority 는 시스템이 리소스가 매우 부족한 경우 매핑 요청이 실패할 수 있음을 나타냅니다. 이 상황의 예로는 비임계 로컬 파일 시스템 요청이 있습니다.

  • HighPagePriority 는 시스템이 리소스를 완전히 벗어나지 않는 한 매핑 요청이 실패하지 않아야 함을 나타냅니다. 이 상황의 예로는 드라이버의 페이징 파일 경로가 있습니다.

  • MdlMappingNoWrite 는 매핑된 실제 페이지를 쓰기 없음(읽기 전용) 메모리로 구성해야 했음을 나타냅니다. Windows 8 시작해서 이 플래그 비트는 쓰기가 사용하지 않도록 설정된 메모리를 지정하는 MM_PAGE_PRIORITY 값으로 비트 ORed가 될 수 있습니다.

  • MdlMappingNoExecute 는 매핑된 실제 페이지를 실행되지 않는 메모리로 구성해야 했음을 나타냅니다. Windows 8 시작해서 이 플래그 비트는 MM_PAGE_PRIORITY 값으로 비트 ORed가 되어 명령 실행이 비활성화된 메모리를 지정할 수 있습니다. 실행 가능한 메모리가 명시적으로 필요하지 않은 경우 Windows 8 이상 버전의 Windows용으로 작성된 드라이버는 항상 실행되지 않는 메모리를 지정해야 합니다.

반환 값

MmGetSystemAddressForMdlSafe 는 지정된 MDL에서 설명하는 실제 페이지를 매핑하는 기본 시스템 공간 가상 주소를 반환합니다. 페이지가 시스템 주소 공간에 아직 매핑되지 않고 매핑 시도가 실패하면 NULL 이 반환됩니다.

설명

이 루틴은 지정된 MDL에서 설명하는 실제 페이지를 시스템 주소 공간에 아직 매핑되지 않은 경우 시스템 주소 공간에 매핑합니다.

PIO(programd-I/O) 디바이스의 드라이버는 이 루틴을 호출하여 Irp-MdlAddress>의 MDL에서 설명하고 이미 사용자 모드 가상 주소 범위에 매핑된 사용자 모드 버퍼를 시스템 주소 공간의 범위에 매핑합니다.

이 루틴을 입력할 때 지정된 MDL은 잠긴 실제 페이지를 설명해야 합니다. 잠긴 MDL은 MmProbeAndLockPages, MmBuildMdlForNonPagedPool, IoBuildPartialMdl 또는 MmAllocatePagesForMdlEx 루틴을 사용하여 빌드할 수 있습니다.

MmGetSystemAddressForMdlSafe에서 반환되는 시스템 주소 공간 매핑이 더 이상 필요하지 않은 경우 해제해야 합니다. 매핑을 해제하는 데 필요한 단계는 MDL을 빌드하는 방법에 따라 달라집니다. 가능한 4가지 사례는 다음과 같습니다.

  • MMProbeAndLockPages 루틴을 호출하여 MDL을 빌드한 경우 시스템 주소 공간 매핑을 명시적으로 해제할 필요가 없습니다. 대신 MmUnlockPages 루틴을 호출하면 매핑이 할당된 경우 매핑이 해제됩니다.

  • MMBuildMdlForNonPagedPool 루틴을 호출하여 MDL을 빌드한 경우 MmGetSystemAddressForMdlSafe는 새 시스템 주소 공간 매핑을 만드는 대신 기존 시스템 주소 공간 매핑을 다시 사용합니다. 이 경우 정리가 필요하지 않습니다(즉, 잠금 해제 및 매핑 해제가 필요하지 않음).

  • IoBuildPartialMdl 루틴을 호출하여 MDL을 빌드한 경우 드라이버는 MmPrepareMdlForReuse 루틴 또는 IoFreeMdl 루틴을 호출하여 시스템 주소 공간 매핑을 해제해야 합니다.

  • MMAllocatePagesForMdlEx 루틴을 호출하여 MDL을 빌드한 경우 드라이버는 MmUnmapLockedPages 루틴을 호출하여 시스템 주소 공간 매핑을 해제해야 합니다. MMGetSystemAddressForMdlSafe가 MDL에 대해 두 번 이상 호출되는 경우 후속 MmGetSystemAddressForMdlSafe 호출은 첫 번째 호출에서 만든 매핑을 반환하기만 하면 됩니다. MmUnmapLockedPages를 한 번 호출하면 이 매핑을 해제하기에 충분합니다.

Windows 7 및 Windows Server 2008 R2부터는 MmAllocatePagesForMdlEx에서 만든 MDL에 대해 MmUnmapLockedPages를 명시적으로 호출할 필요가 없습니다. 대신 MmFreePagesFromMdl 루틴을 호출하면 시스템 주소 공간 매핑이 할당된 경우 해제됩니다.

새 시스템 주소 공간 매핑을 만들기 위해 MmGetSystemAddressForMdlSafeCacheType 매개 변수가 MmCached로 설정된 MmMapLockedPagesSpecifyCache를 호출합니다. MmCached 이외의 캐시 형식이 필요한 드라이버는 MmGetSystemAddressForMdlSafe를 호출하는 대신 MmMapLockedPagesSpecifyCache를 직접 호출해야 합니다. CacheType 매개 변수에 대한 자세한 내용은 MmMapLockedPagesSpecifyCache를 참조하세요.

MmMapLockedPagesSpecifyCache 호출에서 지정된 캐시 형식은 MDL에서 설명하는 페이지에 연결된 캐시 형식이 아직 없는 경우에만 사용됩니다. 그러나 거의 모든 경우에 페이지에는 이미 연결된 캐시 유형이 있으며 이 캐시 형식은 새 매핑에서 사용됩니다. 이 규칙의 예외는 페이지의 원래 캐시 유형에 관계없이 캐시 유형을 MmCached로 설정하는 MmAllocatePagesForMdl에 의해 할당된 페이지에 대한 것입니다.

이 루틴은 호출 스레드가 MDL을 소유한다고 가정하기 때문에 한 번에 하나의 스레드만 특정 MDL에 대해 MmGetSystemAddressForMdlSafe 를 안전하게 호출할 수 있습니다. 그러나 MmGetSystemAddressForMdlSafe 는 동일한 스레드에서 모든 호출을 만들거나 호출이 여러 스레드에서 온 경우 호출을 명시적으로 동기화하여 동일한 MDL에 대해 두 번 이상 호출할 수 있습니다.

드라이버가 요청을 더 작은 요청으로 분할해야 하는 경우 드라이버는 추가 MDL을 할당하거나 드라이버가 IoBuildPartialMdl 루틴을 사용할 수 있습니다.

반환된 기본 주소는 MDL의 가상 주소와 동일한 오프셋을 찾습니다.

Windows 98은 MmGetSystemAddressForMdlSafe를 지원하지 않습니다. 대신 MmGetSystemAddressForMdl 을 사용합니다.

이 매크로는 MmMapLockedPagesSpecifyCache를 호출하므로 이를 사용하려면 NtosKrnl.lib에 연결해야 할 수 있습니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 2000
머리글 wdm.h
IRQL <= DISPATCH_LEVEL
DDI 규정 준수 규칙 MdlAfterReqCompletedIntIoctlA(kmdf), MdlAfterReqCompletedIoctlA(kmdf), MdlAfterReqCompletedReadA(kmdf), MdlAfterReqCompletedWriteA(kmdf)