/// <summary>
        /// 增加端口节点
        /// </summary>
        /// <param name="HubNode">集线器节点</param>
        /// <param name="NodeConnectionInfo">USB设备节点连接信息</param>
        private static void AddPortNode(XElement HubNode, UsbNodeConnectionInformation NodeConnectionInfo)
        {
            String DevicePath      = NodeConnectionInfo.DevicePath;
            Int32  ConnectionIndex = NodeConnectionInfo.ConnectionIndex;
            USB_CONNECTION_STATUS ConnectionStatus = NodeConnectionInfo.ConnectionStatus;

            // 创建端口节点
            XElement PortNode = new XElement("Port" + ConnectionIndex,
                                             new XAttribute("DevicePath", DevicePath),
                                             new XAttribute("ConnectionIndex", ConnectionIndex),
                                             new XAttribute("ConnectionStatus", NodeConnectionInfo.ConnectionStatus)
                                             );

            if (ConnectionStatus == USB_CONNECTION_STATUS.DeviceConnected)
            {
                Boolean DeviceIsHub = NodeConnectionInfo.DeviceIsHub;
                PortNode.Add(new XAttribute("DeviceIsHub", DeviceIsHub),
                             new XAttribute("CurrentConfigurationValue", NodeConnectionInfo.CurrentConfigurationValue),
                             new XAttribute("Speed", NodeConnectionInfo.Speed),
                             new XAttribute("DeviceAddress", NodeConnectionInfo.DeviceAddress),
                             new XAttribute("NumberOfOpenPipes", NodeConnectionInfo.NumberOfOpenPipes)
                             );

                // 设备描述符信息
                AddDeviceDescriptorNode(PortNode, ref NodeConnectionInfo.DeviceDescriptor);

                // 管道信息
                AddPipeInfoNode(PortNode, ref NodeConnectionInfo.PipeList);

                // 外部集线器
                if (DeviceIsHub)
                {   // 获取外部Hub设备路径
                    String ExternalHubPath = GetExternalHubPath(DevicePath, ConnectionIndex);

                    // 增加外部集线器节点
                    AddHubNode(PortNode, ExternalHubPath, "ExternalHub");
                }
            }

            HubNode.Add(PortNode);
        }
Beispiel #2
0
        /// <summary>
        /// 获取USB节点连接信息
        /// </summary>
        /// <param name="DevicePath">设备路径</param>
        /// <param name="NumberOfPorts">端口总数</param>
        /// <returns>USB节点信息连接信息集合</returns>
        public static UsbNodeConnectionInformation[] GetUsbNodeConnectionInformation(String DevicePath, Int32 NumberOfPorts)
        {
            if (String.IsNullOrEmpty(DevicePath))
            {
                return(null);
            }

            // 打开设备文件
            IntPtr hHubDevice = Kernel32.CreateFile(
                "\\\\.\\" + DevicePath,
                NativeFileAccess.GENERIC_WRITE,
                NativeFileShare.FILE_SHARE_WRITE,
                IntPtr.Zero,
                NativeFileMode.OPEN_EXISTING,
                IntPtr.Zero,
                IntPtr.Zero);

            if (hHubDevice == Kernel32.INVALID_HANDLE_VALUE)
            {
                return(null);
            }

            List <UsbNodeConnectionInformation> NodeCollection = new List <UsbNodeConnectionInformation>();

            // 枚举端口
            USB_NODE_CONNECTION_INFORMATION_EX Buffer = new USB_NODE_CONNECTION_INFORMATION_EX();

            for (Int32 ConnectionIndex = 1; ConnectionIndex <= NumberOfPorts; ConnectionIndex++)
            {
                // 查询节点信息
                Int32 nBytesReturned;
                Buffer.ConnectionIndex = ConnectionIndex;
                Boolean Status = DeviceIoControl(hHubDevice,
                                                 IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX,
                                                 ref Buffer,
                                                 Marshal.SizeOf(Buffer),
                                                 ref Buffer,
                                                 Marshal.SizeOf(Buffer),
                                                 out nBytesReturned,
                                                 IntPtr.Zero);
                if (Status)
                {
                    // 确定语言ID
                    UInt16 LanguageID = SelectLanguageID(hHubDevice, ConnectionIndex);

                    // 提取信息
                    UsbNodeConnectionInformation Node = new UsbNodeConnectionInformation();

                    Node.DevicePath       = DevicePath;
                    Node.ConnectionIndex  = Buffer.ConnectionIndex;
                    Node.ConnectionStatus = Buffer.ConnectionStatus;
                    if (Buffer.ConnectionStatus == USB_CONNECTION_STATUS.DeviceConnected)
                    {
                        Node.CurrentConfigurationValue = Buffer.CurrentConfigurationValue;
                        Node.Speed             = Buffer.Speed;
                        Node.DeviceIsHub       = Convert.ToBoolean(Buffer.DeviceIsHub);
                        Node.DeviceAddress     = Buffer.DeviceAddress;
                        Node.NumberOfOpenPipes = Buffer.NumberOfOpenPipes;

                        // 设备描述符
                        Node.DeviceDescriptor.bDescriptorType = Buffer.DeviceDescriptor.bDescriptorType;
                        Node.DeviceDescriptor.bDeviceClass    = Buffer.DeviceDescriptor.bDeviceClass;
                        Node.DeviceDescriptor.bDeviceSubClass = Buffer.DeviceDescriptor.bDeviceSubClass;
                        Node.DeviceDescriptor.bDeviceProtocol = Buffer.DeviceDescriptor.bDeviceProtocol;

                        Node.DeviceDescriptor.UsbVersion    = BcdVersionToString(Buffer.DeviceDescriptor.bcdUSB);    // USB版本号
                        Node.DeviceDescriptor.DeviceVersion = BcdVersionToString(Buffer.DeviceDescriptor.bcdDevice); // 设备版本号

                        Node.DeviceDescriptor.idVendor  = Buffer.DeviceDescriptor.idVendor;                          // 厂商标识
                        Node.DeviceDescriptor.idProduct = Buffer.DeviceDescriptor.idProduct;                         // 产品标识

                        if (LanguageID != 0)
                        {
                            if (Buffer.DeviceDescriptor.iSerialNumber != 0)
                            {   // 序列号
                                Node.DeviceDescriptor.SerialNumber = GetStringDescriptor(hHubDevice,
                                                                                         Buffer.ConnectionIndex,
                                                                                         Buffer.DeviceDescriptor.iSerialNumber,
                                                                                         LanguageID);
                            }

                            if (Buffer.DeviceDescriptor.iManufacturer != 0)
                            {   // 制造商名称
                                Node.DeviceDescriptor.Manufacturer = GetStringDescriptor(hHubDevice,
                                                                                         Buffer.ConnectionIndex,
                                                                                         Buffer.DeviceDescriptor.iManufacturer,
                                                                                         LanguageID);
                            }

                            if (Buffer.DeviceDescriptor.iProduct != 0)
                            {   // 产品名称
                                Node.DeviceDescriptor.Product = GetStringDescriptor(hHubDevice,
                                                                                    Buffer.ConnectionIndex,
                                                                                    Buffer.DeviceDescriptor.iProduct,
                                                                                    LanguageID);
                            }
                        }

                        Node.DeviceDescriptor.bMaxPacketSize0    = Buffer.DeviceDescriptor.bMaxPacketSize0;
                        Node.DeviceDescriptor.bNumConfigurations = Buffer.DeviceDescriptor.bNumConfigurations;

                        // 管道信息
                        Node.PipeList = new List <UsbPipeInfo>();
                        for (Int32 PipeIndex = 0; PipeIndex < Buffer.NumberOfOpenPipes; PipeIndex++)
                        {
                            UsbPipeInfo PipeInfo;

                            PipeInfo.ScheduleOffset   = Buffer.PipeList[PipeIndex].ScheduleOffset;
                            PipeInfo.bDescriptorType  = Buffer.PipeList[PipeIndex].EndpointDescriptor.bDescriptorType;
                            PipeInfo.bEndpointAddress = Buffer.PipeList[PipeIndex].EndpointDescriptor.bEndpointAddress;
                            PipeInfo.bmAttributes     = Buffer.PipeList[PipeIndex].EndpointDescriptor.bmAttributes;
                            PipeInfo.wMaxPacketSize   = Buffer.PipeList[PipeIndex].EndpointDescriptor.wMaxPacketSize;
                            PipeInfo.bInterval        = Buffer.PipeList[PipeIndex].EndpointDescriptor.bInterval;

                            Node.PipeList.Add(PipeInfo);
                        }
                    }

                    NodeCollection.Add(Node);
                }
            }

            // 关闭设备文件
            Kernel32.CloseHandle(hHubDevice);

            // 返回结果
            if (NodeCollection.Count == 0)
            {
                return(null);
            }
            else
            {
                return(NodeCollection.ToArray());
            }
        }