C#如何实现插入USB显示其PID和VID

noslepums123 2014-07-29 09:31:54
RT 用VS2010
...全文
768 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sinat_23537947 2015-08-19
  • 打赏
  • 举报
回复
楼主,可以把代码给我看看吗,我也遇到问题了
寒熹 2014-07-31
  • 打赏
  • 举报
回复
public struct HIDD_VIDPID { public UInt16 VendorID; // 供应商标识 public UInt16 ProductID; // 产品编号 } /// <summary> /// 基于WDK获取系统设备的VIDPID /// </summary> public partial class USB { /// <summary> /// 获取系统所有设备的VIDPID /// </summary> public static HIDD_VIDPID[] AllVidPid { get { return WhoVidPid(Guid.Empty, Guid.Empty); } } /// <summary> /// 结合设备安装类GUID和设备接口类GUID获取设备VIDPID /// </summary> /// <param name="setupClassGuid">设备安装类GUID,Empty忽视</param> /// <param name="interfaceClassGuid">设备接口类GUID,Empty忽视</param> /// <returns>设备VIDPID列表</returns> /// <remarks> /// 优点:直接通过设备实例ID提取VIDPID,从而无需获取设备路径来读写IO /// </remarks> public static HIDD_VIDPID[] WhoVidPid(Guid setupClassGuid, Guid interfaceClassGuid, String Enumerator = null) { // 根据设备安装类GUID创建空的设备信息集合 IntPtr DeviceInfoSet; if (setupClassGuid == Guid.Empty) { DeviceInfoSet = SetupDiCreateDeviceInfoList(IntPtr.Zero, IntPtr.Zero); } else { DeviceInfoSet = SetupDiCreateDeviceInfoList(ref setupClassGuid, IntPtr.Zero); } if (DeviceInfoSet == new IntPtr(-1)) return null; // 根据设备接口类GUID创建新的设备信息集合 IntPtr hDevInfo; if (interfaceClassGuid == Guid.Empty) { hDevInfo = SetupDiGetClassDevsEx( IntPtr.Zero, Enumerator, IntPtr.Zero, DIGCF.DIGCF_ALLCLASSES | DIGCF.DIGCF_DEVICEINTERFACE | DIGCF.DIGCF_PRESENT, DeviceInfoSet, null, IntPtr.Zero); } else { hDevInfo = SetupDiGetClassDevsEx( ref interfaceClassGuid, null, IntPtr.Zero, DIGCF.DIGCF_DEVICEINTERFACE | DIGCF.DIGCF_PRESENT, DeviceInfoSet, null, IntPtr.Zero); } if (hDevInfo == new IntPtr(-1)) return null; // 枚举所有设备 List<HIDD_VIDPID> DeviceList = new List<HIDD_VIDPID>(); // 存储设备实例ID StringBuilder DeviceInstanceId = new StringBuilder(256); // 获取设备信息数据 UInt32 DeviceIndex = 0; SP_DEVINFO_DATA DeviceInfoData = SP_DEVINFO_DATA.Empty; while (SetupDiEnumDeviceInfo(hDevInfo, DeviceIndex++, ref DeviceInfoData)) { // 获取设备实例ID if (SetupDiGetDeviceInstanceId(hDevInfo, ref DeviceInfoData, DeviceInstanceId, DeviceInstanceId.Capacity, IntPtr.Zero)) { String PNPDeviceID = DeviceInstanceId.ToString(); Match match = Regex.Match(PNPDeviceID, "VID_[0-9|A-F]{4}&PID_[0-9|A-F]{4}"); if (match.Success) { HIDD_VIDPID Entity; Entity.VendorID = Convert.ToUInt16(match.Value.Substring(4, 4), 16); // 供应商标识 Entity.ProductID = Convert.ToUInt16(match.Value.Substring(13, 4), 16); // 产品编号 if (!DeviceList.Contains(Entity)) DeviceList.Add(Entity); } } } SetupDiDestroyDeviceInfoList(hDevInfo); if (DeviceList.Count == 0) return null; else return DeviceList.ToArray(); } /// <summary> /// 从搜索列表中提取出存在于系统中的VIDPID /// </summary> /// <param name="searchList">搜索列表</param> /// <returns>系统中存在的VIDPID列表</returns> public static HIDD_VIDPID[] WhoVidPid(HIDD_VIDPID[] searchList) { // 获取系统所有设备的VIDPID集合 HIDD_VIDPID[] DeviceCollection = AllVidPid; if (DeviceCollection == null) return null; List<HIDD_VIDPID> ValidList = new List<HIDD_VIDPID>(); foreach (HIDD_VIDPID VidPid in searchList) { if (Array.IndexOf(DeviceCollection, VidPid) != -1) { ValidList.Add(VidPid); } } if (ValidList.Count == 0) return null; else return ValidList.ToArray(); } } }
xiaohuh421 2014-07-29
  • 打赏
  • 举报
回复
http://social.microsoft.com/Forums/nl-NL/18eca9e1-b79a-4165-9ef1-7a80d405638d/cusb?forum=visualcshartzhchs
haifeng3326 2014-07-29
  • 打赏
  • 举报
回复
c++的知道,c#没搞过,但是应该差不多吧 设备接口类GUID,SetupDiGetClassDevs,SetupDiEnumDeviceInterfaces……………………这些函数,网上搜一下应该挺多的
whoho 2014-07-29
  • 打赏
  • 举报
回复
能让版主移动到C#版块去?发错位置了
phison-UP10量产工具v1.78.00(U盘量产工具),亲测成功!!!设备名称: [I:]USB Mass Storage Device(Kingston DataTraveler 2.0 USB Device) PNP设备ID: VID = 0951 PID = 1607 设备序列号: 5B780FA602D0  设备版本: PMAP  设备类型: 标准USB设备 - USB2.0高速 芯片制造商: skymedi(擎泰)  芯片型号: SK6281/PS2232(版本号PMAP) 产品制造商: Kingston(金士顿)  产品型号: DataTraveler 2.0    U盘:金士顿2G 型号DMFP/2GB 量产工具:phison-UP10量产工具v1.78.00 方法: 1、将下载的phison-UP10量产工具v1.78.00解压到任一目录。 2、运行F1_B4_v178.exe或F2_v178.exe点击“取得信息”,如果从“测试报告”窗口有内容说明可以使用此工具量产你的U盘;如果弹出“没有找到设备”信息你只好另找了。 3、退出程序 4、运行ParamEdt.exe,配置--模式栏输入“21”,再选择“select”可选光盘ISO或BIN文件。然后按另存为一个1.ini文件。注意F1对应F1_B4_v178.exe;F2对应F2_v178.exe。(或者可直接配置好ini附后(1.ini),在文件中直接改ISO文件存放目录也可。) 1.ini文件 [Extra] Mode=21 [Misc] CDROM Image=D:\系统\萝卜家园 Ghost XP SP3 电脑城装机版 8.8.iso (←改成ISO文件存放目录) 5、再运行F1_B4_v178.exe或F2_v178.exe点击“开始”。稍等一会……下面变成绿色的框就成功了。再点“弹出”,重新插入U盘。 6、此量产工具模式可选择很多,有一些并不适用自己的U盘,其它参数你也需要多试一试才能成功。 在BIOS中启动设置为USB-CDROM 恢复时选择PE模式 还原 用原来的量产工具,选择模式3,重新量产一次。 注意:镜像文件选择留空就行了。 再用F1_B4_v178.exe,ini文件选param,方法同上。(不能i还原的,可进行低格)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧