WdfRequestForwardToParentDeviceIoQueue 함수(wdfrequest.h)

[KMDF에만 적용]

WdfRequestForwardToParentDeviceIoQueue 메서드는 자식 디바이스의 I/O 큐에서 자식 부모 디바이스의 지정된 I/O 큐로 I/O 요청을 다시 큐에 추가합니다.

구문

NTSTATUS WdfRequestForwardToParentDeviceIoQueue(
  [in] WDFREQUEST                   Request,
  [in] WDFQUEUE                     ParentDeviceQueue,
  [in] PWDF_REQUEST_FORWARD_OPTIONS ForwardOptions
);

매개 변수

[in] Request

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

[in] ParentDeviceQueue

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

[in] ForwardOptions

호출자가 할당한 WDF_REQUEST_FORWARD_OPTIONS 구조체에 대한 포인터입니다.

반환 값

WdfRequestForwardToParentDeviceIoQueue 는 작업이 성공하면 STATUS_SUCCESS 반환합니다. 그렇지 않으면 이 메서드는 다음 값 중 하나를 반환할 수 있습니다.

반환 코드 설명
STATUS_INFO_LENGTH_MISMATCH
제공된 WDF_REQUEST_FORWARD_OPTIONS 구조체의 크기가 잘못되었습니다.
STATUS_INVALID_PARAMETER
제공된 WDF_REQUEST_FORWARD_OPTIONS 구조체의 멤버에 잘못된 값이 포함되어 있습니다.
STATUS_INVALID_DEVICE_REQUEST
다음 중 하나가 발생하면 이 값이 반환됩니다.
  • 드라이버가 I/O 큐에서 I/O 요청을 가져오지 못했습니다.
  • 원본 및 대상 I/O 큐는 동일합니다.
  • 지정된 I/O 큐가 부모 디바이스에 속하지 않습니다.
  • 드라이버가 보증된 정방향 진행률을 사용하도록 설정했으며 지정된 I/O 요청은 메모리 부족 상황에 대해 예약되어 있습니다.
  • 드라이버가 WdfPdoInitAllowForwardingRequestToParent를 호출하지 않았습니다.
STATUS_WDF_BUSY
지정된 I/O 큐가 새 요청을 수락하지 않습니다.
 

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

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

설명

드라이버가 WdfRequestForwardToParentDeviceIoQueue를 호출하려면 먼저 WdfPdoInitAllowForwardingRequestToParent를 호출해야 합니다.

드라이버는 부모 디바이스와 자식 디바이스 모두 에 대해 동일한 메서드를 사용하여 데이터 버퍼 (버퍼링, 직접 또는 둘 다)에 액세스해야 합니다.

드라이버가 I/O 요청을 다시 큐에 넣기 위해 WdfRequestForwardToParentDeviceIoQueue 를 호출하는 경우 드라이버는 요청 개체를 타이머 개체 또는 작업 항목 개체와 같은 다른 프레임워크 개체의 부모로 사용하면 안 됩니다.

드라이버가 WdfDeviceInitSetRequestAttributes를 호출하여 부모 디바이스의 요청 개체에 대한 컨텍스트 공간을 지정한 경우 프레임워크는 이 컨텍스트 공간을 추가하여 드라이버가 자식 디바이스의 큐에서 수신하는 개체를 요청하지 않습니다. 드라이버는 WdfRequestForwardToParentDeviceIoQueue를 호출하기 전에 WdfObjectAllocateContext를 호출하여 요청 개체에 컨텍스트 공간을 추가할 수 있습니다. 반면에 드라이버가 자식 디바이스의 요청 개체에 대해 WdfDeviceInitSetRequestAttributes를 호출하고 부모 디바이스의 요청 개체가 자식 디바이스의 컨텍스트 공간과 같거나 작은 컨텍스트 공간을 사용하는 경우 드라이버는 WdfObjectAllocateContext를 호출하지 않고 요청 개체의 컨텍스트 공간을 사용할 수 있습니다.

현재 드라이버는 다시 큐에 추가된 모든 I/O 요청에 대해 send and forget 옵션을 사용해야 합니다. 따라서 프레임워크가 다시 큐에 추가된 요청 개체를 삭제할 때까지는 원래 요청 개체를 받은 자식 디바이스가 이미 제거되었을 수 있습니다. 따라서 EvtCleanupCallback 또는 EvtDestroyCallback 함수가 실행되기 전에 리소스가 제거될 수 있으므로 재큐에 추가된 요청 개체의 EvtCleanupCallback 또는 EvtDestroyCallback 함수를 사용하여 자식 디바이스 리소스에 액세스하면 안 됩니다.

WdfRequestForwardToParentDeviceIoQueue에 대한 자세한 내용은 I/O 요청 다시 큐에 넣기를 참조하세요.

예제

다음 코드 예제에서는 먼저 I/O 요청을 받은 디바이스의 부모 디바이스를 확인한 다음 I/O 요청을 부모 디바이스의 기본 I/O 큐에 다시 큐에 추가합니다.

WDFDEVICE device, parentDevice;
WDF_REQUEST_FORWARD_OPTIONS forwardOptions;
NTSTATUS status;

device = WdfIoQueueGetDevice(WdfRequestGetIoQueue(Request));
parentDevice = WdfPdoGetParent(device);

WDF_REQUEST_FORWARD_OPTIONS_INIT(&forwardOptions);
status = WdfRequestForwardToParentDeviceIoQueue(
             Request,
             WdfDeviceGetDefaultQueue(parentDevice),
             &forwardOptions
             );
if (!NT_SUCCESS(status)) {
    WdfRequestComplete(
                       Request,
                       status
                       );
  }

요구 사항

요구 사항
대상 플랫폼 유니버설
최소 KMDF 버전 1.9
머리글 wdfrequest.h(Wdf.h 포함)
라이브러리 Wdf01000.sys(프레임워크 라이브러리 버전 관리 참조)
IRQL <=DISPATCH_LEVEL
DDI 규정 준수 규칙 DriverCreate(kmdf)

추가 정보

WdfPdoInitAllowForwardingRequestToParent