I/O 要求の同期送信

ドライバーで I/O 要求を I/O ターゲットに同期的に送信するための I/O ターゲット オブジェクト メソッドを、次の表に示します。これらのメソッドの使用方法の詳細については、メソッドのリファレンス ページを参照してください。

メソッド 目的

WdfIoTargetSendReadSynchronously

読み取り要求を送信します。

WdfIoTargetSendWriteSynchronously

書き込み要求を送信します。

WdfIoTargetSendIoctlSynchronously

デバイス制御要求を送信します。

WdfIoTargetSendInternalIoctlSynchronously

内部デバイス制御要求を送信します。

WdfIoTargetSendInternalIoctlOthersSynchronously

非標準の内部デバイス制御要求を送信します。

 

WdfRequestSend を呼び出して要求を同期的に送信することもできますが、「I/O 要求の非同期送信」に記載された規則に従って、先に要求をフォーマットする必要があります。

I/O 要求の I/O ターゲットへの同期送信のプログラミングは、I/O 要求の非同期送信に比べると簡単です。ただし、次のガイドラインに従って、同期 I/O 送信がドライバーに適しているかどうかを判断する必要があります。

  • ドライバーで多数の I/O 要求を送信することがなく、ドライバーが各 I/O 要求の完了を待機することによるシステムまたはデバイスのパフォーマンス低下がない場合は、同期 I/O を使用できます。

  • ドライバーが短時間に多数の I/O 要求を処理する必要がある場合は、通常、ドライバーが次の要求を送信する前に、各要求の完了を待機することはできません。各要求の完了を待機していると、データの損失や、デバイス (および多くの場合システム全体) のパフォーマンス低下につながる可能性があります。このような場合は、非同期 I/O の方が適している可能性があります。

  • 同期 I/O は、他の操作を同時に行うことなく開始および終了させる必要のある操作を処理する場合に便利です。たとえば、USB パイプのリセット、デバイスのレジスタの読み取りなどの操作がこれに該当します。

  • 多くの場合、ドライバーでは、I/O 要求を同期的に送信するオブジェクト メソッドを呼び出すときに、タイムアウト値を指定する必要があります。ドライバーでタイムアウト値が指定されていない場合、デバイスまたは下位ドライバーが応答しないと、ドライバーが停止する可能性があります。その結果、アプリケーションがユーザーの操作に応答しなくなります。さらに、ドライバーが作業項目などのシステム リソースを解放しない場合、他のドライバーがこれらのシステム リソースを取得できなくなります。

  • スタック内の上位ドライバーおよび下位ドライバーのいずれかで、操作を同期的に進める必要がある場合は、ドライバーで同期 I/O を使用する必要があります。このため、ドライバー スタックに含まれる可能性のある他のドライバーの要件についても知っておく必要があります。