1

.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が一意でないかどうかを知る他の方法はありますか?
4

2 に答える 2

0

ワールドワイドの標準がないため、デバイスインスタンスIDは一意ではありません。そして、私はUSBフラッシュドライブに取り組んできました。ただし、デバイスインスタンスには会社の名前が表示される可能性があり、これにより、デバイスが会社ごとに区別されます。私が知っている唯一の一意のデータは、乱数ジェネレーターから取得された長いデバイスシリアル番号です。Windowsを使用している場合は、WMIとそのUSBデバイスへのアクセス機能について学ぶことができます。

于 2012-06-12T08:18:17.727 に答える
0

解決策を見つけました。SetupDiGetDeviceRegistryPropertyを使用して、 DEVICE_CAPABILITIES構造体を要求しました。

 private static bool IsDeviceIdUnique(IntPtr usbDev, NativeMethods.SP_DEVINFO_DATA devInfoData,string deviceId)
    {
        uint bufferSize;
        uint propertyRegDataType;
        var buffer = new byte[WinConstants.MAX_PATH];
        NativeMethods.SetupDiGetDeviceRegistryProperty(usbDev, ref devInfoData, WinConstants.SPDRP_CAPABILITIES, out propertyRegDataType, buffer, WinConstants.MAX_PATH, out bufferSize);
        var capabilities = BitConverter.ToUInt32(buffer, 0);
        return (capabilities & WinConstants.CM_DEVCAP_UNIQUEID) == WinConstants.CM_DEVCAP_UNIQUEID;
    }
于 2012-10-22T13:17:16.843 に答える