WdfRequestRetrieveOutputWdmMdl 함수(wdfrequest.h)
[KMDF에만 적용]
WdfRequestRetrieveOutputWdmMdl 메서드는 I/O 요청의 출력 버퍼를 나타내는 MDL(메모리 설명자 목록)을 검색합니다.
구문
NTSTATUS WdfRequestRetrieveOutputWdmMdl(
[in] WDFREQUEST Request,
[out] PMDL *Mdl
);
매개 변수
[in] Request
프레임워크 요청 개체에 대한 핸들입니다.
[out] Mdl
MDL에 대한 포인터를 수신하는 위치에 대한 포인터입니다.
반환 값
WdfRequestRetrieveOutputWdmMdl은 작업이 성공하면 STATUS_SUCCESS 반환합니다. 그렇지 않으면 이 메서드는 다음 값 중 하나를 반환할 수 있습니다.
반환 코드 | 설명 |
---|---|
|
입력 매개 변수가 잘못되었습니다. |
|
요청 유형이 잘못되었거나 요청이 버퍼링되거나 직접 I/O를 사용하지 않습니다. 데이터 버퍼에 액세스하기 위해 지원되는 방법에 대한 자세한 내용은 다음 설명 섹션을 참조하세요. |
|
요청이 이미 완료되었습니다. |
|
입력 버퍼의 길이가 0입니다. |
|
메모리가 부족합니다. |
이 메서드는 다른 NTSTATUS 값을 반환할 수도 있습니다.
드라이버가 잘못된 개체 핸들을 제공하는 경우 버그 검사 발생합니다.
설명
요청의 출력 버퍼는 드라이버가 요청의 발신자에게 제공하는 디스크의 데이터와 같은 정보를 수신합니다. 드라이버는 읽기 요청 또는 디바이스 I/O 제어 요청에 대해 WdfRequestRetrieveOutputWdmMdl 을 호출할 수 있지만 쓰기 요청에는 호출할 수 없습니다(쓰기 요청은 출력 데이터를 제공하지 않기 때문).
WdfRequestRetrieveOutputWdmMdl 메서드는 버퍼링된 I/O 메서드 또는 직접 I/O 메서드를 사용하여 데이터 버퍼에 액세스하는 I/O 요청에 대한 출력 버퍼의 MDL을 검색합니다. 요청의 I/O 제어 코드가 IRP_MJ_INTERNAL_DEVICE_CONTROL 또는 요청이 다른 커널 모드 드라이버에서 온 경우 WdfRequestRetrieveOutputWdmMdl 은 버퍼링되거나 직접 I/O를 사용하지 않는 I/O 요청도 지원합니다.
WdfRequestRetrieveOutputWdmMdl이 STATUS_SUCCESS 반환하면 드라이버는 출력 버퍼를 설명하는 MDL에 대한 포인터를 받습니다.
드라이버는 I/O 요청을 완료한 후 요청의 MDL에 액세스해서는 안됩니다.
WdfRequestRetrieveOutputWdmMdl에 대한 자세한 내용은 Framework-Based 드라이버에서 데이터 버퍼 액세스를 참조하세요.
예제
다음 코드 예제는 I/O 요청의 입력 버퍼에 대한 MDL을 가져오는 EvtIoRead 콜백 함수의 일부입니다. WdfRequestRetrieveOutputWdmMdl에 대한 호출이 실패하면 드라이버는 WdfRequestRetrieveOutputWdmmdl이 반환하는 오류 상태 요청을 완료합니다.
VOID
MyDrvEvtIoRead(
IN WDFQUEUE Queue,
IN WDFREQUEST Request,
IN size_t Length
)
{
NTSTATUS status;
PMDL mdl = NULL;
...
status = WdfRequestRetrieveOutputWdmMdl(
Request,
&mdl
);
if (!NT_SUCCESS(status))
{
WdfRequestCompleteWithInformation(
Request,
status,
0
);
}
...
}
요구 사항
요구 사항 | 값 |
---|---|
대상 플랫폼 | 유니버설 |
최소 KMDF 버전 | 1.0 |
머리글 | wdfrequest.h(Wdf.h 포함) |
라이브러리 | Wdf01000.sys(프레임워크 라이브러리 버전 관리 참조) |
IRQL | <=DISPATCH_LEVEL |
DDI 규정 준수 규칙 | DriverCreate(kmdf), InvalidReqAccess(kmdf), InvalidReqAccessLocal(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), MdlAfterReqCompletedIntIoctl(kmdf), MdlAfterReqCompletedIntIoctlA(kmdf), MdlAfterReqCompletedIoctl(kmdf), MdlAfterReqCompletedIoctlA(kmdf), MdlAfterReqCompletedRead(kmdf), MdlAfterReqCompletedReadA(kmdf), MdlAfterReqCompletedWrite(kmdf), OutputBufferAPI(kmdf) |