知識マップ: WindowsアプリでUSB機器を扱う方法 ── 仮想COM・HID・WinUSB・専用SDKの選び方
記事「WindowsアプリでUSB機器を扱う方法 ── 仮想COM・HID・WinUSB・専用SDKの選び方」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
この記事は、WindowsアプリからUSB機器を扱う4つの接続方式(仮想COMポート・HID・WinUSB・ベンダー提供SDK)を、機器がデバイスマネージャーでどのUSBデバイスクラスとして見えるかを起点に選ぶ考え方を扱う。標準クラスドライバーで足りなければWinUSB、複数アプリの同時アクセスが必要ならUMDFドライバー、それでも無理ならKMDFドライバーという順で検討するのが公式の選定順序であり、複合デバイスやHIDの排他コレクションなど機器側の制約が識別・実装方法を左右する。どの方式でも機器の一意識別とPnP通知による抜き差し追従を自分で設計する必要があり、機器切断によるハンドル無効化への対処が欠かせない。ドライバーを配布する場合は、自作の.sysがなくてもカタログ署名が必要で、カーネルモードドライバーを含むならさらにMicrosoftによる署名とEVコード署名証明書が要る。
flowchart LR
accTitle: WindowsでのUSB機器接続方式の知識マップ
accDescr: USB接続方式の選定がデバイスマネージャー上のUSBデバイスクラスの確認を起点とし、仮想COMポート・HID・WinUSB・ベンダーSDKの4方式それぞれが機器の一意識別・PnP通知・署名要件とどう結び付くかを示す図。
usb_connectivity_method_selection["USB接続方式の選定"]
usb_device_class["USBデバイスクラス"]
winusb["WinUSB方式"]
umdf_driver["UMDFドライバー"]
kmdf_driver["KMDFドライバー"]
composite_usb_device["複合デバイス"]
virtual_com_port["仮想COMポート方式"]
hid["HID方式"]
winusb_os_descriptor["Microsoft OS記述子(WinUSBの互換ID)"]
concurrent_multi_app_access["複数アプリからの同時アクセス"]
usb_device_unique_identification["機器の一意識別"]
exclusive_hid_collection["排他HIDコレクション"]
overlapped_io["Overlapped I/O"]
getoverlappedresult["GetOverlappedResult"]
cancelioex["CancelIoEx"]
usb_pnp_notification["USB機器のPnP通知"]
usb_handle_invalidation["機器切断によるハンドルの無効化"]
windows_forms["Windows Forms"]
usb_selective_suspend["USBセレクティブサスペンド"]
driver_catalog_signing["ドライバーパッケージのカタログ署名"]
kernel_driver_signing["カーネルモードドライバー署名(Windows 10 1607以降)"]
ev_certificate["EVコード署名証明書"]
vendor_usb_sdk["ベンダー提供SDK・専用ドライバー方式"]
bitness_match_requirement["bitness一致要件"]
usb_connectivity_method_selection -->|"前提とする"| usb_device_class
winusb -->|"より先に行うべき"| umdf_driver
umdf_driver -->|"より先に行うべき"| kmdf_driver
composite_usb_device -->|"利用する"| usb_device_class
virtual_com_port -->|"利用する"| usb_device_class
hid -->|"利用する"| usb_device_class
winusb -.->|"利用する"| usb_device_class
winusb -.->|"前提とする"| winusb_os_descriptor
winusb -->|"両立しない"| concurrent_multi_app_access
umdf_driver -->|"推奨される対応"| concurrent_multi_app_access
virtual_com_port -.->|"前提とする"| usb_device_unique_identification
composite_usb_device -.->|"前提とする"| usb_device_unique_identification
hid -.->|"前提とする"| usb_device_unique_identification
winusb -.->|"前提とする"| usb_device_unique_identification
hid -->|"両立しない"| exclusive_hid_collection
winusb -.->|"利用する"| overlapped_io
winusb -.->|"利用する"| getoverlappedresult
winusb -->|"利用する"| cancelioex
usb_pnp_notification -.->|"軽減する"| usb_handle_invalidation
windows_forms -.->|"利用する"| usb_pnp_notification
usb_selective_suspend -.->|"で構成できる"| winusb_os_descriptor
winusb -.->|"前提とする"| driver_catalog_signing
kmdf_driver -->|"前提とする"| kernel_driver_signing
kernel_driver_signing -->|"前提とする"| ev_certificate
vendor_usb_sdk -.->|"利用する"| usb_device_class
vendor_usb_sdk -.->|"前提とする"| bitness_match_requirement
virtual_com_port -.->|"前提とする"| usb_pnp_notification
概念間の関係(全27件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- USB接続方式の選定はUSBデバイスクラスを前提とします。
- WinUSB方式はUMDFドライバーより先に行うべきです。
- UMDFドライバーはKMDFドライバーより先に行うべきです。
- 複合デバイスはUSBデバイスクラスを利用します。
- 仮想COMポート方式はUSBデバイスクラスを利用します。
- HID方式はUSBデバイスクラスを利用します。
- WinUSB方式はUSBデバイスクラスを利用します。
- WinUSB方式はMicrosoft OS記述子(WinUSBの互換ID)を前提とします。
- WinUSB方式は複数アプリからの同時アクセスと両立しません。
- UMDFドライバーは複数アプリからの同時アクセスに対する本記事の推奨です。
- 仮想COMポート方式は機器の一意識別を前提とします。
- 複合デバイスは機器の一意識別を前提とします。
- HID方式は機器の一意識別を前提とします。
- WinUSB方式は機器の一意識別を前提とします。
- HID方式は排他HIDコレクションと両立しません。
- WinUSB方式はOverlapped I/Oを利用します。
- WinUSB方式はGetOverlappedResultを利用します。
- WinUSB方式はCancelIoExを利用します。
- USB機器のPnP通知は機器切断によるハンドルの無効化を軽減します。
- Windows FormsはUSB機器のPnP通知を利用します。
- USBセレクティブサスペンドはMicrosoft OS記述子(WinUSBの互換ID)で構成できます。
- WinUSB方式はドライバーパッケージのカタログ署名を前提とします。
- KMDFドライバーはカーネルモードドライバー署名(Windows 10 1607以降)を前提とします。
- カーネルモードドライバー署名(Windows 10 1607以降)はEVコード署名証明書を前提とします。
- ベンダー提供SDK・専用ドライバー方式はUSBデバイスクラスを利用します。
- ベンダー提供SDK・専用ドライバー方式はbitness一致要件を前提とします。
- 仮想COMポート方式はUSB機器のPnP通知を前提とします。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。