关联文章:
C#:结合设备安装类GUID和设备接口类GUID获取设备VIDPID
C#:基于WMI查询USB设备
C#:基于WMI监视USB插拔
常用设备接口类GUID
常见硬件的设备类GUID
源代码:
WDKUsbQuery.cs
/* ----------------------------------------------------------
文件名称:WDKUsbQuery.cs
作者:秦建辉
MSN:splashcn@msn.com
QQ:36748897
博客:http://blog.youkuaiyun.com/jhqin
开发环境:
Visual Studio V2010
.NET Framework 4 Client Profile
版本历史:
V1.0 2011年09月05日
基于WDK获取设备路径集合
------------------------------------------------------------ */
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
namespace Splash.IO.PORTS
{
/// <summary>
/// 基于WDK获取设备路径集合
/// </summary>
public partial class USB
{
/// <summary>
/// 获取同时指定设备安装类GUID和设备接口类GUID的设备的设备路径集合
/// </summary>
/// <param name="setupClassGuid">设备安装类GUID,Empty忽视</param>
/// <param name="interfaceClassGuid">设备接口类GUID</param>
/// <param name="Enumerator">枚举器:USB、PCI、PCMCIA、SCSI或者设备实例ID</param>
/// <returns>设备路径集合</returns>
public static String[] GetDevicePath(Guid setupClassGuid, Guid interfaceClassGuid, String Enumerator = null)
{ // 设备接口类GUID
if (interfaceClassGuid == Guid.Empty) return 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 = SetupDiGetClassDevsEx(
ref interfaceClassGuid,
Enumerator,
IntPtr.Zero,
DIGCF.DIGCF_DEVICEINTERFACE | DIGCF.DIGCF_PRESENT,
DeviceInfoSet,
null,
IntPtr.Zero);
if (hDevInfo == new IntPtr(-1)) return null;
// 枚举所有设备
List<String> DevicePathList = new List<String>();
// 获取设备接口
UInt32 MemberIndex = 0;
SP_DEVICE_INTERFACE_DATA DeviceInterfaceData = SP_DEVICE_INTERFACE_DATA.Empty;
while (SetupDiEnumDeviceInterfaces(hDevInfo, null, ref interfaceClassGuid, MemberIndex++, ref DeviceInterfaceData))
{ // 获取接口细节
SP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData = new SP_DEVICE_INTERFACE_DETAIL_DATA();
// 区分32位操作系统和64位操作系统
DeviceInterfaceDetailData.cbSize = (UInt32)((IntPtr.Size == 4) ? (4 + Marshal.SystemDefaultCharSize) : 8);
if (SetupDiGetDeviceInterfaceDetail(hDevInfo,
ref DeviceInterfaceData,
ref DeviceInterfaceDetailData,
Marshal.SizeOf(DeviceInterfaceDetailData),
IntPtr.Zero,
null))
{ // 获取设备路径
DevicePathList.Add(DeviceInterfaceDetailData.DevicePath);
}
}
SetupDiDestroyDeviceInfoList(hDevInfo);
if (DevicePathList.Count == 0)
return null;
else
return DevicePathList.ToArray();
}
/// <summary>
/// 获取具有指定设备接口类GUID的设备的设备路径集合
/// </summary>
/// <param name="interfaceClassGuid">设备接口类GUID</param>
/// <param name="Enumerator">枚举器:USB、PCI、PCMCIA、SCSI或者设备实例ID</param>
/// <returns>设备路径集合</returns>
public static String[] GetDevicePath(Guid interfaceClassGuid, String Enumerator = null)
{
return GetDevicePath(Guid.Empty, interfaceClassGuid, Enumerator);
}
/// <summary>
/// 获取指定设备安装类GUID和USB接口的设备的设备路径集合
/// </summary>
/// <param name="setupClassGuid">设备安装类GUID,Empty忽视</param>
/// <param name="Enumerator">枚举器:USB、PCI、PCMCIA、SCSI或者设备实例ID</param>
/// <returns>设备路径集合</returns>
public static String[] GetUsbDevicePath(Guid setupClassGuid, String Enumerator = null)
{
return GetDevicePath(setupClassGuid, new Guid("{A5DCBF10-6530-11D2-901F-00C04FB951ED}"), Enumerator);
}
/// <summary>
/// 获取指定USB设备的设备路径集合
/// </summary>
/// <param name="PnPEntity">即插即用设备实体信息</param>
/// <returns>设备路径集合</returns>
public static String[] GetUsbDevicePath(PnPEntityInfo PnPEntity)
{
return GetDevicePath(PnPEntity.ClassGuid, new Guid("{A5DCBF10-6530-11D2-901F-00C04FB951ED}"), PnPEntity.PNPDeviceID);
}
/// <summary>
/// 获取具有USB接口的设备的设备路径集合
/// </summary>
/// <param name="Enumerator">枚举器:USB、PCI、PCMCIA、SCSI或者设备实例ID</param>
/// <returns>设备路径集合</returns>
public static String[] GetUsbDevicePath(String Enumerator = null)
{
return GetDevicePath(Guid.Empty, new Guid("{A5DCBF10-6530-11D2-901F-00C04FB951ED}"), Enumerator);
}
/// <summary>
/// 获取指定设备安装类GUID和HID接口的设备的设备路径集合
/// </summary>
/// <param name="setupClassGuid">设备安装类GUID,Empty忽视</param>
/// <param name="Enumerator">枚举器:USB、PCI、PCMCIA、SCSI或者设备实例ID</param>
/// <returns>设备路径集合</returns>
public static String[] GetHidDevicePath(Guid setupClassGuid, String Enumerator = null)
{
return GetDevicePath(setupClassGuid, new Guid("{4D1E55B2-F16F-11CF-88CB-001111000030}"), Enumerator);
}
/// <summary>
/// 获取指定HID设备的设备路径集合
/// </summary>
/// <param name="PnPEntity">即插即用设备实体信息</param>
/// <returns>设备路径集合</returns>
public static String[] GetHidDevicePath(PnPEntityInfo PnPEntity)
{
return GetDevicePath(PnPEntity.ClassGuid, new Guid("{4D1E55B2-F16F-11CF-88CB-001111000030}"), PnPEntity.PNPDeviceID);
}
/// <summary>
/// 获取具有HID接口的设备的设备路径集合
/// </summary>
/// <param name="Enumerator">枚举器:USB、PCI、PCMCIA、SCSI或者设备实例ID</param>
/// <returns>设备路径集合</returns>
public static String[] GetHidDevicePath(String Enumerator = null)
{
return GetDevicePath(Guid.Empty, new Guid("{4D1E55B2-F16F-11CF-88CB-001111000030}"), Enumerator);
}
}
}