다음을 통해 공유


WdfIoTargetStop 함수(wdfiotarget.h)

[KMDF 및 UMDF에 적용]

WdfIoTargetStop 메서드는 큐에 대기된 요청을 로컬 또는 원격 I/O 대상으로 보내는 것을 중지합니다.

구문

void WdfIoTargetStop(
  [in] WDFIOTARGET                  IoTarget,
  [in] WDF_IO_TARGET_SENT_IO_ACTION Action
);

매개 변수

[in] IoTarget

WdfDeviceGetIoTarget 또는 WdfIoTargetCreate에 대한 이전 호출 또는 특수 I/O 대상에서 제공하는 메서드에서 가져온 로컬 또는 원격 I/O 대상 개체에 대한 핸들입니다.

[in] Action

대상에서 요청을 완료하지 않은 경우 드라이버가 I/O 대상으로 보낸 I/O 요청을 프레임워크에서 처리하는 방법을 지정하는 WDF_IO_TARGET_SENT_IO_ACTION 형식화된 값입니다.

반환 값

없음

설명

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

드라이버가 복구 가능한 디바이스 오류를 검색할 수 있는 경우 드라이버가 WdfIoTargetStop 을 호출하여 요청 전송을 일시적으로 중지한 다음, 나중에 WdfIoTargetStart 를 호출하여 요청 보내기를 다시 시작하도록 할 수 있습니다.

중지된 동안 I/O 대상은 계속해서 새 요청을 수락하지만 대기 중인 요청을 적절한 드라이버에 전달하지 않습니다.

I/O 대상의 가능한 상태에 대한 자세한 내용은 일반 I/O 대상의 상태 제어를 참조하세요.

드라이버가 WdfUsbTargetPipeConfigContinuousReader 를 호출하여 USB 파이프에 대한 연속 판독기를 구성하는 경우 드라이버의 EvtDeviceD0Exit 콜백 함수는 WdfIoTargetStop을 호출하여 판독기를 중지해야 합니다.

드라이버가 WdfIoTargetStop을 호출한 경우에도 요청의 WDF_REQUEST_SEND_OPTIONS 구조에서 WDF_REQUEST_OPTION_IGNORE_TARGET_STATE 플래그를 설정하여 대상에 요청을 보낼 수 있습니다. 드라이버가 이 플래그를 설정하는 경우 드라이버는 드라이버가 WdfIoTargetStop을 호출한 후 USB 파이프 재설정 요청(WdfUsbTargetPipeResetSynchronously 참조)과 같은 요청을 디바이스에 보낼 수 있습니다.

드라이버가 WdfIoTargetStop을 호출하는 경우 프레임워크는 요청의 WDF_REQUEST_SEND_OPTIONS구조에서 WDF_REQUEST_SEND_OPTION_IGNORE_TARGET_STATE 플래그 또는 WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET 플래그를 사용하여 이전에 대상에 전송된 I/O 요청을 취소하거나 기다리지 않습니다.

드라이버는 WdfIoTargetStartWdfIoTargetStop을 동기적으로 호출해야 합니다. 드라이버가 이러한 함수 중 하나를 호출한 후에는 첫 번째 호출이 반환되기 전에 두 함수 중 하나를 호출하지 않아야 합니다.

드라이버는 WdfIoTargetStart을 호출하지 않고 단일 스레드에서 WdfIoTargetStop을 여러 번 호출할 수 있습니다. 예를 들어 드라이버는 다음을 수행할 수 있습니다.

  1. WdfIoTargetStop을 호출하고 WdfIoTargetLeaveSentIoPending작업 값을 지정합니다.
  2. 대상에서 I/O 요청 처리를 다시 시작해야 하는지 여부를 결정합니다.
  3. 대상이 다시 시작되면 WdfIoTargetStart을 호출합니다. 그렇지 않으면 WdfIoTargetCancelSentIo작업 값을 사용하여 WdfIoTargetStop을 다시 호출합니다.
참고WdfIoTargetStop 은 스레드로부터 안전하지 않습니다. 다른 스레드에서 WdfIoTargetStop을 동시에 호출하는 것은 안전하지 않습니다.
 
I/O 대상에 대한 자세한 내용은 I/O 대상 사용을 참조하세요.

드라이버가 파이프에 대해 WdfUsbTargetPipeConfigContinuousReader 를 호출한 경우 WdfIoTargetStop 을 IRQL = PASSIVE_LEVEL 호출해야 합니다.

드라이버가 WdfUsbTargetPipeConfigContinuousReader를 호출하지 않았고 WdfIoTargetStopAction 매개 변수가 WdfIoTargetLeaveSentIoPending인 경우 IRQL <= DISPATCH_LEVEL WdfIoTargetStop을 호출할 수 있습니다. 그렇지 않으면 IRQL = PASSIVE_LEVEL WdfIoTargetStop 이 호출됩니다.

예제

다음 코드 예제에서는 드라이버가 USB 파이프에 연속 판독기를 사용하는 경우 EvtDeviceD0Exit 콜백 함수가 WdfIoTargetStop을 호출하는 방법을 보여 줍니다.

NTSTATUS
MyEvtDeviceD0Exit(
    IN  WDFDEVICE Device,
    IN  WDF_POWER_DEVICE_STATE TargetState
)
{
    PDEVICE_CONTEXT  pDeviceContext;
    pDeviceContext = GetMyDeviceContext(Device);

    WdfIoTargetStop(
                    WdfUsbTargetPipeGetIoTarget(pDeviceContext->InterruptPipe),
                    WdfIoTargetCancelSentIo
                    );

    return STATUS_SUCCESS;
}

요구 사항

요구 사항
대상 플랫폼 유니버설
최소 KMDF 버전 1.0
최소 UMDF 버전 2.0
머리글 wdfiotarget.h(Wdf.h 포함)
라이브러리 Wdf01000.sys(KMDF); WUDFx02000.dll(UMDF)
IRQL 설명 섹션을 참조하십시오.
DDI 규정 준수 규칙 DriverCreate(kmdf), FailD0EntryIoTargetState(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

추가 정보

EvtDeviceD0Exit

WDF_REQUEST_SEND_OPTIONS

WdfDeviceGetIoTarget

WdfIoTarget만들기

WdfIoTargetStart

WdfUsbTargetPipeConfigContinuousReader

WdfUsbTargetPipeResetSynchronously