問題タブ [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.
c# - DEV_BROADCAST_DEVICEINTERFACE とデバイス インスタンス ID からわかりやすいデバイス名を取得する方法
ウィンドウをRegisterDeviceNotificationに登録し、 DEV_BROADCAST_DEVICEINTERFACEメッセージを正常に受信できます。ただし、dbcc_name
返される構造体のフィールドは常に空です。私が持っている構造体は次のように定義されています。
そしてMarshal.PtrToStructure
、WM_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」と言いたいだけです(この場合のデバイスはこれです)。
c# - USB ストレージ デバイスのインスタンス ID (一意の ID) をプログラムで取得する
ユーザーが差し込んだばかりの USB 大容量記憶装置のデバイス インスタンス ID (一意の ID) をプログラムで取得する方法は?
c# - デバイスインスタンスIDが一意であるかどうかを知る方法は?
.NET Framework v3.5を使用してC#Windowsアプリケーションを開発しています。
すべてのUSBデバイスには、コンピューター上の同じタイプの他のデバイスと区別するための一意のインスタンスIDが必要です。
デバイスInstanceIDが一意でない場合、PnPマネージャーはInstanceIDを変更し、対応するDeviceTypeIDと組み合わせて、システム内で一意のデバイスインスタンスIDを作成します。
USBデバイスインスタンスIDがシステム全体で一意であるかどうかを確認する必要があります。
IRP_MN_QUERY_CAPABILITIESを使用してデバイス機能を取得し、次にDEVICE_CAPABILITIESのUniqueIDメンバーをチェックして 、インスタンスIDがシステム全体で一意であるかどうかを示すことができます。
私の質問は次のとおりです。
- C#でIRP_MN_QUERY_CAPABILITIESを使用するにはどうすればよいですか?
- このクエリの使用方法に関するC++サンプルコードはありますか?
- インスタンスIDが一意でないかどうかを知る他の方法はありますか?
c++ - デバイス インスタンス ID を指定して、ネットワーク カードの MAC アドレスを確実かつ迅速に取得する方法
ネットワーク カードのデバイス インスタンス IDが与えられた場合、その MAC アドレスを知りたいです。内蔵 Intel ギガビット カードのシステムでのデバイス インスタンス ID の例:
これまでのところ、私が使用したアルゴリズムは次のように機能します。
SetupDiGetClassDevs
で呼び出しDIGCF_DEVICEINTERFACE
ます。- を呼び出し
SetupDiEnumDeviceInfo
て、返されたデバイスを で取得しSP_DEVINFO_DATA
ます。 - で呼び出し
SetupDiEnumDeviceInterfaces
てGUID_NDIS_LAN_CLASS
、デバイス インターフェイスを取得します。 SetupDiGetDeviceInterfaceDetail
この返されたデバイス インターフェイスを呼び出します。これにより、デバイス パスが文字列として取得されます。\\?\pci#ven_8086&dev_10cc&subsys_00008086&rev_00#3&33fd14ca&0&c8#{ad498944-762f-11d0-8dcb-00c04fc3358c}\{28fd5409-15bd-4c06-b62f-004d3a06f852}
- この時点で、ネットワーク カード ドライバーのインターフェイスへのアドレスを取得しています。
CreateFile
#4 の結果を使用して開きます。 - と OID を呼び出し
DeviceIoControl
て、MAC アドレスを取得します。IOCTL_NDIS_QUERY_GLOBAL_STATS
OID_802_3_PERMANENT_ADDRESS
これは通常は機能し、非常に多くのマシンで正常に使用されています。DeviceIoControl
ただし、手順 6の要求に適切に応答しないネットワーク ドライバーを備えたごく少数のマシンが存在するようです。ネットワークカードドライバーを最新に更新した後でも問題は解決しません。これらは、新しい Windows 7 ベースのコンピューターです。具体的には、DeviceIoControl
正常に完了しますが、MAC アドレスを含む予想される 6 バイトではなく、0 バイトを返します。
手がかりはMSDNページにあるようですIOCTL_NDIS_QUERY_GLOBAL_STATS
:
この IOCTL は、以降のオペレーティング システムのリリースでは非推奨になります。ミニポート ドライバー情報を照会するには、WMI インターフェイスを使用する必要があります。詳細については、「WMI の NDIS サポート」を参照してください。
-- おそらく、新しいネットワーク カード ドライバは、この IOCTL を実装していないのでしょうか?
では、どうすればこれを機能させることができますか?私のアプローチに見落としがあり、少し間違ったことをしている可能性はありますか? それとも、もっと別のアプローチを取る必要がありますか? いくつかの代替アプローチには、次のものが含まれているようです。
- クエリ
Win32_NetworkAdapter
WMI クラス: 必要な情報を提供しますが、パフォーマンスがひどいために拒否されました。ローカル コンピューターの MAC アドレスを取得するための Win32_NetworkAdapter WMI クラスの高速置換を参照してください。 - Query
MSNdis_EthernetPermanentAddress
WMI class: WMI の代替と思われるものでIOCTL_NDIS_QUERY_GLOBAL_STATS
、ドライバーから直接 OID を照会します。これは、厄介なネットワーク ドライバーで動作します。残念ながら、返されたクラス インスタンスは、MAC アドレスと、のInstanceName
ようなローカライズされた文字列であるのみを提供しますIntel(R) 82567LM-2 Gigabit Network Connection
。クエリを実行すると、をなどMSNdis_EnumerateAdapter
に関連付けるリストが生成されます。からプラグアンドプレイ デバイス インスタンス ID ( )に移動する方法がわかりません。InstanceName
DeviceName
\DEVICE\{28FD5409-15BD-4C06-B62F-004D3A06F852}
DeviceName
PCI\VEN_8086......
GetAdaptersAddresses
orGetAdaptersInfo
(非推奨) を呼び出します。戻り値で見つけることができる唯一のローカライズされていない識別子はアダプター名です。これは、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 は成功を示すゼロ以外を返しますが、その後はゼロ バイトを返します。
c++ - デバイスインスタンスパス文字列からデバイスインスタンスDWORDを取得します
次のようなデバイスインスタンスパスを取得します
IWDFRemoteInterfaceInitialize::RetrieveSymbolicLinkから。
しかし、CM_Get_Parentの場合、私を夢中にさせるデバイスのDEVINST/DWORDが必要です。
私は例えば試しました
そして他のいくつかのSetupDi...ブードゥーは成功しませんでした。-前述のように-私はこの狂気を何時間も回避することができず、逆の方法(分割->インスタンスパス)の例は数十ありますが、私は何も見つかりませんでしたので、どんな助けも大歓迎ですインスタンスパス->DEVINST。
windows - PCSC リーダーのデバイス インスタンス ID を見つける方法
Windows >= XP で使用する PCSC リーダーへのハンドルとコンテキストのみを持っているwinscard
場合、そのデバイス インスタンス ID を取得する方法や、SetupDi*
API で使用して、そのリーダーに読み込まれているドライバーを特定する方法はありますか。
SCardGetReaderDeviceInstanceId
Windows 8 でしか利用できないため、残念ながら私には利用できません。
SetupDi
プラン B として、スマート カード リーダー クラス GUID を使用して、すべてのスマート カード リーダーを列挙できます。しかし、API とAPIの間でリーダーを関連付けるためには、一意の属性が必要になります。たとえば、シリアル番号は良い候補のように思えますが、すべてのメーカーが使用しているわけではありません。SCard*
SetupDi*
何か案は?
usb - USB デバイスインスタンスを解析するには?
「Device Instance ID」の作り方や解析方法が知りたいです。
例として、次の文字列を取り上げます。
私の知識によると:
USB
これが USB デバイスであることを示しますVID_093A
ベンダー ID を示します- 同様に
PID_2700
、製品ID
しかし、私は残りについて知りません。
c# - 親デバイスを取得する
私は 2 つの USB デバイス ID を持っていますUSB\VID_E4F1&PID_0661\00000115FA9CE7750000000000000000
。USB\VID_E4F1&PID_0661&MI_00\7&B5A5DDF&0&0000
デバイス #2 がデバイス #1 の直接の子であることを確認する方法 (物理的には、同じ USB 複合デバイスの異なる部分です)。
実際のシナリオでは、それらの多くが同じ USB コントローラーに接続されます。また、同一メーカー・同一機種の可能性もございます。そのため、VID、PIDWin32_USBControllerDevice
を確認できず、WMI クエリを使用してそれらが同じ USB コントローラーに接続されていることを確認できません。同じコントローラーに接続されているという事実だけでなく、親子関係を何らかの方法で確認する必要があります。
問題がある場合は、Windows 8+ のみをサポートする必要があります。