다음을 통해 공유


MmAdvanceMdl 함수(wdm.h)

MmAdvanceMdl 루틴은 지정된 바이트 수만큼 MDL의 가상 메모리 범위의 시작을 진행합니다.

구문

NTSTATUS MmAdvanceMdl(
  [in, out] PMDL  Mdl,
  [in]      ULONG NumberOfBytes
);

매개 변수

[in, out] Mdl

진행할 MDL을 지정합니다.

[in] NumberOfBytes

MDL의 시작을 진행하는 바이트 수를 지정합니다.

반환 값

MmAdvanceMdl 은 NTSTATUS 코드를 반환합니다. 가능한 반환 값은 다음과 같습니다.

반환 코드 설명
STATUS_SUCCESS
루틴이 MDL의 시작을 성공적으로 진행했습니다.
STATUS_INVALID_PARAMETER_2
호출자가 MDL의 시작을 끝으로 진행하려고 했습니다.

설명

MmAdvanceMdl 은 가상 메모리 주소 범위의 시작만 진행합니다. 끝 주소는 동일하게 유지되며 그에 따라 범위 길이가 축소됩니다.

상위 수준 드라이버는 낮은 수준의 드라이버가 읽기/쓰기 요청을 부분적으로만 완료할 수 있는 경우 메모리 부족 조건에서 MmAdvanceMdl 을 사용할 수 있습니다. 상위 수준 드라이버는 MmAdvanceMdl 을 사용하여 이미 읽거나 쓴 버퍼 부분을 지나서 진행한 다음, IRP를 다시 발행하여 요청을 완료할 수 있습니다. 물론 드라이버는 이 프로세스를 필요에 따라 여러 번 반복할 수 있습니다.

MmAdvanceMdl이 초기 페이지를 지나면 MmAdvanceMdl이 전달한 모든 페이지가 즉시 잠금 해제되고 MDL과 사용자 주소를 매핑하는 시스템 가상 주소도 조정됩니다.

MmAdvanceMdl을 사용하면 시스템 성능이 저하될 수 있습니다. 다음 조건이 모두 유지되는 경우에만 사용해야 합니다.

  • 상위 수준 드라이버는 자체 I/O 처리에서 고정된 양의 데이터를 전송한 후에만 특정 I/O 요청을 완료할 수 있지만 하위 수준 드라이버는 적은 양의 데이터만 전송합니다. (예를 들어 SPX 또는 NBT 프로토콜에 대한 네트워크 전송 드라이버가 있습니다. 각 프로토콜은 이더넷 프레임보다 큰 메시지에 대해 신뢰할 수 있는 메시지 전달을 지원합니다. 전송 드라이버는 여러 이더넷 프레임에서 메시지를 다시 조립한 후에만 이러한 메시지에 대한 읽기 요청을 완료할 수 있습니다.)
  • 상위 수준 드라이버는 이미 불완전한 I/O 요청에서 데이터 조각을 전송하기 위해 새 MDL을 할당하려고 시도했지만 실패했습니다. 드라이버가 새 MDL을 할당하는 데 성공하면 해당 MDL 및 IoBuildPartialMdl 을 사용하여 MmAdvanceMdl 대신 I/O 요청을 수행해야 합니다.
  • 상위 수준 드라이버는 메모리 부족 조건에서도 계속 진행해야 합니다.
이러한 조건을 충족하지 않는 드라이버는 IoBuildPartialMdl 루틴을 사용하여 부분적으로 성공한 I/O 작업을 완료해야 합니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows XP 이상 버전의 Windows에서 사용할 수 있습니다.
대상 플랫폼 유니버설
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <=DISPATCH_LEVEL

추가 정보

IoBuildPartialMdl