問題タブ [device-instance-id]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
15337 参照

c# - DEV_BROADCAST_DEVICEINTERFACE とデバイス インスタンス ID からわかりやすいデバイス名を取得する方法

ウィンドウをRegisterDeviceNotificationに登録し、 DEV_BROADCAST_DEVICEINTERFACEメッセージを正常に受信できます。ただし、dbcc_name返される構造体のフィールドは常に空です。私が持っている構造体は次のように定義されています。

そしてMarshal.PtrToStructureWM_DEVICECHANGEメッセージの LParam で使用しています。

これは機能するはずですか?

またはさらに良い...接続時にデバイスの名前を取得する別の方法はありますか?

編集 (2010 年 2 月 5 日 20:56GMT):

これを行うことで、dbcc_nameフィールドにデータを入力する方法を見つけました:

しかし、int dbcc_name から「わかりやすい」名前を取得する方法が必要です。次のようになります。

\?\USB#VID_05AC&PID_1294​​&MI_00#0#{6bdd1fc6-810f-11d0-bec7-08002be2092f}

そして、私は本当に「Apple iPhone」と言いたいだけです(この場合のデバイスはこれです)。

0 投票する
2 に答える
3746 参照

c# - USB ストレージ デバイスのインスタンス ID (一意の ID) をプログラムで取得する

ユーザーが差し込んだばかりの USB 大容量記憶装置のデバイス インスタンス ID (一意の ID) をプログラムで取得する方法は?

0 投票する
2 に答える
2209 参照

c# - デバイスインスタンスIDが一意であるかどうかを知る方法は?

.NET Framework v3.5を使用してC#Windowsアプリケーションを開発しています。

すべてのUSBデバイスには、コンピューター上の同じタイプの他のデバイスと区別するための一意のインスタンスIDが必要です。

デバイスInstanceIDが一意でない場合、PnPマネージャーはInstanceIDを変更し、対応するDeviceTypeIDと組み合わせて、システム内で一意のデバイスインスタンスIDを作成します。

USBデバイスインスタンスIDがシステム全体で一意であるかどうかを確認する必要があります。

IRP_MN_QUERY_CAPABILITIESを使用してデバイス機能を取得し、次にDEVICE_CAPABILITIESUniqueIDメンバーをチェックして 、インスタンスIDがシステム全体で一意であるかどうかを示すことができます。

私の質問は次のとおりです。

  1. C#でIRP_MN_QUERY_CAPABILITIESを使用するにはどうすればよいですか?
  2. このクエリの使用方法に関するC++サンプルコードはありますか?
  3. インスタンスIDが一意でないかどうかを知る他の方法はありますか?
0 投票する
3 に答える
7503 参照

c++ - デバイス インスタンス ID を指定して、ネットワーク カードの MAC アドレスを確実かつ迅速に取得する方法

ネットワーク カードのデバイス インスタンス IDが与えられた場合、その MAC アドレスを知りたいです。内蔵 Intel ギガビット カードのシステムでのデバイス インスタンス ID の例:

これまでのところ、私が使用したアルゴリズムは次のように機能します。

  1. SetupDiGetClassDevsで呼び出しDIGCF_DEVICEINTERFACEます。
  2. を呼び出しSetupDiEnumDeviceInfoて、返されたデバイスを で取得しSP_DEVINFO_DATAます。
  3. で呼び出しSetupDiEnumDeviceInterfacesGUID_NDIS_LAN_CLASS、デバイス インターフェイスを取得します。
  4. SetupDiGetDeviceInterfaceDetailこの返されたデバイス インターフェイスを呼び出します。これにより、デバイス パスが文字列として取得されます。 \\?\pci#ven_8086&dev_10cc&subsys_00008086&rev_00#3&33fd14ca&0&c8#{ad498944-762f-11d0-8dcb-00c04fc3358c}\{28fd5409-15bd-4c06-b62f-004d3a06f852}
  5. この時点で、ネットワーク カード ドライバーのインターフェイスへのアドレスを取得しています。CreateFile#4 の結果を使用して開きます。
  6. と OID を呼び出しDeviceIoControlて、MAC アドレスを取得します。IOCTL_NDIS_QUERY_GLOBAL_STATSOID_802_3_PERMANENT_ADDRESS

これは通常は機能し、非常に多くのマシンで正常に使用されています。DeviceIoControlただし、手順 6の要求に適切に応答しないネットワーク ドライバーを備えたごく少数のマシンが存在するようです。ネットワークカードドライバーを最新に更新した後でも問題は解決しません。これらは、新しい Windows 7 ベースのコンピューターです。具体的には、DeviceIoControl正常に完了しますが、MAC アドレスを含む予想される 6 バイトではなく、0 バイトを返します。

手がかりはMSDNページにあるようですIOCTL_NDIS_QUERY_GLOBAL_STATS

この IOCTL は、以降のオペレーティング システムのリリースでは非推奨になります。ミニポート ドライバー情報を照会するには、WMI インターフェイスを使用する必要があります。詳細については、「WMI の NDIS サポート」を参照してください。

-- おそらく、新しいネットワーク カード ドライバは、この IOCTL を実装していないのでしょうか?

では、どうすればこれを機能させることができますか?私のアプローチに見落としがあり、少し間違ったことをしている可能性はありますか? それとも、もっと別のアプローチを取る必要がありますか? いくつかの代替アプローチには、次のものが含まれているようです。

  • クエリWin32_NetworkAdapterWMI クラス: 必要な情報を提供しますが、パフォーマンスがひどいために拒否されました。ローカル コンピューターの MAC アドレスを取得するための Win32_NetworkAdapter WMI クラスの高速置換を参照してください。
  • Query MSNdis_EthernetPermanentAddressWMI class: WMI の代替と思われるものでIOCTL_NDIS_QUERY_GLOBAL_STATS、ドライバーから直接 OID を照会します。これは、厄介なネットワーク ドライバーで動作します。残念ながら、返されたクラス インスタンスは、MAC アドレスと、のInstanceNameようなローカライズされた文字列であるのみを提供しますIntel(R) 82567LM-2 Gigabit Network Connection。クエリを実行すると、をなどMSNdis_EnumerateAdapterに関連付けるリストが生成されます。からプラグアンドプレイ デバイス インスタンス ID ( )に移動する方法がわかりません。InstanceNameDeviceName\DEVICE\{28FD5409-15BD-4C06-B62F-004D3A06F852}DeviceNamePCI\VEN_8086......
  • GetAdaptersAddressesor GetAdaptersInfo(非推奨) を呼び出します。戻り値で見つけることができる唯一のローカライズされていない識別子はアダプター名です。これは、WMI NDIS クラスによって返されるもの{28FD5409-15BD-4C06-B62F-004D3A06F852}と同じような文字列です。DeviceName繰り返しますが、それをデバイス インスタンス ID に関連付ける方法がわかりません。TCP/IP プロトコルが構成されていないアダプターなど、100% の時間でも動作するかどうかはわかりません。
  • NetBIOS 方式: 特定のプロトコルをカードに設定する必要があるため、100% は機能しません。一般的にはハックっぽいようで、とにかく私が知っているデバイス インスタンス ID に関連付ける方法ではありません。私はこのアプローチを拒否します。
  • UUID 生成方法: ここでは詳しく説明しない理由により拒否されました。

デバイス インスタンス ID からカードの "GUID" を取得する方法を見つけることができれば、残りの 2 つの方法のいずれかでうまくいくようです。しかし、私はまだ方法を理解していません。それ以外の場合は、WMI NDIS アプローチが最も有望に思えます。

ネットワーク カードと MAC アドレスのリストを取得するのは簡単で、いくつかの方法があります。デバイス インスタンス ID に関連付けることができる高速な方法でそれを行うのは明らかに難しいです...

編集: 誰かに役立つ場合のIOCTL呼び出しのサンプルコード(リークされたhFileハンドルは無視してください):

コードは失敗し、次のように出力されます。

そのため、DeviceIoControl は成功を示すゼロ以外を返しますが、その後はゼロ バイトを返します。

0 投票する
2 に答える
2831 参照

c++ - デバイスインスタンスパス文字列からデバイスインスタンスDWORDを取得します

次のようなデバイスインスタンスパスを取得します

IWDFRemoteInterfaceInitialize::RetrieveSymbolicLinkから。
しかし、CM_Get_Parentの場合、私を夢中にさせるデバイスのDEVINST/DWORDが必要です。
私は例えば試しました

そして他のいくつかのSetupDi...ブードゥーは成功しませんでした。-前述のように-私はこの狂気を何時間も回避することができず、逆の方法(分割->インスタンスパス)の例は数十ありますが、私は何も見つかりませんでしたので、どんな助けも大歓迎ですインスタンスパス->DEVINST。

0 投票する
2 に答える
2552 参照

windows - PCSC リーダーのデバイス インスタンス ID を見つける方法

Windows >= XP で使用する PCSC リーダーへのハンドルとコンテキストのみを持っているwinscard場合、そのデバイス インスタンス ID を取得する方法や、SetupDi*API で使用して、そのリーダーに読み込まれているドライバーを特定する方法はありますか。

SCardGetReaderDeviceInstanceIdWindows 8 でしか利用できないため、残念ながら私には利用できません。

SetupDiプラン B として、スマート カード リーダー クラス GUID を使用して、すべてのスマート カード リーダーを列挙できます。しかし、API とAPIの間でリーダーを関連付けるためには、一意の属性が必要になります。たとえば、シリアル番号は良い候補のように思えますが、すべてのメーカーが使用しているわけではありません。SCard*SetupDi*

何か案は?

0 投票する
2 に答える
1659 参照

usb - USB デバイスインスタンスを解析するには?

「Device Instance ID」の作り方や解析方法が知りたいです。

例として、次の文字列を取り上げます。

私の知識によると:

  • USBこれが USB デバイスであることを示します
  • VID_093Aベンダー ID を示します
  • 同様にPID_2700、製品ID

しかし、私は残りについて知りません。

0 投票する
3 に答える
3701 参照

c# - 親デバイスを取得する

私は 2 つの USB デバイス ID を持っていますUSB\VID_E4F1&PID_0661\00000115FA9CE7750000000000000000USB\VID_E4F1&PID_0661&MI_00\7&B5A5DDF&0&0000

デバイス #2 がデバイス #1 の直接の子であることを確認する方法 (物理的には、同じ USB 複合デバイスの異なる部分です)。

実際のシナリオでは、それらの多くが同じ USB コントローラーに接続されます。また、同一メーカー・同一機種の可能性もございます。そのため、VID、PIDWin32_USBControllerDeviceを確認できず、WMI クエリを使用してそれらが同じ USB コントローラーに接続されていることを確認できません。同じコントローラーに接続されているという事実だけでなく、親子関係を何らかの方法で確認する必要があります。

問題がある場合は、Windows 8+ のみをサポートする必要があります。