当前位置:编程学习 > C#/ASP.NET >>

C#:USB设备枚举(一)DeviceIoControl的PInvoke

 

/* ----------------------------------------------------------

文件名称:DeviceIoControl.cs

 

作者:秦建辉

 

MSN:splashcn@msn.com

QQ:36748897

 

博客:http://blog.csdn.net/jhqin

 

开发环境:

    Visual Studio V2010

    .NET Framework 4 Client Profile

 

版本历史:

    V1.0    2011年10月10日

            实现对DeviceIoControl接口的PInvoke

 

参考资料:

    http://www.pinvoke.net/

------------------------------------------------------------ */ 

using System; 

using System.Runtime.InteropServices; 

 

namespace Splash.IO.PORTS 

    #region ENUM 

    public enum USB_HUB_NODE : uint 

    { 

        UsbHub, 

        UsbMIParent 

    } 

 

    public enum USB_CONNECTION_STATUS 

    { 

        NoDeviceConnected, 

        DeviceConnected, 

        DeviceFailedEnumeration, 

        DeviceGeneralFailure, 

        DeviceCausedOvercurrent, 

        DeviceNotEnoughPower, 

        DeviceNotEnoughBandwidth, 

        DeviceHubNestedTooDeeply, 

        DeviceInLegacyHub 

    } 

 

    public enum USB_DEVICE_SPEED : byte 

    { 

        UsbLowSpeed,    // 低速USB 1.1 

        UsbFullSpeed,   // 全速USB 1.1 

        UsbHighSpeed,   // 高速USB 2.0 

        UsbSuperSpeed   // 极速USB 3.0 

    } 

    #endregion 

 

    public partial class USB 

    { 

        internal const Int32 IOCTL_GET_HCD_DRIVERKEY_NAME = 0x220424; 

        internal const Int32 IOCTL_USB_GET_ROOT_HUB_NAME = 0x220408; 

        internal const Int32 IOCTL_USB_GET_NODE_CONNECTION_NAME = 0x220414; 

        internal const Int32 IOCTL_USB_GET_NODE_INFORMATION = 0x220408; 

        internal const Int32 IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX = 0x220448; 

        internal const Int32 IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION = 0x220410; 

 

        internal const Int32 MAXIMUM_USB_STRING_LENGTH = 255; 

        internal const Int32 USB_STRING_DESCRIPTOR_TYPE = 3; 

 

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] 

        internal struct USB_HCD_DRIVERKEY_NAME 

        { 

            public Int32 ActualLength; 

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] 

            public String Name; 

        } 

 

        #region USB_NODE_INFORMATION 

        [StructLayout(LayoutKind.Sequential, Pack = 1)] 

        internal struct USB_HUB_DESCRIPTOR 

        { 

            public Byte bDescriptorLength; 

            public Byte bDescriptorType;    // 描述符类型:0x29 

            public Byte bNumberOfPorts;     // 支持的下游端口数目 

            public Int16 wHubCharacteristics;   // 特征描述 

            public Byte bPowerOnToPowerGood;    // 从端口加电到端口正常工作的时间间隔(以2ms为单位) 

            public Byte bHubControlCurrent;     // 设备所需最大电流 

            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)] 

            public Byte[] bRemoveAndPowerMask;  // 指示连接在集线器端口的设备是否可移走 

        } 

 

        [StructLayout(LayoutKind.Sequential)] 

        internal struct USB_HUB_INFORMATION 

        { 

            public USB_HUB_DESCRIPTOR HubDescriptor; 

            public Byte HubIsBusPowered; 

        } 

 

        [StructLayout(LayoutKind.Sequential)] 

        internal struct USB_MI_PARENT_INFORMATION 

        { 

            public Int32 NumberOfInterfaces; 

        }; 

         

        [StructLayout(LayoutKind.Explicit)] 

        internal struct UsbNodeUnion 

        { 

            [FieldOffset(0)] 

            public USB_HUB_INFORMATION HubInformation; 

            [FieldOffset(0)] 

            public USB_MI_PARENT_INFORMATION MiParentInformation; 

  &nbs

补充:软件开发 , C# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,