/// <summary>
        /// Find the index of the particular DeviceInfoData for the instanceId.
        /// </summary>
        /// <param name="handle"></param>
        /// <param name="diData"></param>
        /// <param name="instanceId"></param>
        /// <returns></returns>
        private static int GetIndexOfInstance(SafeDeviceInfoSetHandle handle, DeviceInfoData[] diData, string instanceId)
        {
            const int ERROR_INSUFFICIENT_BUFFER = 122;

            for (int index = 0; index <= diData.Length - 1; index++)
            {
                StringBuilder sb           = new StringBuilder(1);
                int           requiredSize = 0;
                bool          result       = NativeMethods.SetupDiGetDeviceInstanceId(handle.DangerousGetHandle(), ref diData[index], sb, sb.Capacity, out requiredSize);
                if (result == false && Marshal.GetLastWin32Error() == ERROR_INSUFFICIENT_BUFFER)
                {
                    sb.Capacity = requiredSize;
                    result      = NativeMethods.SetupDiGetDeviceInstanceId(handle.DangerousGetHandle(), ref diData[index], sb, sb.Capacity, out requiredSize);
                }
                if (result == false)
                {
                    throw new Win32Exception();
                }
                if (instanceId.Equals(sb.ToString()))
                {
                    return(index);
                }
            }
            // not found
            return(-1);
        }
        private static List <string> GetInstanceIdsFromClassGuid(Guid classGuid)
        {
            SafeDeviceInfoSetHandle diSetHandle = null;
            List <string>           resultList  = new List <string>();

            try
            {
                // Get the handle to a device information set for all devices matching classGuid that are present on the
                // system.
                diSetHandle = NativeMethods.SetupDiGetClassDevs(ref classGuid, null, IntPtr.Zero, SetupDiGetClassDevsFlags.Present);
                // Get the device information data for each matching device.
                DeviceInfoData[] diData = GetDeviceInfoData(diSetHandle);

                const int ERROR_INSUFFICIENT_BUFFER = 122;
                for (int index = 0; index <= diData.Length - 1; index++)
                {
                    StringBuilder sb           = new StringBuilder(1);
                    int           requiredSize = 0;
                    bool          result       = NativeMethods.SetupDiGetDeviceInstanceId(diSetHandle.DangerousGetHandle(), ref diData[index], sb, sb.Capacity, out requiredSize);
                    if (result == false && Marshal.GetLastWin32Error() == ERROR_INSUFFICIENT_BUFFER)
                    {
                        sb.Capacity = requiredSize;
                        result      = NativeMethods.SetupDiGetDeviceInstanceId(diSetHandle.DangerousGetHandle(), ref diData[index], sb, sb.Capacity, out requiredSize);

                        resultList.Add(sb.ToString());
                    }
                }
            }
            finally
            {
                if (diSetHandle != null)
                {
                    if (diSetHandle.IsClosed == false)
                    {
                        diSetHandle.Close();
                    }
                    diSetHandle.Dispose();
                }
            }
            return(resultList);
        }