WdfRequestStopAcknowledge 함수(wdfrequest.h)

[KMDF 및 UMDF에 적용]

WdfRequestStopAcknowledge 메서드는 드라이버가 지정된 I/O 요청 처리를 중지했음을 프레임워크에 알릴 수 있습니다.

구문

void WdfRequestStopAcknowledge(
  [in] WDFREQUEST Request,
  [in] BOOLEAN    Requeue
);

매개 변수

[in] Request

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

[in] Requeue

TRUE이면 프레임워크가 요청을 큐에 다시 큐에 넣도록 하는 부울 값으로, 프레임워크가 다시 드라이버에 배달합니다. FALSE인 경우 프레임워크는 요청을 다시 큐에 추가하지 않습니다. 자세한 내용은 아래 설명 부분을 참조하십시오.

반환 값

없음

설명

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

드라이버가 I/O 큐에 대해 EvtIoStop 콜백 함수를 등록하는 경우 프레임워크는 큐의 기본 디바이스가 작동(D0) 상태를 떠날 때 호출합니다. 프레임워크는 드라이버가 소유한 요청 및 I/O 대상으로 전달한 요청을 포함하여 드라이버가 완료되지 않은 모든 I/O 요청에 대해 EvtIoStop 콜백 함수를 호출합니다. 드라이버는 다음 중 하나를 수행하여 각 요청의 처리를 완료, 취소 또는 연기해야 합니다.

  • 드라이버가 요청을 소유하는 경우 WdfRequestComplete 를 호출하여 요청을 완료하거나 취소할 수 있습니다.
  • 드라이버가 I/O 대상에 요청을 전달한 경우 WdfRequestCancelSentRequest 를 호출하여 요청을 취소할 수 있습니다.
  • 드라이버가 요청 처리를 연기하면 WdfRequestStopAcknowledge를 호출해야 합니다.
드라이버 가 WdfRequestStopAcknowledge를 호출하는 경우 EvtIoStop 콜백 함수 내에서 이 메서드를 호출해야 합니다.

프레임워크는 드라이버가 EvtIoStop 콜백 함수가 수신하는 모든 요청을 완료, 취소 또는 연기할 때까지 디바이스가 작동(D0) 상태를 벗어나도록 허용하지 않습니다. 이 동작이 실행되지 않으면 시스템이 최대 절전 모드 상태 또는 다른 낮은 시스템 전원 상태로 전환되지 않도록 방지할 수 있습니다.

드라이버의 EvtIoStop 콜백 함수가 WdfRequestStopAcknowledge를 호출하는 경우 Requeue 매개 변수를 TRUE 또는 FALSE로 설정할 수 있습니다.

  • RequeueTRUE로 설정하면 프레임워크가 요청을 해당 I/O 큐에 다시 배치합니다.

    기본 디바이스가 작동(D0) 상태로 돌아오면 프레임워크는 드라이버에 요청을 다시 배달합니다.

  • 다시 큐에 넣기를 FALSE로 설정하면 프레임워크가 요청을 다시 큐에 추가하지 않습니다. 드라이버가 요청을 소유 하는 경우 소유권은 드라이버와 함께 유지됩니다. 드라이버가 요청을 전달한 경우 드라이버는 요청이 완료되면 처리할 책임이 있습니다. 드라이버는 하드웨어 액세스가 필요한 I/O 처리를 중지해야 합니다.

    기본 디바이스가 작동(D0) 상태로 돌아오면 프레임워크는 드라이버가 요청을 계속 처리할 수 있도록 드라이버의 EvtIoResume 콜백 함수를 호출합니다.

드라이버가 이전에 WdfRequestMarkCancelable 또는 WdfRequestMarkCancelableEx를 호출한 경우 RequeueTRUE로 설정된 WdfRequestStopAcknowledge를 호출하기 전에 WdfRequestUnmarkCancelable을 호출해야 합니다.

WdfRequestStopAcknowledge를 호출하기 전에 드라이버의 EvtIoStop 콜백 함수는 디바이스가 저전력 상태로 들어가려고 하므로 기본 디바이스에 액세스해야 하는 I/O 요청의 모든 처리를 중지해야 합니다.

WdfRequestStopAcknowledge 메서드에 대한 자세한 내용은 Power-Managed I/O 큐 사용을 참조하세요.

예제

드라이버가 REqueueTRUE로 설정된 WdfRequestStopAcknowledge를 호출하는 경우 이전에 WdfRequestUnmarkCancelable을 호출해야 합니다.

다음 코드 예제는 수신된 요청을 취소할 수 있는지 확인하고, 요청이 취소 가능한 경우 WdfRequestUnmarkCancelable을 호출하는 EvtIoStop 콜백 함수입니다. WdfRequestUnmarkCancelable이 STATUS_CANCELLED 반환하는 경우 드라이버의 EvtRequestCancel 콜백 함수가 요청을 처리하므로 이 예제는 를 반환합니다. 그렇지 않으면 이 예제에서는 WdfRequestStopAcknowledge 를 호출하고 기본 디바이스가 작동(D0) 상태로 돌아올 때 프레임워크가 요청을 다시 큐에 넣기 위해 TRUE 를 지정합니다.

VOID
MyEvtIoStop(
    IN WDFQUEUE  Queue,
    IN WDFREQUEST  Request,
    IN ULONG  ActionFlags
    )
{
    NTSTATUS status;

    // TODO: Take steps here to suspend and, if necessary, roll back any processing that has already occurred on this request

    if (ActionFlags & WdfRequestStopRequestCancelable) {
        status = WdfRequestUnmarkCancelable(Request);
        if (status == STATUS_CANCELLED) {
            return;
        }
    }

    // Inform framework that driver is postponing processing, cause framework to redeliver request when device returns to D0

    WdfRequestStopAcknowledge(Request, TRUE);
}

일반적으로 드라이버가 REqueueFALSE로 설정된 WdfRequestStopAcknowledge를 호출하는 경우 요청을 취소할 수 있습니다.

다음 코드 예제는 WdfRequestStopAcknowledge를 호출하고 FALSE를 지정하는 EvtIoStop 콜백 함수로, 프레임워크는 드라이버가 요청 처리를 다시 시작하는 드라이버의 EvtIoResume 콜백 함수를 호출합니다.

요청이 다시 배달되고 처음부터 처리를 다시 시작하는 대신 특정 요청의 처리를 중지하고 나중에 계속하는 것이 허용되는 경우 이와 같은 코드를 사용할 수 있습니다.

VOID
MyEvtIoStop(
    IN WDFQUEUE  Queue,
    IN WDFREQUEST  Request,
    IN ULONG  ActionFlags
    )
{

    //TODO: Take steps here to suspend processing of the request so it can be resumed when power returns
	 
    // Acknowledge the stop, but leave the request under driver's ownership.
    // Provide a corresponding EvtIoResume handler to resume processing when power returns

    WdfRequestStopAcknowledge(Request, FALSE);
}

요구 사항

요구 사항
대상 플랫폼 유니버설
최소 KMDF 버전 1.0
최소 UMDF 버전 2.0
머리글 wdfrequest.h(Wdf.h 포함)
라이브러리 Wdf01000.sys(KMDF); WUDFx02000.dll(UMDF)
IRQL <=DISPATCH_LEVEL
DDI 규정 준수 규칙 DeferredRequestCompleted(kmdf), DriverCreate(kmdf), EvtIoStopCancel(kmdf), EvtIoStopCompleteOrStopAck(kmdf), EvtIoStopResume(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), RequestCompleted(kmdf), RequestCompletedLocal(kmdf), StopAckWithinEvtIoStop(kmdf)

추가 정보

EvtIoStop

EvtRequestCancel

WdfRequestComplete