annotate USBLib/Windows/USB/UsbDevice.cs @ 87:9b898d8b2541

Small improvements in Windows USB device handling
author Ivo Smits <Ivo@UCIS.nl>
date Thu, 05 Jun 2014 00:46:15 +0200
parents e811297f5aa4
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21
dcfec2be27c9 Added USBLib
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1 using System;
58
fd63c453ff65 Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents: 22
diff changeset
2 using System.ComponentModel;
21
dcfec2be27c9 Added USBLib
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
3 using System.Runtime.InteropServices;
dcfec2be27c9 Added USBLib
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
4 using Microsoft.Win32.SafeHandles;
22
5b14fed54a89 USBLib: cleanup
Ivo Smits <Ivo@UCIS.nl>
parents: 21
diff changeset
5 using UCIS.HWLib.Windows.Devices;
58
fd63c453ff65 Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents: 22
diff changeset
6 using UCIS.USBLib.Communication;
fd63c453ff65 Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents: 22
diff changeset
7 using UCIS.USBLib.Descriptor;
21
dcfec2be27c9 Added USBLib
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
8 using UCIS.USBLib.Internal.Windows;
dcfec2be27c9 Added USBLib
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
9
dcfec2be27c9 Added USBLib
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
10 namespace UCIS.HWLib.Windows.USB {
60
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 58
diff changeset
11 public class UsbDevice : IUsbDevice, IUsbInterface {
63
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
12 internal static USB_NODE_CONNECTION_INFORMATION_EX GetNodeConnectionInformation(SafeFileHandle handle, UInt32 port) {
58
fd63c453ff65 Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents: 22
diff changeset
13 int nBytes = Marshal.SizeOf(typeof(USB_NODE_CONNECTION_INFORMATION_EX));
63
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
14 USB_NODE_CONNECTION_INFORMATION_EX nodeConnection = new USB_NODE_CONNECTION_INFORMATION_EX();
58
fd63c453ff65 Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents: 22
diff changeset
15 nodeConnection.ConnectionIndex = port;
fd63c453ff65 Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents: 22
diff changeset
16 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
17 throw new Win32Exception(Marshal.GetLastWin32Error());
63
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
18 return nodeConnection;
58
fd63c453ff65 Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents: 22
diff changeset
19 }
21
dcfec2be27c9 Added USBLib
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
20
63
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
21 private Boolean HasNodeConnectionInfo = false;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
22 private USB_NODE_CONNECTION_INFORMATION_EX NodeConnectionInfo;
58
fd63c453ff65 Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents: 22
diff changeset
23
63
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
24 private void GetNodeConnectionInfo() {
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
25 if (HasNodeConnectionInfo) return;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
26 if (Parent == null) {
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
27 HasNodeConnectionInfo = true;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
28 return;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
29 }
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
30 using (SafeFileHandle handle = Parent.OpenHandle()) NodeConnectionInfo = GetNodeConnectionInformation(handle, AdapterNumber);
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
31 HasNodeConnectionInfo = true;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
32 }
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
33 internal void SetNodeConnectionInfo(USB_NODE_CONNECTION_INFORMATION_EX nci) {
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
34 NodeConnectionInfo = nci;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
35 HasNodeConnectionInfo = true;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
36 }
58
fd63c453ff65 Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents: 22
diff changeset
37
63
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
38 public UsbDeviceDescriptor DeviceDescriptor { get { GetNodeConnectionInfo(); return NodeConnectionInfo.DeviceDescriptor; } }
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
39
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
40 public bool IsHub { get { GetNodeConnectionInfo(); return NodeConnectionInfo.DeviceIsHub != 0; } }
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
41 public bool IsConnected { get { GetNodeConnectionInfo(); return NodeConnectionInfo.ConnectionStatus == USB_CONNECTION_STATUS.DeviceConnected; } }
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
42 public string Status { get { GetNodeConnectionInfo(); return NodeConnectionInfo.ConnectionStatus.ToString(); } }
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
43 public string Speed { get { GetNodeConnectionInfo(); return NodeConnectionInfo.Speed.ToString(); } }
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
44 public Byte CurrentConfigurationValue { get { GetNodeConnectionInfo(); return NodeConnectionInfo.CurrentConfigurationValue; } }
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
45 public UInt16 DeviceAddress { get { GetNodeConnectionInfo(); return NodeConnectionInfo.DeviceAddress; } }
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
46 public UInt32 NumberOfOpenPipes { get { GetNodeConnectionInfo(); return NodeConnectionInfo.NumberOfOpenPipes; } }
21
dcfec2be27c9 Added USBLib
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
47
62
edc41c861d96 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 61
diff changeset
48 public int NumConfigurations { get { return DeviceDescriptor.NumConfigurations; } }
edc41c861d96 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 61
diff changeset
49 public int VendorID { get { return DeviceDescriptor.VendorID; } }
edc41c861d96 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 61
diff changeset
50 public int ProductID { get { return DeviceDescriptor.ProductID; } }
21
dcfec2be27c9 Added USBLib
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
51
87
9b898d8b2541 Small improvements in Windows USB device handling
Ivo Smits <Ivo@UCIS.nl>
parents: 68
diff changeset
52 private short[] languages = null;
9b898d8b2541 Small improvements in Windows USB device handling
Ivo Smits <Ivo@UCIS.nl>
parents: 68
diff changeset
53
58
fd63c453ff65 Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents: 22
diff changeset
54 private String GetStringSafe(Byte id) {
fd63c453ff65 Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents: 22
diff changeset
55 if (id == 0) return null;
87
9b898d8b2541 Small improvements in Windows USB device handling
Ivo Smits <Ivo@UCIS.nl>
parents: 68
diff changeset
56 if (languages == null) {
9b898d8b2541 Small improvements in Windows USB device handling
Ivo Smits <Ivo@UCIS.nl>
parents: 68
diff changeset
57 Byte[] buff = new Byte[256];
9b898d8b2541 Small improvements in Windows USB device handling
Ivo Smits <Ivo@UCIS.nl>
parents: 68
diff changeset
58 int len = GetDescriptor((Byte)UsbDescriptorType.String, 0, 0, buff, 0, buff.Length);
9b898d8b2541 Small improvements in Windows USB device handling
Ivo Smits <Ivo@UCIS.nl>
parents: 68
diff changeset
59 if (len > 1) {
9b898d8b2541 Small improvements in Windows USB device handling
Ivo Smits <Ivo@UCIS.nl>
parents: 68
diff changeset
60 languages = new short[len / 2 - 1];
9b898d8b2541 Small improvements in Windows USB device handling
Ivo Smits <Ivo@UCIS.nl>
parents: 68
diff changeset
61 for (int i = 0; i < languages.Length; i++) languages[i] = BitConverter.ToInt16(buff, i * 2 + 2);
9b898d8b2541 Small improvements in Windows USB device handling
Ivo Smits <Ivo@UCIS.nl>
parents: 68
diff changeset
62 }
9b898d8b2541 Small improvements in Windows USB device handling
Ivo Smits <Ivo@UCIS.nl>
parents: 68
diff changeset
63 }
9b898d8b2541 Small improvements in Windows USB device handling
Ivo Smits <Ivo@UCIS.nl>
parents: 68
diff changeset
64 short language = (languages == null || languages.Length == 0) ? (short)0 : languages[0];
9b898d8b2541 Small improvements in Windows USB device handling
Ivo Smits <Ivo@UCIS.nl>
parents: 68
diff changeset
65 String s = UsbStringDescriptor.GetStringFromDevice(this, id, language);
58
fd63c453ff65 Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents: 22
diff changeset
66 if (s == null) return s;
fd63c453ff65 Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents: 22
diff changeset
67 return s.Trim(' ', '\0');
fd63c453ff65 Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents: 22
diff changeset
68 }
21
dcfec2be27c9 Added USBLib
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
69
62
edc41c861d96 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 61
diff changeset
70 public string Manufacturer { get { return GetStringSafe(DeviceDescriptor.ManufacturerStringID); } }
edc41c861d96 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 61
diff changeset
71 public string Product { get { return GetStringSafe(DeviceDescriptor.ProductStringID); } }
edc41c861d96 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 61
diff changeset
72 public string SerialNumber { get { return GetStringSafe(DeviceDescriptor.SerialNumberStringID); } }
63
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
73 public String DriverKey {
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
74 get {
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
75 if (mParent != null) {
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
76 using (SafeFileHandle handle = mParent.OpenHandle()) {
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
77 USB_NODE_CONNECTION_DRIVERKEY_NAME DriverKeyStruct = new USB_NODE_CONNECTION_DRIVERKEY_NAME();
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
78 int nBytes = Marshal.SizeOf(DriverKeyStruct);
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
79 DriverKeyStruct.ConnectionIndex = AdapterNumber;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
80 if (!Kernel32.DeviceIoControl(handle, UsbApi.IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME, ref DriverKeyStruct, nBytes, out DriverKeyStruct, nBytes, out nBytes, IntPtr.Zero))
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
81 return null;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
82 return DriverKeyStruct.DriverKeyName;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
83 }
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
84 }
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
85 if (mDeviceNode != null) return mDeviceNode.DriverKey;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
86 return null;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
87 }
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
88 }
58
fd63c453ff65 Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents: 22
diff changeset
89
60
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 58
diff changeset
90 public virtual string DeviceDescription { get { return DeviceNode == null ? null : DeviceNode.DeviceDescription; } }
58
fd63c453ff65 Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents: 22
diff changeset
91 public string DeviceID { get { return DeviceNode == null ? null : DeviceNode.DeviceID; } }
21
dcfec2be27c9 Added USBLib
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
92
63
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
93 protected DeviceNode mDeviceNode = null;
21
dcfec2be27c9 Added USBLib
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
94 public DeviceNode DeviceNode {
dcfec2be27c9 Added USBLib
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
95 get {
58
fd63c453ff65 Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents: 22
diff changeset
96 String dk = DriverKey;
fd63c453ff65 Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents: 22
diff changeset
97 if (mDeviceNode == null && dk != null) {
21
dcfec2be27c9 Added USBLib
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
98 foreach (DeviceNode node in DeviceNode.GetDevices("USB")) {
58
fd63c453ff65 Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents: 22
diff changeset
99 if (dk.Equals(node.DriverKey, StringComparison.InvariantCultureIgnoreCase)) {
21
dcfec2be27c9 Added USBLib
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
100 mDeviceNode = node;
dcfec2be27c9 Added USBLib
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
101 break;
dcfec2be27c9 Added USBLib
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
102 }
dcfec2be27c9 Added USBLib
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
103 }
dcfec2be27c9 Added USBLib
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
104 }
dcfec2be27c9 Added USBLib
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
105 return mDeviceNode;
dcfec2be27c9 Added USBLib
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
106 }
dcfec2be27c9 Added USBLib
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
107 }
63
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
108 protected UsbHub mParent = null;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
109 private UInt32 mAdapterNumber = 0;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
110 private UsbHub GetParent() {
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
111 if (mParent == null && mDeviceNode != null) {
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
112 mParent = UsbHub.GetHubForDeviceNode(mDeviceNode.GetParent());
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
113 if (mParent != null) {
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
114 UsbDevice self = mParent.FindChildForDeviceNode(mDeviceNode);
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
115 if (self != null) mAdapterNumber = self.AdapterNumber;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
116 }
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
117 }
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
118 return mParent;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
119 }
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
120 public UsbHub Parent { get { return GetParent(); } }
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
121 public UInt32 AdapterNumber { get { GetParent(); return mAdapterNumber; } }
21
dcfec2be27c9 Added USBLib
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
122
63
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
123 internal UsbDevice(DeviceNode devnode, UsbHub parent, uint port) {
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
124 this.mDeviceNode = devnode;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
125 this.mParent = parent;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
126 this.mAdapterNumber = port;
58
fd63c453ff65 Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents: 22
diff changeset
127 }
21
dcfec2be27c9 Added USBLib
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
128
63
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
129 public static UsbDevice GetUsbDevice(DeviceNode node) {
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
130 if (node == null) return null;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
131 //UsbController controller = UsbController.GetControllerForDeviceNode(node);
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
132 //if (controller != null) return controller;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
133 UsbHub hub = UsbHub.GetHubForDeviceNode(node);
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
134 if (hub != null) return hub;
58
fd63c453ff65 Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents: 22
diff changeset
135 DeviceNode parent = node.GetParent();
61
2b24666cd759 Fixed errors in Windows USB enumeration and LibUsbDotNet configuration descriptor code
Ivo Smits <Ivo@UCIS.nl>
parents: 60
diff changeset
136 if (parent == null) return null;
63
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
137 if (parent.Service == "usbccgp") return GetUsbDevice(parent);
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
138 hub = UsbHub.GetHubForDeviceNode(parent);
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
139 if (hub == null) return null;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
140 return hub.FindChildForDeviceNode(node);
58
fd63c453ff65 Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents: 22
diff changeset
141 }
fd63c453ff65 Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents: 22
diff changeset
142
63
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
143 #region IUsbInterface and IUsbDevice Members
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
144 public int GetDescriptor(byte descriptorType, byte index, short langId, byte[] buffer, int offset, int length) {
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
145 using (SafeFileHandle handle = Parent.OpenHandle()) {
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
146 int szRequest = Marshal.SizeOf(typeof(USB_DESCRIPTOR_REQUEST));
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
147 USB_DESCRIPTOR_REQUEST request = new USB_DESCRIPTOR_REQUEST();
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
148 request.ConnectionIndex = AdapterNumber;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
149 request.SetupPacket.Value = (short)((descriptorType << 8) + index);
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
150 request.SetupPacket.Index = (short)langId;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
151 request.SetupPacket.Length = (short)length;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
152 int nBytes = length + szRequest;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
153 Byte[] bigbuffer = new Byte[nBytes];
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
154 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)) {
68
e811297f5aa4 Updated USBLib: removed old LibUsbDotNet compatibility code and added new information helper classes
Ivo Smits <Ivo@UCIS.nl>
parents: 67
diff changeset
155 if (descriptorType == (Byte)UsbDescriptorType.Device && index == 0 && langId == 0) {
e811297f5aa4 Updated USBLib: removed old LibUsbDotNet compatibility code and added new information helper classes
Ivo Smits <Ivo@UCIS.nl>
parents: 67
diff changeset
156 Byte[] descbytes = DeviceDescriptor.GetBytes();
e811297f5aa4 Updated USBLib: removed old LibUsbDotNet compatibility code and added new information helper classes
Ivo Smits <Ivo@UCIS.nl>
parents: 67
diff changeset
157 length = Math.Min(descbytes.Length, length);
e811297f5aa4 Updated USBLib: removed old LibUsbDotNet compatibility code and added new information helper classes
Ivo Smits <Ivo@UCIS.nl>
parents: 67
diff changeset
158 Array.Copy(descbytes, 0, buffer, 0, length);
e811297f5aa4 Updated USBLib: removed old LibUsbDotNet compatibility code and added new information helper classes
Ivo Smits <Ivo@UCIS.nl>
parents: 67
diff changeset
159 return length;
e811297f5aa4 Updated USBLib: removed old LibUsbDotNet compatibility code and added new information helper classes
Ivo Smits <Ivo@UCIS.nl>
parents: 67
diff changeset
160 }
63
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
161 int err = Marshal.GetLastWin32Error();
68
e811297f5aa4 Updated USBLib: removed old LibUsbDotNet compatibility code and added new information helper classes
Ivo Smits <Ivo@UCIS.nl>
parents: 67
diff changeset
162 if (err != 31) throw new Win32Exception(err);
63
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
163 return 0;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
164 }
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
165 nBytes -= szRequest;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
166 if (nBytes > length) nBytes = length;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
167 if (nBytes < 0) return 0;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
168 if (nBytes > 0) Buffer.BlockCopy(bigbuffer, szRequest, buffer, offset, nBytes);
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
169 return nBytes;
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
170 }
309c705d7460 Updates and cleanup in Windows USB enumeration code
Ivo Smits <Ivo@UCIS.nl>
parents: 62
diff changeset
171 }
65
abe0d55a2201 Removed some redundant USB communication code
Ivo Smits <Ivo@UCIS.nl>
parents: 63
diff changeset
172 byte IUsbInterface.Configuration { get { return CurrentConfigurationValue; } }
abe0d55a2201 Removed some redundant USB communication code
Ivo Smits <Ivo@UCIS.nl>
parents: 63
diff changeset
173 byte IUsbDevice.Configuration { get { return CurrentConfigurationValue; } set { throw new NotSupportedException(); } }
abe0d55a2201 Removed some redundant USB communication code
Ivo Smits <Ivo@UCIS.nl>
parents: 63
diff changeset
174 void IUsbDevice.ResetDevice() { throw new NotImplementedException(); }
abe0d55a2201 Removed some redundant USB communication code
Ivo Smits <Ivo@UCIS.nl>
parents: 63
diff changeset
175 IUsbDeviceRegistry IUsbDevice.Registry { get { throw new NotImplementedException(); } }
58
fd63c453ff65 Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents: 22
diff changeset
176 void IUsbInterface.Close() { }
67
2d16447eff12 Simplified USB communication code, added functions to abort pipe transfers
Ivo Smits <Ivo@UCIS.nl>
parents: 65
diff changeset
177 int IUsbInterface.PipeTransfer(byte endpoint, byte[] buffer, int offset, int length) { throw new NotSupportedException(); }
2d16447eff12 Simplified USB communication code, added functions to abort pipe transfers
Ivo Smits <Ivo@UCIS.nl>
parents: 65
diff changeset
178 void IUsbInterface.PipeReset(byte endpoint) { throw new NotImplementedException(); }
2d16447eff12 Simplified USB communication code, added functions to abort pipe transfers
Ivo Smits <Ivo@UCIS.nl>
parents: 65
diff changeset
179 void IUsbInterface.PipeAbort(byte endpoint) { throw new NotImplementedException(); }
2d16447eff12 Simplified USB communication code, added functions to abort pipe transfers
Ivo Smits <Ivo@UCIS.nl>
parents: 65
diff changeset
180 int IUsbInterface.ControlTransfer(UsbControlRequestType requestType, byte request, short value, short index, byte[] buffer, int offset, int length) { throw new NotSupportedException(); }
2d16447eff12 Simplified USB communication code, added functions to abort pipe transfers
Ivo Smits <Ivo@UCIS.nl>
parents: 65
diff changeset
181 UsbPipeStream IUsbInterface.GetPipeStream(byte endpoint) { throw new NotSupportedException(); }
58
fd63c453ff65 Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents: 22
diff changeset
182 void IDisposable.Dispose() { }
60
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 58
diff changeset
183 void IUsbDevice.ClaimInterface(int interfaceID) { }
67
2d16447eff12 Simplified USB communication code, added functions to abort pipe transfers
Ivo Smits <Ivo@UCIS.nl>
parents: 65
diff changeset
184 void IUsbDevice.ReleaseInterface(int interfaceID) { }
60
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 58
diff changeset
185 #endregion
21
dcfec2be27c9 Added USBLib
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
186 }
58
fd63c453ff65 Improved Windows USB enumeration classes
Ivo Smits <Ivo@UCIS.nl>
parents: 22
diff changeset
187 }