devconの中身を見る③(cmdHwIds)

もくじ
https://tera1707.com/entry/2022/02/06/144447

やりたいこと

devconで、

devcon hwids <ハードウェアID>
devcon hwids =<クラス名>

とパラメータを渡して実行したときの処理の中身を追いかけたい。

クラス名とは、devcon classesで取れるクラス名のこと。たとえはMouseCameraAudioEndpointなど。

ハードウェア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.

ここ。

https://github.com/microsoft/Windows-driver-samples/blob/b968cfbed5566a3a9597f5368334beb3b6dad4d2/setup/devcon/cmds.cpp#L668

やってることの流れ

devcon hwids =<クラス名> の場合

EnumerateDevices()という関数の中で、以下行っている。

SetupDiClassGuidsFromNameEx

引数のクラス名("=AudioEndpoint" の=を取り除いた部分)から、クラスのGUIDを取得する。

SetupDiClassGuidsFromNameEx(クラス名文字列,&クラスGUID出力先変数,1,&numClass,Machine,NULL)

https://learn.microsoft.com/ja-jp/windows/win32/api/setupapi/nf-setupapi-setupdiclassguidsfromnameexw

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

再度、デバイス情報とデバイスインスタンスIDを取得する。

※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について調べた内容を書いたのでそっちも参照。