WdfRequestRetrieveInputMemory 함수(wdfrequest.h)
[KMDF 및 UMDF에 적용]
WdfRequestRetrieveInputMemory 메서드는 I/O 요청의 입력 버퍼를 나타내는 프레임워크 메모리 개체에 대한 핸들을 검색합니다.
통사론
NTSTATUS WdfRequestRetrieveInputMemory(
[in] WDFREQUEST Request,
[out] WDFMEMORY *Memory
);
매개 변수
[in] Request
프레임워크 요청 개체에 대한 핸들입니다.
[out] Memory
프레임워크 메모리 개체에 대한 핸들을 받는 위치에 대한 포인터입니다.
반환 값
WdfRequestRetrieveInputMemory 작업이 성공하면 STATUS_SUCCESS 반환합니다. 그렇지 않으면 이 메서드는 다음 값 중 하나를 반환할 수 있습니다.
이 메서드는 다른NTSTATUS 값을 반환할 수도 있습니다.
드라이버에서 잘못된 개체 핸들을 제공하면 버그 검사가 수행됩니다.
발언
요청의 입력 버퍼에는 요청의 생성자가 제공한 디스크에 쓸 데이터와 같은 정보가 포함됩니다. 드라이버는 WdfRequestRetrieveInputMemory 호출하여 쓰기 요청 또는 디바이스 I/O 제어 요청에 대한 입력 버퍼를 가져올 수 있지만 읽기 요청은 입력 데이터를 제공하지 않으므로 읽기 요청에 대해서는 가져올 수 없습니다.
WdfRequestRetrieveInputMemory 메서드는 버퍼링된 I/O 메서드 또는 데이터 버퍼에 액세스하기 위한 직접 I/O 메서드를 사용하는 I/O 요청에 대한 입력 버퍼를 검색합니다. 요청의 I/O 제어 코드가 IRP_MJ_INTERNAL_DEVICE_CONTROL요청이 다른 커널 모드 드라이버에서 온 경우 WdfRequestRetrieveInputMemory 버퍼링되거나 직접 I/O 사용하는 I/O 요청도 지원합니다.
WdfRequestRetrieveInputMemory STATUS_SUCCESS 반환하면 드라이버는 입력 버퍼를 나타내는 프레임워크 메모리 개체에 대한 핸들을 받습니다. 버퍼에 액세스하려면 드라이버가 WdfMemoryGetBuffer호출해야 합니다.
드라이버는 Request 매개 변수가 나타내는 I/O 요청 완료할 때까지 검색된 프레임워크 메모리 개체에 액세스할 수 있습니다.
WdfRequestRetrieveInputMemory호출하는 대신 드라이버는 버퍼의 주소와 길이를 검색하는 WdfRequestRetrieveInputBuffer호출할 수 있습니다.
WdfRequestRetrieveInputMemory대한 자세한 내용은 Framework-Based 드라이버 데이터 버퍼에 액세스하는참조하세요.
예제
다음 코드 예제에서는 EvtIoWrite 콜백 함수가 쓰기 요청의 입력 버퍼를 나타내는 프레임워크 메모리 개체에 대한 핸들을 가져오는 방법을 보여 줍니다. 그런 다음, 이 예제에서는 USB I/O 대상에 쓰기 요청을 포맷하고 보냅니다.
VOID
MyEvtIoWrite(
IN WDFQUEUE Queue,
IN WDFREQUEST Request,
IN size_t Length
)
{
NTSTATUS status;
WDFUSBPIPE pipe;
WDFMEMORY reqMemory;
PDEVICE_CONTEXT pDeviceContext;
//
// The driver previously stored a pipe handle in
// the device object's context space.
//
pDeviceContext = GetDeviceContext(WdfIoQueueGetDevice(Queue));
pipe = pDeviceContext->BulkWritePipe;
//
// Get input memory.
//
status = WdfRequestRetrieveInputMemory(
Request,
&reqMemory
);
if(!NT_SUCCESS(status)){
goto Exit;
}
//
// Format the request.
//
status = WdfUsbTargetPipeFormatRequestForWrite(
pipe,
Request,
reqMemory,
NULL
);
if (!NT_SUCCESS(status)) {
goto Exit;
}
WdfRequestSetCompletionRoutine(
Request,
EvtRequestWriteCompletionRoutine,
pipe
);
//
// Send the request.
//
if (WdfRequestSend(
Request,
WdfUsbTargetPipeGetIoTarget(pipe),
WDF_NO_SEND_OPTIONS
) == FALSE) {
status = WdfRequestGetStatus(Request);
goto Exit;
}
Exit:
//
// Complete the request now if an error occurred.
//
if (!NT_SUCCESS(status)) {
WdfRequestCompleteWithInformation(
Request,
status,
0
);
}
return;
}
요구 사항
요구 | 값 |
---|---|
대상 플랫폼 | 보편적 |
최소 KMDF 버전 | 1.0 |
최소 UMDF 버전 | 2.0 |
헤더 | wdfrequest.h(Wdf.h 포함) |
라이브러리 | Wdf01000.sys(KMDF); WUDFx02000.dll(UMDF) |
IRQL | <=DISPATCH_LEVEL |
DDI 규정 준수 규칙 | DriverCreate(kmdf), InputBufferAPI(kmdf), InvalidReqAccess(kmdf), InvalidReqAccessLocal(kmdf) ), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), MemAfterReqCompletedIntIoc, MemAfterReqCompletedIntIoctlA(kmdf), MemAfterReqCompletedIoctl(kmdf), MemAfterReqCompletedIoctlA(kmdf), MemAfterReqCompletedRead(kmdf), MemAfterReqCompletedWrite(kmdf), MemAfterReqCompletedWriteA(kmdf) |