デバイス ドライバを開発する?しない?
なおきお~です。皆様、いかがお過ごしでしょうか?ご無事でしょうか?
この度の東北地方太平洋沖地震により、亡くなられた方々のご冥福をお祈り申し上げますとともに、被災された皆様と、そのご家族様に対しまして、心よりお見舞い申し上げます。
また、このブログを閲覧していただいている皆様が、ご無事であることも、お祈り申し上げております。
さて、大震災以降、安全性というものの重みを思い知らされている日々ですが、デバイス ドライバを開発する際も、ささやかなものですが、安全性や安定性を意識しなければなりません。
その手始めとして、どのようなモジュールを開発するか?と決める時です。
Windows OS に含まれているモジュールを利用すると、既に動作の実績もあり、安定しています。また、脆弱性が見つかれば、マイクロソフトが解決してくれるので安全です。また、開発の工数も短縮できると、いい事づくめです。
ただ、Windows OS に含まれているモジュールの利用に固執してしまって、失敗してしまうこともあります。その一例として、USB と Serial Port (RS-232C) の変換のデバイス ドライバがあります。
Windows OS には、usbser.sys というモジュール (デバイス ドライバ) が、含まれています。名前から想像すると、これが、USB と Serial Port (RS-232C) の変換を行うデバイス ドライバかな?と思ってしまいます。
名前で誤解してしまうのですが、以下の USB の FAQ の "表 2: Windows での USB DWG Class のサポート" に、ある通り、usbser.sys は、実は、CDC (Communications Device Class) に準拠したモデム クラスのデバイス ドライバなのです。
USB に関する FAQ: 初級レベル
https://msdn.microsoft.com/ja-jp/windows/hardware/gg487327.aspx
モデム クラス (CDC) |
0x02 |
Usbser.sys |
Windows Server 2008Windows VistaWindows Server 2003Windows XPWindows 2000 |
Serial Port (RS-232C) は、Ports Class として INF ファイルを記載しないといけませんが、usbser.sys は、Modem Class が前提であるため、Modem Class として、インストールする INF ファイルの記述は、以下のサンプルを参照すれば可能です。
使用する方法またはユニバーサル シリアル バス (USB) モデムの.inf ファイルから Usbser.sys ドライバーを参照する方法
https://support.microsoft.com/kb/837637/ja
Referencing Usbser.sys for USB Modems
https://msdn.microsoft.com/en-us/library/ff542605(v=vs.85).aspx
Ports Class としてインストールする INF ファイルの記述は、難しいと思いますが、少々、無理な INF ファイルの記述を行えば、Ports Class としてインストールできると聞いたことがあります。
しかしながら、そのような異なる Class に対して、インストールを行うと、大前提が異なるため、ちゃんと動くのか、検証していないので、安全性や安定性が、損なわれてしまいます。構造上は、似ているので、ちょっとお試しで、usbser.sys を Ports Class で、使うのならば、よいかもしれませんが、ちゃんとした製品とするには、あまりよい構成ではないと思います。
では、USB と Serial Port (RS-232C) の変換のデバイス ドライバは、どういう構成にすればいいかとなると、少なくとも、1 つ以上のデバイス ドライバを開発する必要があります。
開発するドライバは、デバイスとのやり取りは、WDK の USB の Bulk 転送のサンプルをベースに、開発されているデバイス用に修正し、IRP_MJ_DEVICE_CONTROL のような上位スタックからの呼び出しは、WDK の Serial ドライバを参考に、USB の Bulk 転送のサンプルにマージする構成が、無難だと思います。また、INF ファイルには、Upper Filter に serenum.sys をアタッチする構成がよいと思います。
serenum.sys は、Windows OS に含まれているので、実績もあります。また、WDK にサンプルも公開しています。USB の Bulk 転送も、Serial ドライバも WDK にサンプルがあるので、うまくサンプル コードを流用すれば、比較的 開発の工数が少なくすることも可能ですので、usbser.sys を Ports Class として、無理に使用するより、よいと思います。
このように Windows OS に含まれているモジュールの利用に固執してしまって、安全性や安定性を損なわないように気を付けてください。
なお、私たちのブログは、掲載した情報に対するご意見や、今後の取り上げてほしい情報のご要望を承るために、フィードバックのメールを受け付けております。
ご意見などがございましたら、ぜひ、フィードバックいただければ幸いです。
ただ、フィードバックのメールに、トラブルシューティングや技術的なご質問を頂戴しても返信できないことがあることをご注意ください。
トラブルシューティングや技術的なご質問は、私たちのサポート サービスをご利用いただくか、フォーラムの情報交換をされて、ご解決ください。
サポート サービス
https://www.microsoft.com/japan/services/support/default.mspx
Windows デバイスドライバー開発
https://social.msdn.microsoft.com/Forums/ja-JP/windowsdevicedriverja/threads
それでは、また。