/// <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); }
/// <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()); } }