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은 VirtualAddress 및 Length로 지정된 하위 범위의 페이지를 설명할 수 있을 만큼 커야 합니다.
[in] VirtualAddress
TargetMdl에서 설명할 하위 범위의 기본 가상 주소에 대한 포인터입니다.
[in] Length
TargetMdl에서 매핑할 길이(바이트)를 지정합니다. 이 값은 VirtualAddress와 함께 SourceMdl에서 설명하는 버퍼의 적절한 하위 범위인 버퍼를 지정해야 합니다. Length가 0이면 매핑할 하위 범위가 VirtualAddress에서 시작되고 SourceMdl에서 설명하는 나머지 범위가 포함됩니다.
반환 값
없음
설명
이 루틴은 원본 MDL에서 설명하는 버퍼의 하위 범위를 설명하는 대상 MDL을 빌드합니다. 이 하위 범위는 VirtualAddress 및 Length 매개 변수에 의해 지정됩니다. SourceMdl 및 TargetMdl 매개 변수는 원본 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) |