Mercurial > hg > ucis.core
annotate USBLib/Windows/USB/UsbDevice.cs @ 58:fd63c453ff65
Improved Windows USB enumeration classes
author | Ivo Smits <Ivo@UCIS.nl> |
---|---|
date | Wed, 09 Oct 2013 20:54:15 +0200 |
parents | 5b14fed54a89 |
children | 3424fa5a12c9 |
rev | line source |
---|---|
21 | 1 using System; |
2 using System.Collections.Generic; | |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
3 using System.ComponentModel; |
21 | 4 using System.Runtime.InteropServices; |
5 using System.Text; | |
6 using Microsoft.Win32.SafeHandles; | |
22 | 7 using UCIS.HWLib.Windows.Devices; |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
8 using UCIS.USBLib.Communication; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
9 using UCIS.USBLib.Descriptor; |
21 | 10 using UCIS.USBLib.Internal.Windows; |
11 | |
12 namespace UCIS.HWLib.Windows.USB { | |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
13 public class UsbDevice : IUsbInterface { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
14 internal static SafeFileHandle OpenHandle(String path) { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
15 SafeFileHandle handle = Kernel32.CreateFile(path, Kernel32.GENERIC_WRITE, Kernel32.FILE_SHARE_WRITE, IntPtr.Zero, Kernel32.OPEN_EXISTING, 0, IntPtr.Zero); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
16 if (handle.IsInvalid) throw new Win32Exception(Marshal.GetLastWin32Error()); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
17 return handle; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
18 } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
19 internal static Boolean GetNodeInformation(SafeFileHandle handle, out USB_NODE_INFORMATION nodeInfo) { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
20 nodeInfo = new USB_NODE_INFORMATION(); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
21 int nBytes = Marshal.SizeOf(typeof(USB_NODE_INFORMATION)); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
22 return Kernel32.DeviceIoControl(handle, UsbApi.IOCTL_USB_GET_NODE_INFORMATION, ref nodeInfo, nBytes, out nodeInfo, nBytes, out nBytes, IntPtr.Zero); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
23 } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
24 internal static Boolean GetNodeConnectionInformation(SafeFileHandle handle, UInt32 port, out USB_NODE_CONNECTION_INFORMATION_EX nodeConnection) { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
25 int nBytes = Marshal.SizeOf(typeof(USB_NODE_CONNECTION_INFORMATION_EX)); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
26 nodeConnection = new USB_NODE_CONNECTION_INFORMATION_EX(); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
27 nodeConnection.ConnectionIndex = port; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
28 if (!Kernel32.DeviceIoControl(handle, UsbApi.IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX, ref nodeConnection, nBytes, out nodeConnection, nBytes, out nBytes, IntPtr.Zero)) |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
29 throw new Win32Exception(Marshal.GetLastWin32Error()); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
30 return true; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
31 } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
32 internal static String GetNodeConnectionName(SafeFileHandle handle, UInt32 port) { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
33 int nBytes = Marshal.SizeOf(typeof(USB_NODE_CONNECTION_NAME)); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
34 USB_NODE_CONNECTION_NAME nameConnection = new USB_NODE_CONNECTION_NAME(); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
35 nameConnection.ConnectionIndex = port; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
36 if (!Kernel32.DeviceIoControl(handle, UsbApi.IOCTL_USB_GET_NODE_CONNECTION_NAME, ref nameConnection, nBytes, out nameConnection, nBytes, out nBytes, IntPtr.Zero)) |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
37 throw new Win32Exception(Marshal.GetLastWin32Error()); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
38 return nameConnection.NodeName; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
39 } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
40 internal unsafe static int GetDescriptor(SafeFileHandle handle, UInt32 port, byte descriptorType, byte index, short langId, byte[] buffer, int offset, int length) { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
41 int szRequest = Marshal.SizeOf(typeof(USB_DESCRIPTOR_REQUEST)); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
42 USB_DESCRIPTOR_REQUEST request = new USB_DESCRIPTOR_REQUEST(); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
43 request.ConnectionIndex = port; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
44 request.SetupPacket.wValue = (ushort)((descriptorType << 8) + index); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
45 request.SetupPacket.wIndex = (ushort)langId; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
46 request.SetupPacket.wLength = (ushort)length; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
47 int nBytes = length + szRequest; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
48 Byte[] bigbuffer = new Byte[nBytes]; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
49 if (!Kernel32.DeviceIoControl(handle, UsbApi.IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, ref request, Marshal.SizeOf(typeof(USB_DESCRIPTOR_REQUEST)), bigbuffer, nBytes, out nBytes, IntPtr.Zero)) { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
50 int err = Marshal.GetLastWin32Error(); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
51 if (err != 2 && err != 31 && err != 87) throw new Win32Exception(err); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
52 return 0; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
53 } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
54 nBytes -= szRequest; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
55 if (nBytes > length) nBytes = length; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
56 if (nBytes < 0) return 0; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
57 if (nBytes > 0) Buffer.BlockCopy(bigbuffer, szRequest, buffer, offset, nBytes); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
58 return nBytes; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
59 } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
60 internal unsafe static String GetRootHubName(SafeFileHandle handle) { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
61 USB_ROOT_HUB_NAME rootHubName = new USB_ROOT_HUB_NAME(); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
62 int nBytesReturned; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
63 if (!Kernel32.DeviceIoControl(handle, UsbApi.IOCTL_USB_GET_ROOT_HUB_NAME, IntPtr.Zero, 0, out rootHubName, Marshal.SizeOf(rootHubName), out nBytesReturned, IntPtr.Zero)) |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
64 throw new Win32Exception(Marshal.GetLastWin32Error()); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
65 if (rootHubName.ActualLength <= 0) return null; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
66 return rootHubName.RootHubName; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
67 } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
68 internal unsafe static String GetNodeConnectionDriverKey(SafeFileHandle handle, UInt32 port) { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
69 USB_NODE_CONNECTION_DRIVERKEY_NAME DriverKeyStruct = new USB_NODE_CONNECTION_DRIVERKEY_NAME(); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
70 int nBytes = Marshal.SizeOf(DriverKeyStruct); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
71 DriverKeyStruct.ConnectionIndex = port; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
72 if (!Kernel32.DeviceIoControl(handle, UsbApi.IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME, ref DriverKeyStruct, nBytes, out DriverKeyStruct, nBytes, out nBytes, IntPtr.Zero)) |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
73 return null; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
74 return DriverKeyStruct.DriverKeyName; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
75 } |
21 | 76 |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
77 public UsbDevice Parent { get; protected set; } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
78 public string DevicePath { get; private set; } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
79 public uint AdapterNumber { get; private set; } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
80 internal USB_NODE_CONNECTION_INFORMATION_EX NodeConnectionInfo { get; set; } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
81 internal USB_DEVICE_DESCRIPTOR DeviceDescriptor { get { return NodeConnectionInfo.DeviceDescriptor; } } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
82 |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
83 public bool IsHub { get { return NodeConnectionInfo.DeviceIsHub != 0; } } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
84 public bool IsConnected { get { return NodeConnectionInfo.ConnectionStatus == USB_CONNECTION_STATUS.DeviceConnected; } } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
85 public string Status { get { return NodeConnectionInfo.ConnectionStatus.ToString(); } } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
86 public string Speed { get { return NodeConnectionInfo.Speed.ToString(); } } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
87 |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
88 SafeFileHandle OpenHandle() { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
89 return OpenHandle(DevicePath); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
90 } |
21 | 91 |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
92 public int NumConfigurations { get { return DeviceDescriptor == null ? 0 : DeviceDescriptor.bNumConfigurations; } } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
93 public int VendorID { get { return DeviceDescriptor == null ? 0 : DeviceDescriptor.idVendor; } } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
94 public int ProductID { get { return DeviceDescriptor == null ? 0 : DeviceDescriptor.idProduct; } } |
21 | 95 |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
96 private String GetStringSafe(Byte id) { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
97 if (id == 0) return null; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
98 String s = GetStringDescriptor(id); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
99 if (s == null) return s; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
100 return s.Trim(' ', '\0'); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
101 } |
21 | 102 |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
103 public string Manufacturer { get { return DeviceDescriptor == null ? null : GetStringSafe(DeviceDescriptor.iManufacturer); } } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
104 public string Product { get { return DeviceDescriptor == null ? null : GetStringSafe(DeviceDescriptor.iProduct); } } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
105 public string SerialNumber { get { return DeviceDescriptor == null ? null : GetStringSafe(DeviceDescriptor.iSerialNumber); } } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
106 public virtual string DriverKey { get { using (SafeFileHandle handle = OpenHandle(DevicePath)) return UsbHub.GetNodeConnectionDriverKey(handle, AdapterNumber); } } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
107 |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
108 public virtual string DeviceDescription { get { return DeviceNode == null ? null : DeviceNode.GetPropertyString(CMRDP.DEVICEDESC); } } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
109 public string DeviceID { get { return DeviceNode == null ? null : DeviceNode.DeviceID; } } |
21 | 110 |
111 private DeviceNode mDeviceNode; | |
112 public DeviceNode DeviceNode { | |
113 get { | |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
114 String dk = DriverKey; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
115 if (mDeviceNode == null && dk != null) { |
21 | 116 foreach (DeviceNode node in DeviceNode.GetDevices("USB")) { |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
117 if (dk.Equals(node.DriverKey, StringComparison.InvariantCultureIgnoreCase)) { |
21 | 118 mDeviceNode = node; |
119 break; | |
120 } | |
121 } | |
122 } | |
123 return mDeviceNode; | |
124 } | |
125 } | |
126 | |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
127 internal UsbDevice(UsbDevice parent, USB_NODE_CONNECTION_INFORMATION_EX nci, uint port, string devicePath) { |
21 | 128 this.Parent = parent; |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
129 this.NodeConnectionInfo = nci; |
21 | 130 this.DevicePath = devicePath; |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
131 this.AdapterNumber = port; |
21 | 132 if (devicePath == null) return; |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
133 } |
21 | 134 |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
135 private String GetStringDescriptor(Byte index) { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
136 return UsbStringDescriptor.GetStringFromDevice(this, index, 0); //0x409 |
21 | 137 } |
138 | |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
139 static UsbDevice GetUsbDevice(DeviceNode node, out Boolean isHostController) { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
140 String[] hciinterface = node.GetInterfaces(UsbApi.GUID_DEVINTERFACE_USB_HOST_CONTROLLER); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
141 if (hciinterface != null && hciinterface.Length > 0) { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
142 isHostController = true; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
143 return (new UsbController(null, node, hciinterface[0])).RootHub; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
144 } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
145 isHostController = false; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
146 DeviceNode parent = node.GetParent(); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
147 Boolean isHostControllerA; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
148 UsbDevice usbdev = GetUsbDevice(parent, out isHostControllerA); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
149 if (isHostControllerA) return usbdev; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
150 UsbHub usbhub = usbdev as UsbHub; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
151 if (usbhub == null) return null; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
152 String driverkey = node.DriverKey; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
153 foreach (UsbDevice child in usbhub.Devices) { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
154 if (driverkey.Equals(child.DriverKey, StringComparison.InvariantCultureIgnoreCase)) return child; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
155 } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
156 return null; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
157 } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
158 public static UsbDevice GetUsbDevice(DeviceNode node) { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
159 Boolean isHostController; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
160 return GetUsbDevice(node, out isHostController); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
161 /* |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
162 |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
163 String[] hubinterface = node.GetInterfaces(UsbApi.GUID_DEVINTERFACE_USB_HUB); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
164 if (hubinterface != null && hubinterface.Length > 0) { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
165 USB_NODE_CONNECTION_INFORMATION_EX nodeConnection; |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
166 using (SafeFileHandle handle = OpenHandle(hubinterface[0])) { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
167 if (!GetNodeConnectionInformation(handle, 0, out nodeConnection)) return null; |
21 | 168 } |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
169 return new UsbHub(null, nodeConnection, hubinterface[0], false); |
21 | 170 } |
171 String[] devinterface = node.GetInterfaces(UsbApi.GUID_DEVINTERFACE_USB_DEVICE); | |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
172 if (devinterface == null || devinterface.Length == 0) return null; |
21 | 173 DeviceNode parent = node.GetParent(); |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
174 if (parent == null) return null; |
21 | 175 UsbHub usbhub = GetUsbDevice(parent) as UsbHub; |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
176 if (usbhub == null) return null; |
21 | 177 String driverkey = node.DriverKey; |
178 foreach (UsbDevice usbdev in usbhub.Devices) { | |
179 if (driverkey.Equals(usbdev.DriverKey, StringComparison.InvariantCultureIgnoreCase)) return usbdev; | |
180 } | |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
181 return null;*/ |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
182 } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
183 |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
184 #region IUsbInterface Members |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
185 byte IUsbInterface.Configuration { get { throw new NotImplementedException(); } } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
186 void IUsbInterface.Close() { } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
187 public virtual int GetDescriptor(byte descriptorType, byte index, short langId, byte[] buffer, int offset, int length) { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
188 using (SafeFileHandle handle = UsbHub.OpenHandle(DevicePath)) return UsbHub.GetDescriptor(handle, AdapterNumber, descriptorType, index, langId, buffer, offset, length); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
189 } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
190 string IUsbInterface.GetString(short langId, byte stringIndex) { |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
191 return UsbStringDescriptor.GetStringFromDevice(this, stringIndex, langId); |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
192 } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
193 int IUsbInterface.BulkWrite(byte endpoint, byte[] buffer, int offset, int length) { throw new NotImplementedException(); } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
194 int IUsbInterface.BulkRead(byte endpoint, byte[] buffer, int offset, int length) { throw new NotImplementedException(); } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
195 void IUsbInterface.BulkReset(byte endpoint) { throw new NotImplementedException(); } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
196 int IUsbInterface.InterruptWrite(byte endpoint, byte[] buffer, int offset, int length) { throw new NotImplementedException(); } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
197 int IUsbInterface.InterruptRead(byte endpoint, byte[] buffer, int offset, int length) { throw new NotImplementedException(); } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
198 void IUsbInterface.InterruptReset(byte endpoint) { throw new NotImplementedException(); } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
199 int IUsbInterface.ControlWrite(UsbControlRequestType requestType, byte request, short value, short index, byte[] buffer, int offset, int length) { throw new NotImplementedException(); } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
200 int IUsbInterface.ControlRead(UsbControlRequestType requestType, byte request, short value, short index, byte[] buffer, int offset, int length) { throw new NotImplementedException(); } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
201 UsbPipeStream IUsbInterface.GetBulkStream(byte endpoint) { throw new NotImplementedException(); } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
202 UsbPipeStream IUsbInterface.GetInterruptStream(byte endpoint) { throw new NotImplementedException(); } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
203 void IDisposable.Dispose() { } |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
204 #endregion |
21 | 205 } |
58
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
206 |
fd63c453ff65
Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents:
22
diff
changeset
|
207 } |