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_OPTION_IGNORE_TARGET_STATE フラグまたは要求のWDF_REQUEST_SEND_OPTIONS構造体のWDF_REQUEST_SEND_OPTION_SEND_AND_FORGET フラグを使用して、ターゲットに送信された I/O 要求を取り消したり待機したりしません。

ドライバーは 、WdfIoTargetStartWdfIoTargetStop を同期的に呼び出す必要があります。 ドライバーは、これらの関数のいずれかを呼び出した後、最初の呼び出しが返される前に、どちらの関数も呼び出してはなりません。

ドライバーは 、WdfIoTargetStart を 呼び出さずに、1 つのスレッドから WdfIoTargetStop を複数回呼び出すことができます。 たとえば、ドライバーで次の操作を行う場合があります。

  1. WdfIoTargetStop を呼び出し、WdfIoTargetLeaveSentIoPendingAction 値を指定します。
  2. ターゲットが I/O 要求の処理を再開する必要があるかどうかを判断します。
  3. ターゲットを再開する必要がある場合は、 WdfIoTargetStart を呼び出します。 それ以外の場合は、 WdfIoTargetCancelSentIoAction 値を使用して WdfIoTargetStop をもう一度呼び出します。
注:WdfIoTargetStop はスレッド セーフではありません。 異なるスレッドから WdfIoTargetStop を 同時に呼び出しても安全ではありません。
 
I/O ターゲットの詳細については、「 I/O ターゲットの使用」を参照してください

ドライバーがパイプの WdfUsbTargetPipeConfigContinuousReader を呼び出した場合は、IRQL = PASSIVE_LEVELで WdfIoTargetStop を呼び出す必要があります。

ドライバーが WdfUsbTargetPipeConfigContinuousReader を呼び出していない場合、WdfIoTargetStopAction パラメーターが WdfIoTargetLeaveSentIoPending の場合、WdfIoTargetStop は IRQL <= DISPATCH_LEVELで呼び出すことができます。 それ以外の場合、 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
Header wdfiotarget.h (Wdf.h を含む)
Library 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