もくじ
https://tera1707.com/entry/2022/02/06/144447
2024/3/7時点のドライバのイメージ図
全然自信ないが、こういうイメージをしてる。
下にメモした用語や知識たちをまとめると、こういう図になるのかな、と今思っている。
デバイスマネージャーについて
クラス別の画面
「クラス」とは「種類」みたいなもの。「キーボード」とか。
接続別の画面
接続の親子関係が見れる画面。
親のドライバを無効にすると、その下の子のドライバも全部無効になる、みたいな動きをするっぽい。
コンテナ別の画面
まだよくわからない。。。
ドライバー別
まだよくわからない。。。
用語
デバマネ画面の詳細の、プロパティのデバイスインスタンスパスの中の...
デバイスインスタンスパス
MSのドキュメント中では「デバイスインスタンスID」と呼んでいる場合もあるっぽい。
https://learn.microsoft.com/en-us/windows-hardware/drivers/install/device-instance-ids
デバイスインスタンスパスがどういう文字列になるかは、デバイスの種類ごとに決まっているっぽい。
USBデバイス
https://learn.microsoft.com/en-us/windows-hardware/drivers/install/standard-usb-identifiers
PCIデバイス
https://learn.microsoft.com/en-us/windows-hardware/drivers/install/identifiers-for-pci-devices
High Definition Audio(HDAUDIO)デバイス
https://learn.microsoft.com/en-us/windows-hardware/drivers/install/identifiers-for-hdaudio-devices
→Realtekのスピーカーとかはこれ↓だった。
HDAUDIO\FUNC_01&VEN_10EC&DEV_0897&SUBSYS_104387FB&REV_1004\4&BCA3584&0&0001
→REVの後ろの4&BCA・・・というのは何だろう?
・・・USB、PCI以外にもたくさんある。
列挙子
デバイスインスタンスパスの先頭に出てくるUSB
とかPCI
などのことを「列挙子」というっぽい。
※デバマネの詳細のプロパティの「列挙子」がそれにあたるっぽい。
列挙子SWD
SWDは「Software Device」の略らしい。
自宅の、BuffaloのUSBカメラ(マイク付き)のドライバを見てみると、下図のように、
親の「USB」のドライバがいて、
その下に、子の「SWD」のドライバがいた。
で、それぞれのプロパティに「親」と「子」があり、それぞれお互いのデバイスインスタンスパスを指していた。
これは、親のUSBのドライバがデバイスを制御して、 そこから貰ったデータ?を、子のSWDのドライバがソフト的に?なにか処理をしている、、、のか?
VID
ベンダーID。
どこの会社が作ったものかがわかるID。
例えば、VID_0411
だったら「BUFFALO」。
PID
プロダクトID。
その会社の、なんの製品かがわかるID。
MI
インターフェースを表すID、らしい。
MIは「Multi Interface」、の略かな...?(未確認)
コンテナ―ID
第6版のP96参照。
バスドライバーにより挙げてこられるプロパティ。
コンテナIDは、GUIDである。
カメラや音楽プレーヤー、などを搭載した携帯など、多機能なデバイスの物理デバイスを識別するためのもの。(複数のdevnodeを、1つのデバイスとしてまとめるためのもの?)
デバマネの下記から見れる。
devnode(デバイスノード)
該当のデバイス(デバイスインスタンスパス)向けにインストールされたドライバ(.inf)の情報?
あるデバイスのためにインストールされたドライバ?
1つのデバイスインスタンスパスに対して、複数のdevnodeがある場合がある。
これは、GPTによると「同じデバイスに対して複数の異なるドライバーがロードされた場合」っぽい。
1個のドライバの中に、複数のハードウェアIDが載ってるのはなぜ?
こんな感じで、1個のドライバの中に、複数のハードウェアIDが載ってるときがある。下記だと、USBカメラのドライバを見ると、複数のハードウェアIDが載ってた。
これは、下記のページに、それっぽいことが載ってた。
上記の内容プラス、職場の方に教えて頂いた内容を加えてまとめると、、、
- 載ってるハードウェアIDが、今使ってるPCに載ってるわけではない。どれかにヒット?したら、そのデバイスはそのドライバで動くことになる。
- 実際に動いてるハードウェアは、「一致するデバイスID」という項目に出てくるIDっぽい。
- 上の方に上がってるハードウェアIDが、最も細かくデバイスを指定したIDで、多機能なイメージ。
- 下の方に上がっているハードウェアIDが、最も汎用的に使えるデバイスを指定したIDで、小機能なイメージ。
- Windowsであれば使えるようなデバイスであれば、「互換ID」のほうに載ってるデバイスとしてそのドライバは登録され、デバイスが動く。
その他、教えてもらったこと、学んだことメモ
本で見たこと
- win+Rでmsinfo32.exeを開くと、読み込んでいるドライバの情報を見れる。
教えてもらったこと
- デバマネ画面に出てくるドライバは、ほとんどがカーネルモードドライバ。(ユーザーモードドライバの方がすくない)
- 特定のドライバがインストールされているかどうかを探したいときは、「デバイスインスタンスパス」で探すのがよい。
- デバイスインスタンスパスは、上で見たように、列挙子ごとに大体こういう書式だ、というのが決まってて、例えばベンダーID、プロダクトIDまでを見ればどの製品向けのドライバなのかを見れそう、とは推測できる。
- ただし、正式に、デバイスインスタンスパスのどこまでを見ればそのドライバと判断できるか、は、ハードの担当の方に聞く方がよい。(ハードの仕様的に、どこまで見ればよいか、を聞く。もし仕様が不明であれば、ハードのメーカーに確認してもらうようにするべし。)
ドライバをインストールすると、レジストリに列挙される
インサイドwindows 第6版のP92に「システムのインストール後に検出されたデバイスはすべて次のレジストリキーの下に記録されます」とある。
HKLM¥SYSTEM¥CurrentControlSet¥Enum
ここを見たら、今インストールされているデバイスがわかるのかも。
見てみた。
例えば自宅PCのマイクのドライバを見てみたら、下記のようになっていた。
レジストリ登録は、
<列挙子>\<デバイスID>\<インスタンスID>
形式で列挙されてるらしい(同本のP92)。なので、デバイスインスタンスパスの
だと思ってよさそう。(実際、レジストリを見たら、そういう風に登録されている)
→「このドライバがインストールされているかどうか」を見たい場合、列挙子~デバイスIDまでを見ればよいのではないかな、と思った。(インスタンスIDは、インスタンスごとに変わりそう=PCが変われば変わりそう)
参考となりそうなコードが紹介されているページ
下記に、〇〇を取得したいときは、のような形で、参考になりそうなコードが紹介されている。(Devconのコードを見ていたら出てきてるAPIが多いかも)
https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/accessing-device-properties
参考
https://learn.microsoft.com/en-us/windows-hardware/drivers/install/device-instance-ids
↑のページの目次に出てる項目をみたら、なにかわかりそう。
ギモン点 & 次やること
・「ハードウェアID」がなんなのかがわからない。 1ドライバに複数ハードウェアIDがあるのも なぜ? →devcon hwids で見てみる! →hwidについては、何となくわかった。→hwidsのコマンドの解析はやってみる!
・ユーザーモードのドライバは、Windowsのサービスである?
→devconのコード内か、リポジトリに、その辺の記述があったような?
・デバイスインスタンスパスを、クラスごとに取れるようなサンプルコードをまとめたい。 (表にして、各ドライバの、クラス/表示名/インスタンスID、ハードウェアID一覧(コンボで?)/コンパチID(コンボで?)/接続状態/などなどを一覧表示)
・指定クラスのデバイスインスタンスパスをとるやりかた、実はWMI(たぶんWin32_PnPSignedDriver)でほぼ同じことができるんじゃないか?やってみる。(まずはsetupAPIでやってみてから)
・deviceノード、というのもやりたい。ノードとは何か?がよくわかってないので、いじくりまわして確かめたい。
devconの「drivernodes」コマンドを解析してみる。
・デバイスインスタンスパスを指定したら、そのドライバの情報を全部表にして見れる、みたいなのを作ってみたい。
そいつで、複数のドライバの情報を一覧して、接続やクラスごとにどこがどう違うのか、どう一緒なのか、など見てみたい。