C#:USB裝置枚舉(一)DeviceIoControl的PInvoke

來源:互聯網
上載者:User
 
/* ----------------------------------------------------------檔案名稱:DeviceIoControl.cs作者:秦建輝MSN:splashcn@msn.comQQ:36748897部落格:http://blog.csdn.net/jhqin開發環境:    Visual Studio V2010    .NET Framework 4 Client Profile版本曆史:    V1.02011年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;        }        [StructLayout(LayoutKind.Sequential)]        internal struct USB_NODE_INFORMATION        {            public USB_HUB_NODE NodeType;            public UsbNodeUnion u;        }        #endregion        #region USB_NODE_CONNECTION_INFORMATION        [StructLayout(LayoutKind.Sequential, Pack = 1)]        internal struct USB_DEVICE_DESCRIPTOR        {            public Byte bLength;            public Byte bDescriptorType;            public UInt16 bcdUSB;            public Byte bDeviceClass;            public Byte bDeviceSubClass;            public Byte bDeviceProtocol;            public Byte bMaxPacketSize0;            public UInt16 idVendor;            public UInt16 idProduct;            public UInt16 bcdDevice;            public Byte iManufacturer;            public Byte iProduct;            public Byte iSerialNumber;            public Byte bNumConfigurations;        }               [StructLayout(LayoutKind.Sequential, Pack = 1)]        internal struct USB_ENDPOINT_DESCRIPTOR        {            public Byte bLength;            public Byte bDescriptorType;            public Byte bEndpointAddress;            public Byte bmAttributes;            public UInt16 wMaxPacketSize;            public Byte bInterval;        }        [StructLayout(LayoutKind.Sequential, Pack = 1)]        internal struct USB_PIPE_INFO        {            public USB_ENDPOINT_DESCRIPTOR EndpointDescriptor;            public UInt32 ScheduleOffset;        }        [StructLayout(LayoutKind.Sequential, Pack = 1)]        internal struct USB_NODE_CONNECTION_INFORMATION_EX        {            public Int32 ConnectionIndex;            public USB_DEVICE_DESCRIPTOR DeviceDescriptor;            public Byte CurrentConfigurationValue;            public Byte Speed;            public Byte DeviceIsHub;            public Int16 DeviceAddress;            public Int32 NumberOfOpenPipes;            public USB_CONNECTION_STATUS ConnectionStatus;            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]            public USB_PIPE_INFO[] PipeList;        }        #endregion        #region USB_DESCRIPTOR_REQUEST        [StructLayout(LayoutKind.Sequential)]        internal struct USB_SETUP_PACKET        {            public Byte bmRequest;            public Byte bRequest;            public UInt16 wValue;            public UInt16 wIndex;            public UInt16 wLength;        }        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]        internal struct USB_STRING_DESCRIPTOR        {            public Byte bLength;            public Byte bDescriptorType;            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAXIMUM_USB_STRING_LENGTH)]            public String bString;        }        [StructLayout(LayoutKind.Sequential)]        internal struct USB_DESCRIPTOR_REQUEST        {            public Int32 ConnectionIndex;            public USB_SETUP_PACKET SetupPacket;                   public USB_STRING_DESCRIPTOR Data;        }        #endregion        #region USB_NODE_CONNECTION_DRIVERKEY_NAME        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]        internal struct USB_NODE_CONNECTION_DRIVERKEY_NAME        {            public Int32 ConnectionIndex;            public Int32 ActualLength;            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAXIMUM_USB_STRING_LENGTH)]            public String DriverKeyName;        }        #endregion        #region DeviceIoControl        [DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true)]        internal static extern Boolean DeviceIoControl(            IntPtr hFile,            Int32 dwIoControlCode,            IntPtr lpInBuffer,            Int32 nInBufferSize,            ref USB_HCD_DRIVERKEY_NAME lpOutBuffer,            Int32 nOutBufferSize,            out Int32 nBytesReturned,            IntPtr lpOverlapped            );        [DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true)]        internal static extern Boolean DeviceIoControl(            IntPtr hFile,            Int32 dwIoControlCode,            ref USB_NODE_INFORMATION lpInBuffer,            Int32 nInBufferSize,            ref USB_NODE_INFORMATION lpOutBuffer,            Int32 nOutBufferSize,            out Int32 lpBytesReturned,            IntPtr lpOverlapped            );        [DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true)]        internal static extern Boolean DeviceIoControl(            IntPtr hFile,            Int32 dwIoControlCode,            ref USB_NODE_CONNECTION_INFORMATION_EX lpInBuffer,            Int32 nInBufferSize,            ref USB_NODE_CONNECTION_INFORMATION_EX lpOutBuffer,            Int32 nOutBufferSize,            out Int32 lpBytesReturned,            IntPtr lpOverlapped            );        [DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true)]        internal static extern Boolean DeviceIoControl(            IntPtr hFile,            Int32 dwIoControlCode,            ref USB_DESCRIPTOR_REQUEST lpInBuffer,            Int32 nInBufferSize,            ref USB_DESCRIPTOR_REQUEST lpOutBuffer,            Int32 nOutBufferSize,            out Int32 lpBytesReturned,            IntPtr lpOverlapped            );        [DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true)]        internal static extern Boolean DeviceIoControl(            IntPtr hFile,            Int32 dwIoControlCode,            ref USB_NODE_CONNECTION_DRIVERKEY_NAME lpInBuffer,            Int32 nInBufferSize,            ref USB_NODE_CONNECTION_DRIVERKEY_NAME lpOutBuffer,            Int32 nOutBufferSize,            out Int32 lpBytesReturned,            IntPtr lpOverlapped            );        #endregion    }}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.