WdfRequestSend 함수(wdfrequest.h)
[KMDF 및 UMDF에 적용]
WdfRequestSend 메서드는 지정된 I/O 요청을 지정된 I/O 대상으로 보냅니다.
구문
BOOLEAN WdfRequestSend(
[in] WDFREQUEST Request,
[in] WDFIOTARGET Target,
PWDF_REQUEST_SEND_OPTIONS Options
);
매개 변수
[in] Request
프레임워크 요청 개체에 대한 핸들입니다.
[in] Target
프레임워크 I/O 대상 개체에 대한 핸들입니다. 이 핸들을 가져오는 방법에 대한 자세한 내용은 다음 주의 섹션을 참조하세요.
Options
호출자가 제공한 요청 옵션을 포함하는 WDF_REQUEST_SEND_OPTIONS 구조체에 대한 포인터입니다. 이 매개 변수는 선택 사항이며 요청 옵션을 사용하지 않으려면 NULL 일 수 있습니다.
반환 값
요청이 대상으로 전송된 경우 WdfRequestSend는 TRUE를 반환합니다. 그렇지 않으면 이 메서드는 FALSE를 반환 합니다.
드라이버에서 잘못된 개체 핸들을 제공하는 경우 버그 검사가 발생합니다.
설명
드라이버가 Request 매개 변수에 대해 지정하는 요청 개체는 수신한 개체이거나 WdfRequestCreate 메서드를 호출하여 만든 개체일 수 있습니다.
I/O 대상 개체에 대한 핸들을 가져오기 위해 드라이버는 다음 중 하나를 수행할 수 있습니다.
- 드라이버가 일반 I/O 대상을 사용하는 경우 WdfDeviceGetIoTarget을 호출합니다. 자세한 내용은 일반 I/O 대상 초기화를 참조하세요.
- 드라이버가 특수화된 I/O 대상을 사용하는 경우 특수 대상 개체가 정의하는 하나 이상의 메서드를 호출합니다. 예를 들어 USB 디바이스용 드라이버는 WdfUsbTargetDeviceGetIoTarget 또는 WdfUsbTargetPipeGetIoTarget을 호출할 수 있습니다.
WdfRequestSend가 실패하거나 드라이버가 WDF_REQUEST_SEND_OPTION_SYNCHRONOUS 플래그를 설정하는 경우 드라이버는 WdfRequestSend를 호출한 직후 WdfRequestGetStatus를 호출할 수 있습니다.
WdfRequestSend가 성공하고 드라이버가 WDF_REQUEST_SEND_OPTION_SYNCHRONOUS 플래그를 설정하지 않으면 드라이버는 일반적으로 CompletionRoutine 콜백 함수 내에서 WdfRequestGetStatus를 호출합니다.
드라이버가 요청을 동기적으로 보내는 경우 드라이버는 이 구조체의 Flags 멤버에서 WDF_REQUEST_SEND_OPTIONS 구조체 및 제한 시간 플래그에 시간 제한 값을 설정하는 것이 좋습니다.
드라이버가 시간 제한 값을 제공하는 경우 WdfRequestSend를 호출하기 전에 WdfRequestAllocateTimer를 호출해야 합니다. 이렇게 하면 타이머를 할당할 시스템 리소스가 부족한 경우 WdfRequestSend 가 실패하지 않습니다.
드라이버가 WDF_REQUEST_SEND_OPTION_SYNCHRONOUS 플래그를 설정하는 경우 IRQL = PASSIVE_LEVEL WdfRequestSend 를 호출해야 합니다. 이 플래그가 설정되지 않은 경우 드라이버는 IRQL <= DISPATCH_LEVEL 이 메서드를 호출해야 합니다. WdfRequestSend 는 호출자의 IRQL에서 요청을 보냅니다.
드라이버가 파이프에 대한 연속 판독기를 구성한 경우 드라이버는 WdfRequestSend를 호출하여 USB 파이프에 I/O 요청을 보낼 수 없습니다.
UMDF 드라이버에 요청을 보낼 때 커널 모드 드라이버는 UMDF 드라이버에서 Kernel-Mode 클라이언트 지원에 설명된 IRQL 제한을 따라야 합니다.
WdfRequestSend에 대한 자세한 내용은 I/O 요청 전달을 참조하세요.
예제
다음 코드 예제는 kmdf_fx2 샘플 드라이버에서 EvtIoWrite 콜백 함수의 단축된 버전입니다. 이 함수는 요청의 버퍼 길이에 대한 유효성을 검사하고, 버퍼에 대한 핸들을 가져오고, USB 대상에 대한 요청의 형식을 지정하고, 요청을 보냅니다.
VOID
OsrFxEvtIoWrite(
IN WDFQUEUE Queue,
IN WDFREQUEST Request,
IN size_t Length
)
{
WDFUSBPIPE pipe;
NTSTATUS status;
WDFMEMORY reqMemory;
PDEVICE_CONTEXT pDeviceContext;
UNREFERENCED_PARAMETER(Queue);
//
// Check if the transfer size is valid.
//
if (Length > MAX_TRANSFER_BUFFER_SIZE) {
status = STATUS_INVALID_PARAMETER;
goto Exit;
}
//
// Get driver-defined context space from
// the device object. The driver stored the
// pipe handle there.
//
pDeviceContext = GetDeviceContext(WdfIoQueueGetDevice(Queue));
pipe = pDeviceContext->BulkWritePipe;
//
// Get a handle to a memory object that represents
// the input buffer.
//
status = WdfRequestRetrieveInputMemory(Request, &reqMemory);
if (!NT_SUCCESS(status)){
goto Exit;
}
//
// Format the request so it can be sent to a USB target.
//
status = WdfUsbTargetPipeFormatRequestForWrite(
pipe,
Request,
reqMemory,
NULL // Offsets
);
if (!NT_SUCCESS(status)) {
goto Exit;
}
//
// Set a CompletionRoutine callback function.
//
WdfRequestSetCompletionRoutine(
Request,
EvtRequestReadCompletionRoutine,
pipe
);
//
// Send the request. If an error occurs, complete the request.
//
if (WdfRequestSend(
Request,
WdfUsbTargetPipeGetIoTarget(pipe),
WDF_NO_SEND_OPTIONS
) == FALSE) {
status = WdfRequestGetStatus(Request);
goto Exit;
}
Exit:
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 | 주의 섹션을 참조하세요. |
| DDI 규정 준수 규칙 | DeferredRequestCompleted(kmdf), DriverCreate(kmdf), InvalidReqAccess(kmdf), InvalidReqAccessLocal(kmdf), KmdfIrql(kmdf), ReqCompletionRoutine(kmdf), ReqMarkCancelableSend(kmdf), ReqSendFail(kmdf), ReqSendWhileSpinlock(kmdf), RequestCompleted(kmdf), RequestCompletedLocal(kmdf), RequestFormattedValid(kmdf), RequestGetStatusValid(kmdf), RequestSendAndForgetNoFormatting(kmdf), RequestSendAndForgetNoFormatting2(kmdf), SyncReqSend2(kmdf), WdfRequestSendSyncAtDispatch(kmdf), WdfRequestSendSyncAtDispatch2(kmdf) |
참고 항목
피드백
다음에 대한 사용자 의견 제출 및 보기