다음을 통해 공유


IoBuildPartialMdl 함수(wdm.h)

IoBuildPartialMdl 루틴은 기존 MDL에서 설명하는 버퍼의 일부를 나타내는 새 MDL(메모리 설명자 목록)을 빌드합니다.

구문

void IoBuildPartialMdl(
  [in]      PMDL  SourceMdl,
  [in, out] PMDL  TargetMdl,
  [in]      PVOID VirtualAddress,
  [in]      ULONG Length
);

매개 변수

[in] SourceMdl

하위 범위를 매핑할 원래 버퍼를 설명하는 MDL에 대한 포인터입니다.

[in, out] TargetMdl

호출자가 할당한 MDL에 대한 포인터입니다. 이 MDL은 VirtualAddressLength로 지정된 하위 범위의 페이지를 설명할 수 있을 만큼 커야 합니다.

[in] VirtualAddress

TargetMdl에서 설명할 하위 범위의 기본 가상 주소에 대한 포인터입니다.

[in] Length

TargetMdl에서 매핑할 길이(바이트)를 지정합니다. 이 값은 VirtualAddress와 함께 SourceMdl에서 설명하는 버퍼의 적절한 하위 범위인 버퍼를 지정해야 합니다. Length가 0이면 매핑할 하위 범위가 VirtualAddress에서 시작되고 SourceMdl에서 설명하는 나머지 범위가 포함됩니다.

반환 값

없음

설명

이 루틴은 원본 MDL에서 설명하는 버퍼의 하위 범위를 설명하는 대상 MDL을 빌드합니다. 이 하위 범위는 VirtualAddressLength 매개 변수에 의해 지정됩니다. SourceMdlTargetMdl 매개 변수는 원본 MDL 및 대상 MDL을 가리킵니다.

드라이버는 IoBuildPartialMdl 을 사용하여 큰 전송 요청을 더 작은 전송 요청으로 분할할 수 있습니다. 드라이버가 IoBuildPartialMdl을 호출하기 전에 원본 MDL에서 설명하는 물리적 페이지를 잠가야 합니다. 일반적으로 원본 MDL은 사용자 주소 공간의 버퍼를 설명하고 드라이버는 MmProbeAndLockPages 루틴을 호출하여 이 버퍼의 페이지를 잠급니다. 그러나 드라이버는 MmBuildMdlForNonPagedPool, MmAllocatePagesForMdlEx 또는 MmAllocatePagesForMdl 루틴을 호출하여 페이지가 없는 메모리에서 원본 MDL을 빌드할 수 있습니다 .

부분 MDL을 만드는 경우:

  • 원래 MDL이 시스템 공간에 이미 매핑된 경우 부분 MDL은 매핑을 공유하며 다시 매핑할 필요가 없습니다.
  • 원래 MDL이 시스템 공간에 매핑되지 않은 경우 부분 MDL도 매핑되지 않습니다. 시스템 모드 주소가 필요한 경우 부분 MDL 에서 MmGetSystemAddressForMdlSafe 를 호출합니다.
  • 위의 적용 대상을 모르는 경우 MmGetSystemAddressForMdlSafe 를 호출하는 것이 안전합니다. 시스템 주소 공간에 이미 매핑된 원본 MDL에서 부분 MDL을 빌드한 경우 MmGetSystemAddressForMdlSafe 는 기존 원본 매핑을 사용합니다. 그렇지 않으면 MmGetSystemAddressForMdlSafe 에서 새 매핑을 만듭니다.

이 새 매핑이 유출되지 않도록 하려면 드라이버는 부분 MDL을 다시 사용하려면 MmPrepareMdlForReuse 를 호출해야 합니다. 또한 IoFreeMdl 루틴은 이러한 매핑이 있는 경우 부분 MDL에 대한 시스템 주소 공간 매핑을 해제합니다.

MDL에 대한 자세한 내용은 MDL 사용을 참조하세요.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 2000부터 사용할 수 있습니다.
대상 플랫폼 유니버설
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <=DISPATCH_LEVEL
DDI 규정 준수 규칙 MdlAfterReqCompletedIntIoctlA(kmdf), MdlAfterReqCompletedIoctlA(kmdf), MdlAfterReqCompletedReadA(kmdf), MdlAfterReqCompletedWriteA(kmdf)

추가 정보

IoFreeMdl

MmAllocatePagesForMdl

MmAllocatePagesForMdlEx

MmBuildMdlForNonPagedPool

MmGetSystemAddressForMdlSafe

MmPrepareMdlForReuse

MmProbeAndLockPages