다음을 통해 공유


WdfDeviceEnqueueRequest 함수(wdfdevice.h)

[KMDF에만 적용]

WdfDeviceEnqueueRequest 메서드는 프레임워크에 지정된 I/O 요청을 전달하므로 프레임워크는 이후에 드라이버가 지정된 디바이스에 대해 만든 I/O 큐 중 하나에 요청을 추가할 수 있습니다.

구문

NTSTATUS WdfDeviceEnqueueRequest(
  [in] WDFDEVICE  Device,
  [in] WDFREQUEST Request
);

매개 변수

[in] Device

프레임워크 디바이스 개체에 대한 핸들입니다.

[in] Request

프레임워크 요청 개체에 대한 핸들입니다.

반환 값

작업이 성공하면 메서드는 STATUS_SUCCESS 반환합니다. 추가 반환 값은 다음과 같습니다.

반환 코드 설명
STATUS_INSUFFICIENT_RESOURCES
사용 가능한 메모리 양이 부족합니다.
STATUS_INVALID_DEVICE_REQUEST
드라이버가 디바이스에 대한 I/O 큐를 만들지 않았으며 드라이버가 필터 드라이버가 아닙니다.
STATUS_WDF_BUSY
디바이스의 I/O 큐가 요청을 수락하지 않습니다.
 

메서드는 다른 NTSTATUS 값을 반환할 수 있습니다.

드라이버가 잘못된 개체 핸들을 제공하는 경우 버그 검사 발생합니다.

설명

드라이버는 EvtIoInCallerContext 콜백 함수에서만 WdfDeviceEnqueueRequest를 호출할 수 있습니다.

WdfDeviceEnqueueRequest 메서드는 드라이버가 디바이스를 만든 경우 드라이버의 요청 유형별 I/O 큐에 요청을 추가합니다. 그렇지 않으면 드라이버가 만든 경우 메서드는 디바이스의 기본 큐에 요청을 추가합니다.

드라이버가 디바이스에 대한 I/O 큐를 만들지 않은 경우 WdfDeviceEnqueueRequest 는 다음을 수행합니다.

  • 드라이버가 필터 드라이버인 경우 WdfDeviceEnqueueRequest 는 드라이버의 I/O 대상에 요청을 보냅니다.
  • 드라이버가 필터 드라이버가 아닌 경우 WdfDeviceEnqueueRequest 는 STATUS_INVALID_DEVICE_REQUEST 반환합니다.
WdfDeviceEnqueueRequest가 실행되는 동안 드라이버가 요청을 수신하고 완료하거나 취소할 수 있습니다.

따라서 드라이버가 WdfDeviceEnqueueRequest를 호출한 후 요청 또는 해당 컨텍스트를 사용해야 하는 경우 WdfDeviceEnqueueRequest를 호출하기 전에 요청에 대한 참조를 가져와야 합니다.

이렇게 하려면 드라이버가 WdfDeviceEnqueueRequest를 호출한 후 WdfObjectReference를 호출한 다음 WdfObjectDereference를 호출할 수 있습니다. 드라이버는 EvtIoInCallerContext를 종료하기 전에 요청을 역참조해야 합니다.

WdfDeviceEnqueueRequest 메서드에 대한 자세한 내용은 I/O 큐 관리를 참조하세요.

KMDF 버전 1.0 및 1.5의 경우 PASSIVE_LEVEL WdfDeviceEnqueueRequest 를 호출해야 합니다. 버전 1.7 이상에서는 IRQL <= DISPATCH_LEVEL WdfDeviceEnqueueRequest를 호출할 수 있습니다.

예제

다음 코드 예제는 사용자 지정 I/O 제어 코드 IOCTL_NONPNP_METHOD_NEITHER 포함된 요청을 찾는 EvtIoInCallerContext 콜백 함수입니다. I/O 컨트롤 코드를 찾을 수 없는 경우 콜백 함수는 프레임워크에 요청을 반환합니다. 콜백 함수가 I/O 컨트롤 코드를 찾으면 요청을 전처리한 다음 프레임워크로 반환합니다. 오류가 발생하면 콜백 함수가 요청을 완료합니다.

VOID
MyEvtDeviceIoInCallerContext(
    IN WDFDEVICE  Device,
    IN WDFREQUEST Request
    )
{
    NTSTATUS  status = STATUS_SUCCESS;
    WDF_REQUEST_PARAMETERS  params;

    WDF_REQUEST_PARAMETERS_INIT(&params);
    WdfRequestGetParameters(
                            Request,
                            &params
                            );
    if(!(params.Type == WdfRequestTypeDeviceControl &&
         params.Parameters.DeviceIoControl.IoControlCode == IOCTL_NONPNP_METHOD_NEITHER)) {
        status = WdfDeviceEnqueueRequest(
                                         Device,
                                         Request
                                         );
        if(!NT_SUCCESS(status)) {
            goto End;
        }
        return;
    }
    //
    // Found a match for the control code. Preprocess the request, and then
    // return the request to the framework.
    //

    //...(Preprocess the request here.)

    status = WdfDeviceEnqueueRequest(
                                     Device,
                                     Request
                                     );
    if(!NT_SUCCESS(status)) {
        goto End;
    }
    return;
End:
    WdfRequestComplete(
                       Request,
                       status
                       );
    return;
}

요구 사항

요구 사항
대상 플랫폼 유니버설
최소 KMDF 버전 1.0
머리글 wdfdevice.h(Wdf.h 포함)
라이브러리 Wdf01000.sys(프레임워크 라이브러리 버전 관리 참조)
IRQL <= DISPATCH_LEVEL(설명 섹션 참조)
DDI 규정 준수 규칙 DeferredRequestCompleted(kmdf), DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), RequestCompleted(kmdf), RequestCompletedLocal(kmdf)

추가 정보

WDF_REQUEST_PARAMETERS_INIT

WdfRequestComplete

WdfRequestGetParameters