もくじ
https://tera1707.com/entry/2022/02/06/144447
やりたいこと
devconで、
devcon hwids <ハードウェアID> devcon hwids =<クラス名>
とパラメータを渡して実行したときの処理の中身を追いかけたい。
クラス名とは、devcon classesで取れるクラス名のこと。たとえはMouse
やCamera
、AudioEndpoint
など。
ハードウェアIDとは、デバマネのドライバのプロパティ画面の「ハードウェアID」で見れるもの。
★ハードウェアID PS C:\Users\masa\Desktop\Windows-driver-samples-main\Windows-driver-samples-main\setup\devcon\x64\Debug> ./devcon hwids MMDEVAPI\AudioEndpoints SWD\MMDEVAPI\{0.0.1.00000000}.{DC4FC213-DEDD-4B42-9F41-65BFFBB25491} Name: マイク配列 (BUFFALO BSWHD06M USB Camera (audio)) Hardware IDs: MMDEVAPI\AudioEndpoints Compatible IDs: GenericAudioEndpoint SWD\GenericRaw SWD\Generic SWD\MMDEVAPI\{0.0.0.00000000}.{EDE3150B-178E-4692-B8DD-442220C53036} Name: スピーカー (3- HK Onyx Studio) Hardware IDs: MMDEVAPI\AudioEndpoints Compatible IDs: GenericAudioEndpoint SWD\GenericRaw SWD\Generic 2 matching device(s) found. ★クラス PS C:\Users\masa\Desktop\Windows-driver-samples-main\Windows-driver-samples-main\setup\devcon\x64\Debug> ./devcon hwids =AudioEndpoint SWD\MMDEVAPI\{0.0.1.00000000}.{DC4FC213-DEDD-4B42-9F41-65BFFBB25491} Name: マイク配列 (BUFFALO BSWHD06M USB Camera (audio)) Hardware IDs: MMDEVAPI\AudioEndpoints Compatible IDs: GenericAudioEndpoint SWD\GenericRaw SWD\Generic SWD\MMDEVAPI\{0.0.0.00000000}.{EDE3150B-178E-4692-B8DD-442220C53036} Name: スピーカー (3- HK Onyx Studio) Hardware IDs: MMDEVAPI\AudioEndpoints Compatible IDs: GenericAudioEndpoint SWD\GenericRaw SWD\Generic 2 matching device(s) found.
ここ。
やってることの流れ
devcon hwids =<クラス名> の場合
EnumerateDevices()という関数の中で、以下行っている。
SetupDiClassGuidsFromNameEx
引数のクラス名("=AudioEndpoint" の=を取り除いた部分)から、クラスのGUIDを取得する。
SetupDiClassGuidsFromNameEx(クラス名文字列,&クラスGUID出力先変数,1,&numClass,Machine,NULL)
SetupDiGetClassDevsEx
SetupDiGetClassDevsEx()
で、指定のクラスのGUIDに含まれるデバイスのためのハンドル(HDEVINFO)を取得する。
devs = SetupDiGetClassDevsEx(numClass ? &cls : NULL, NULL, NULL, (numClass ? 0 : DIGCF_ALLCLASSES) | Flags, NULL, Machine, NULL);
https://learn.microsoft.com/ja-jp/windows/win32/api/setupapi/nf-setupapi-setupdigetclassdevsexa
SetupDiGetDeviceInfoListDetail
詳細情報を取る。(listclassとおなじ)
SetupDiEnumDeviceInfo
そのクラスに含まれている数だけ、デバイスの情報(SP_DEVINFO_DATA)を取る。
(listclassとおなじ)
// ### CM_Get_Device_ID_Ex
// デバイスの情報(SP_DEVINFO_DATA)から、「デバイスインスタンスパス」 を取る!
→やってなかった。別のコマンドでは、やるっぽい。
SetupDiGetDeviceInfoListDetail と CM_Get_Device_ID_Ex
※CM_Get_Device_ID_Ex()は、Get「Device_ID」とあるが、取れるのは「デバイスインスタンスパス」らしい(デバイスインスタンスパスは、デバイスインスタンスIDともいうっぽいが)
SetupDiGetDeviceRegistryProperty
SetupDiGetDeviceRegistryProperty() に「SPDRP_FRIENDLYNAME」と「SPDRP_DEVICEDESC」を指定して、フレンドリー名とデバイス説明を取る。
さらに、
「SPDRP_HARDWAREID」と「SPDRP_COMPATIBLEIDS」を指定して、ハードウェアIDと互換性IDを取得する。
※「ハードウェアID」は、これ。互換性IDは、その下のヤツ。
ハードウェアIDと互換性IDは、複数取れることもあるっぽい。(のでポインタのポインタ)
終わり
これらを、クラスの数だけやる。
次やりたいこと
次、
devcon enable <ハードウェアID>
devcon disable <ハードウェアID>
をやる。デバイスを有効、無効にする、をやってみる。
※いまちょっと、管理者権限でターミナルを起動して、試しにdevconでカメラを有効無効してみた。 (disableでクラスを指定出来たりもするらしいが、そんな広範囲をdisableにする勇気がなかった。。。) まずカメラのhwidsを取得して、
PS C:\Users\masa\Desktop\Windows-driver-samples-main\Windows-driver-samples-main\setup\devcon\x64\Debug> ./devcon hwids =camera USB\VID_0411&PID_0260&MI_00\7&1BE1E866&3&0000 Name: BUFFALO BSWHD06M USB Camera Hardware IDs: USB\VID_0411&PID_0260&REV_0103&MI_00 USB\VID_0411&PID_0260&MI_00 Compatible IDs: USB\COMPAT_VID_0411&Class_0e&SubClass_03&Prot_00 USB\COMPAT_VID_0411&Class_0e&SubClass_03 USB\COMPAT_VID_0411&Class_0e USB\Class_0e&SubClass_03&Prot_00 USB\Class_0e&SubClass_03 USB\Class_0e
それで取れたhwidを、disableコマンドで無効化してみる。
PS C:\Users\masa\Desktop\Windows-driver-samples-main\Windows-driver-samples-main\setup\devcon\x64\Debug> ./devcon disable "USB\VID_0411&PID_0260&MI_00" USB\VID_0411&PID_0260&MI_00\7&1BE1E866&3&0000 : Disabled 1 device(s) disabled.
次の次
あと、deviceノード、というのもやりたい。ノードとは何か?がよくわかってないので、いじくりまわして確かめたい。 →ドライバ勉強メモのほうに、devnodeについて調べた内容を書いたのでそっちも参照。