トップ回答者
USBドライバのポーリングに関して

質問
-
お世話になります。USBドライバ開発初心者です。
USBドライバでのポーリングに関する質問です。
USBドライバを開発していますが、その中でUSBデバイスからのデータを
インタラプト転送・バルク転送されるデータをポーリング受信するプログラムを
作成しています。
Irpにイベントを設定し、IoCallDriver呼び出し後、KeWaitForSingleObjectにて
イベント待ちをしていますが、USBデバイスからデータが来ていない場合、
無限に待ってしまいますが、正しい動作なのでしょうか?
(試しに、完了ルーチンを登録してみましたが、呼び出されませんでした。)
また、KeWaitForSingleObjectにタイムアウト値を設定すると、データが来ていない場合、
タイムアウトで戻ってきますが、2回目に再度ポーリング受信をするとIoCallDriver呼び出しで
ブルースクリーンになってしまいます。
タイムアウト発生時に何か処理を行う必要があるのでしょうか?
初歩的な質問で申し訳御座いませんが、よろしくお願い致します。- 移動 Mike Wang (MSCS) 2012年10月2日 12:33 (移動元:Windows デバイスドライバー開発)
回答
すべての返信
-
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) 要求を送信し、一定の期間内に完了しなければキャンセルする
参考になりましたら幸いです。