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) |