none
USBドライバのポーリングに関して RRS feed

  • 質問

  • お世話になります。USBドライバ開発初心者です。

    USBドライバでのポーリングに関する質問です。

    USBドライバを開発していますが、その中でUSBデバイスからのデータを
    インタラプト転送・バルク転送されるデータをポーリング受信するプログラムを
    作成しています。

    Irpにイベントを設定し、IoCallDriver呼び出し後、KeWaitForSingleObjectにて
    イベント待ちをしていますが、USBデバイスからデータが来ていない場合、
    無限に待ってしまいますが、正しい動作なのでしょうか?
    (試しに、完了ルーチンを登録してみましたが、呼び出されませんでした。)

    また、KeWaitForSingleObjectにタイムアウト値を設定すると、データが来ていない場合、
    タイムアウトで戻ってきますが、2回目に再度ポーリング受信をするとIoCallDriver呼び出しで
    ブルースクリーンになってしまいます。
    タイムアウト発生時に何か処理を行う必要があるのでしょうか?

    初歩的な質問で申し訳御座いませんが、よろしくお願い致します。
    • 移動 Mike Wang (MSCS) 2012年10月2日 12:33 (移動元:Windows デバイスドライバー開発)
    2010年3月6日 4:11

回答

  • peiriさん、こんにちは。

    回答を頂きまして、誠にありがとう御座います。
    また、ご返事が遅れてしまい、申し訳御座いませんでした。

    ご回答に有りました、公開情報を元に、実装すると問題なく動作いたしました。

    どうもありがとう御座いました。

    • 回答としてマーク Daikun 2010年3月14日 2:28
    2010年3月14日 2:28

すべての返信

  • Daikun さん、こんにちは。

    > USBデバイスからデータが来ていない場合、無限に待ってしまいますが、正しい動作なのでしょうか?

    KeWaitForSingleObject で、第 5 引数の timeout に NULL を指定されていれば、同期オブジェクト(イベント、セマフォ、ミューテックス etc) がシグナル状態となるまで待ち状態となります。このため、正しい動作になると思われます。

      KeWaitForSingleObject
      http://msdn.microsoft.com/en-us/library/ms801959.aspx
      If the caller supplies a NULL pointer, the routine waits indefinitely until the dispatcher object is set to the signaled state.

    > タイムアウト発生時に何か処理を行う必要があるのでしょうか?

    タイムアウト対象 IRP に対して、キャンセル処理を行いリソースを解放する必要があると思われます。実装方法については下記公開情報に記載されています。
     
      IRP のさまざまな処理方法 (パート 2/2)
      http://support.microsoft.com/kb/326315/ja
      シナリオ 7 : 同期デバイス制御 (IOCTL) 要求を送信し、一定の期間内に完了しなければキャンセルする

    参考になりましたら幸いです。

    2010年3月8日 2:52
  • peiriさん、こんにちは。

    回答を頂きまして、誠にありがとう御座います。
    また、ご返事が遅れてしまい、申し訳御座いませんでした。

    ご回答に有りました、公開情報を元に、実装すると問題なく動作いたしました。

    どうもありがとう御座いました。

    • 回答としてマーク Daikun 2010年3月14日 2:28
    2010年3月14日 2:28