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을 호출할 수 있습니다. 그렇지 않으면 WdfIoTargetStop 이 IRQL = PASSIVE_LEVEL 호출됩니다.

예제

다음 코드 예제에서는 드라이버가 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

WdfIoTargetCreate

WdfIoTargetStart

WdfUsbTargetPipeConfigContinuousReader

WdfUsbTargetPipeResetSynchronously