C#:基于WDK获取设备路径集合

关联文章:

C#:结合设备安装类GUID和设备接口类GUID获取设备VIDPID

C#:基于WMI查询USB设备

C#:基于WMI监视USB插拔

常用设备接口类GUID

常见硬件的设备类GUID

源代码:

WDKUsbQuery.cs

/* ----------------------------------------------------------
文件名称:WDKUsbQuery.cs

作者:秦建辉

MSN:splashcn@msn.com
QQ:36748897

博客:http://blog.csdn.net/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);
        }            
    }
}

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值