annotate USBLib/Communication/VBoxUSB.cs @ 60:3424fa5a12c9

Updated Windows USB enumeration classes and VBoxUSB backend
author Ivo Smits <Ivo@UCIS.nl>
date Sat, 12 Oct 2013 16:35:24 +0200
parents b1efeada517e
children 99ed461509fe
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
57
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1 ???using System;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2 using System.Collections.Generic;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
3 using System.ComponentModel;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
4 using System.Runtime.InteropServices;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
5 using System.Text;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
6 using System.Threading;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
7 using Microsoft.Win32.SafeHandles;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
8 using UCIS.HWLib.Windows.Devices;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
9 using UCIS.USBLib.Communication;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
10 using UCIS.USBLib.Communication.WinUsb;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
11 using UCIS.USBLib.Internal.Windows;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
12
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
13 namespace UCIS.USBLib.Communication.VBoxUSB {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
14 enum USBFILTERTYPE : int {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
15 USBFILTERTYPE_INVALID = 0,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
16 USBFILTERTYPE_FIRST,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
17 USBFILTERTYPE_ONESHOT_IGNORE = USBFILTERTYPE_FIRST,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
18 USBFILTERTYPE_ONESHOT_CAPTURE,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
19 USBFILTERTYPE_IGNORE,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
20 USBFILTERTYPE_CAPTURE,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
21 USBFILTERTYPE_END,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
22 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
23 enum USBFILTERMATCH : ushort {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
24 USBFILTERMATCH_INVALID = 0,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
25 USBFILTERMATCH_IGNORE,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
26 USBFILTERMATCH_PRESENT,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
27 USBFILTERMATCH_NUM_FIRST,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
28 USBFILTERMATCH_NUM_EXACT = USBFILTERMATCH_NUM_FIRST,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
29 USBFILTERMATCH_NUM_EXACT_NP,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
30 USBFILTERMATCH_NUM_EXPRESSION,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
31 USBFILTERMATCH_NUM_EXPRESSION_NP,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
32 USBFILTERMATCH_NUM_LAST = USBFILTERMATCH_NUM_EXPRESSION_NP,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
33 USBFILTERMATCH_STR_FIRST,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
34 USBFILTERMATCH_STR_EXACT = USBFILTERMATCH_STR_FIRST,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
35 USBFILTERMATCH_STR_EXACT_NP,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
36 USBFILTERMATCH_STR_PATTERN,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
37 USBFILTERMATCH_STR_PATTERN_NP,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
38 USBFILTERMATCH_STR_LAST = USBFILTERMATCH_STR_PATTERN_NP,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
39 USBFILTERMATCH_END = 11
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
40 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
41 enum USBFILTERIDX : int {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
42 USBFILTERIDX_VENDOR_ID = 0,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
43 USBFILTERIDX_PRODUCT_ID,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
44 USBFILTERIDX_DEVICE_REV,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
45 USBFILTERIDX_DEVICE_CLASS,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
46 USBFILTERIDX_DEVICE_SUB_CLASS,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
47 USBFILTERIDX_DEVICE_PROTOCOL,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
48 USBFILTERIDX_BUS,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
49 USBFILTERIDX_PORT,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
50 USBFILTERIDX_MANUFACTURER_STR,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
51 USBFILTERIDX_PRODUCT_STR,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
52 USBFILTERIDX_SERIAL_NUMBER_STR,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
53 USBFILTERIDX_END = 11
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
54 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
55 [StructLayout(LayoutKind.Sequential, Size = 4)]
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
56 struct USBFILTERFIELD {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
57 public USBFILTERMATCH enmMatch;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
58 public UInt16 u16Value;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
59 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
60 [StructLayout(LayoutKind.Sequential)]
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
61 unsafe struct USBFILTER {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
62 public UInt32 u32Magic;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
63 public USBFILTERTYPE enmType;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
64 public fixed UInt32 aFields[(int)USBFILTERIDX.USBFILTERIDX_END];
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
65 public UInt32 offCurEnd;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
66 public fixed Byte achStrTab[256];
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
67
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
68 const UInt32 USBFILTER_MAGIC = 0x19670408;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
69 public unsafe USBFILTER(USBFILTERTYPE enmType)
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
70 : this() {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
71 u32Magic = USBFILTER_MAGIC;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
72 this.enmType = enmType;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
73 fixed (UInt32* aFieldsBytes = this.aFields) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
74 USBFILTERFIELD* aFields = (USBFILTERFIELD*)aFieldsBytes;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
75 for (int i = 0; i < (int)USBFILTERIDX.USBFILTERIDX_END; i++)
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
76 aFields[i].enmMatch = USBFILTERMATCH.USBFILTERMATCH_IGNORE;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
77 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
78 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
79 static Boolean IsNumericField(USBFILTERIDX enmFieldIdx) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
80 switch (enmFieldIdx) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
81 case USBFILTERIDX.USBFILTERIDX_VENDOR_ID:
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
82 case USBFILTERIDX.USBFILTERIDX_PRODUCT_ID:
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
83 case USBFILTERIDX.USBFILTERIDX_DEVICE_REV:
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
84 case USBFILTERIDX.USBFILTERIDX_DEVICE_CLASS:
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
85 case USBFILTERIDX.USBFILTERIDX_DEVICE_SUB_CLASS:
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
86 case USBFILTERIDX.USBFILTERIDX_DEVICE_PROTOCOL:
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
87 case USBFILTERIDX.USBFILTERIDX_BUS:
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
88 case USBFILTERIDX.USBFILTERIDX_PORT:
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
89 return true;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
90 case USBFILTERIDX.USBFILTERIDX_MANUFACTURER_STR:
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
91 case USBFILTERIDX.USBFILTERIDX_PRODUCT_STR:
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
92 case USBFILTERIDX.USBFILTERIDX_SERIAL_NUMBER_STR:
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
93 return false;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
94 default:
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
95 throw new ArgumentOutOfRangeException("enmFieldIdx");
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
96 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
97 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
98 static Boolean IsMethodUsingStringValue(USBFILTERMATCH enmMatchingMethod) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
99 switch (enmMatchingMethod) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
100 case USBFILTERMATCH.USBFILTERMATCH_NUM_EXPRESSION:
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
101 case USBFILTERMATCH.USBFILTERMATCH_NUM_EXPRESSION_NP:
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
102 case USBFILTERMATCH.USBFILTERMATCH_STR_EXACT:
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
103 case USBFILTERMATCH.USBFILTERMATCH_STR_EXACT_NP:
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
104 case USBFILTERMATCH.USBFILTERMATCH_STR_PATTERN:
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
105 case USBFILTERMATCH.USBFILTERMATCH_STR_PATTERN_NP:
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
106 return true;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
107 case USBFILTERMATCH.USBFILTERMATCH_IGNORE:
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
108 case USBFILTERMATCH.USBFILTERMATCH_PRESENT:
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
109 case USBFILTERMATCH.USBFILTERMATCH_NUM_EXACT:
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
110 case USBFILTERMATCH.USBFILTERMATCH_NUM_EXACT_NP:
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
111 return false;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
112 default:
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
113 throw new ArgumentOutOfRangeException("enmMatchingMethod");
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
114 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
115 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
116 static unsafe int strlen(byte* ptr) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
117 for (int length = 0; ; length++) if (ptr[length] != 0) return length;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
118 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
119 static unsafe void memset(void* ptr, byte value, int count) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
120 for (int i = 0; i < count; i++) ((byte*)ptr)[i] = value;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
121 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
122 static unsafe void memmove(void* dest, void* src, int count) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
123 if (dest > src) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
124 for (int i = count - 1; i >= 0; i--) ((byte*)dest)[i] = ((byte*)src)[i];
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
125 } else if (dest < src) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
126 for (int i = 0; i < count; i++) ((byte*)dest)[i] = ((byte*)src)[i];
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
127 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
128 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
129 public unsafe void SetString(USBFILTERIDX enmFieldIdx, Byte[] pszString) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
130 fixed (USBFILTER* pFilter = &this) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
131 USBFILTERFIELD* aFields = (USBFILTERFIELD*)pFilter->aFields;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
132 if (IsMethodUsingStringValue((USBFILTERMATCH)aFields[(int)enmFieldIdx].enmMatch) && aFields[(int)enmFieldIdx].u16Value != 0) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
133 int off = aFields[(int)enmFieldIdx].u16Value;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
134 aFields[(int)enmFieldIdx].u16Value = 0; /* Assign it to the NULL string. */
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
135 int cchShift = strlen(&pFilter->achStrTab[off]) + 1;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
136 int cchToMove = ((int)offCurEnd + 1) - (off + cchShift);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
137 if (cchToMove > 0) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
138 memmove(&pFilter->achStrTab[off], &pFilter->achStrTab[off + cchShift], cchToMove);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
139 for (int i = 0; i < (int)USBFILTERIDX.USBFILTERIDX_END; i++)
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
140 if (aFields[i].u16Value >= off && IsMethodUsingStringValue(aFields[i].enmMatch))
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
141 aFields[i].u16Value -= (ushort)cchShift;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
142 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
143 offCurEnd -= (uint)cchShift;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
144 memset(&pFilter->achStrTab[offCurEnd], 0, cchShift);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
145 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
146 if (pszString.Length == 0) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
147 aFields[(int)enmFieldIdx].u16Value = 0;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
148 } else {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
149 int cch = pszString.Length;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
150 if (this.offCurEnd + cch + 2 > 256) throw new IndexOutOfRangeException("Buffer overflow");
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
151 aFields[(int)enmFieldIdx].u16Value = (ushort)(this.offCurEnd + 1);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
152 for (int i = 0; i < cch + 1; i++) pFilter->achStrTab[offCurEnd + 1 + i] = pszString[i];
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
153 offCurEnd += (uint)cch + 1;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
154 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
155 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
156 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
157 unsafe void DeleteAnyStringValue(USBFILTERIDX enmFieldIdx) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
158 fixed (USBFILTER* pFilter = &this) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
159 USBFILTERFIELD* aFields = (USBFILTERFIELD*)pFilter->aFields;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
160 if (IsMethodUsingStringValue((USBFILTERMATCH)aFields[(int)enmFieldIdx].enmMatch) && aFields[(int)enmFieldIdx].u16Value != 0)
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
161 SetString(enmFieldIdx, new Byte[0]);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
162 else if (enmFieldIdx >= USBFILTERIDX.USBFILTERIDX_END)
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
163 throw new ArgumentOutOfRangeException("enmFieldIdx");
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
164 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
165 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
166 public unsafe void SetNumExact(USBFILTERIDX enmFieldIdx, UInt16 u16Value, bool fMustBePresent) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
167 if (!IsNumericField(enmFieldIdx)) throw new ArgumentOutOfRangeException("enmFieldIdx");
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
168 DeleteAnyStringValue(enmFieldIdx);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
169 fixed (USBFILTER* pFilter = &this) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
170 USBFILTERFIELD* aFields = (USBFILTERFIELD*)pFilter->aFields;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
171 aFields[(int)enmFieldIdx].u16Value = u16Value;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
172 aFields[(int)enmFieldIdx].enmMatch = fMustBePresent ? USBFILTERMATCH.USBFILTERMATCH_NUM_EXACT : USBFILTERMATCH.USBFILTERMATCH_NUM_EXACT_NP;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
173 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
174 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
175 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
176 [StructLayout(LayoutKind.Sequential, Pack = 4)]
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
177 struct USBSUP_FLTADDOUT {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
178 public IntPtr uId;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
179 public int rc;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
180 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
181 [StructLayout(LayoutKind.Sequential)]
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
182 struct USBSUP_VERSION {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
183 public UInt32 u32Major;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
184 public UInt32 u32Minor;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
185 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
186 [StructLayout(LayoutKind.Sequential)]
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
187 struct USBSUP_CLAIMDEV {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
188 public Byte bInterfaceNumber;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
189 public Byte fClaimed;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
190 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
191 [StructLayout(LayoutKind.Sequential)]
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
192 struct USBSUP_CLEAR_ENDPOINT {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
193 public Byte bEndpoint;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
194 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
195 [StructLayout(LayoutKind.Sequential)]
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
196 struct USBSUP_SET_CONFIG {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
197 public Byte bConfigurationValue;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
198 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
199 [StructLayout(LayoutKind.Sequential)]
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
200 struct USBSUP_SELECT_INTERFACE {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
201 public Byte bInterfaceNumber;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
202 public Byte bAlternateSetting;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
203 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
204 enum USBSUP_TRANSFER_TYPE : int {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
205 USBSUP_TRANSFER_TYPE_CTRL = 0,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
206 USBSUP_TRANSFER_TYPE_ISOC = 1,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
207 USBSUP_TRANSFER_TYPE_BULK = 2,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
208 USBSUP_TRANSFER_TYPE_INTR = 3,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
209 USBSUP_TRANSFER_TYPE_MSG = 4
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
210 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
211 enum USBSUP_DIRECTION : int {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
212 USBSUP_DIRECTION_SETUP = 0,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
213 USBSUP_DIRECTION_IN = 1,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
214 USBSUP_DIRECTION_OUT = 2
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
215 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
216 enum USBSUP_XFER_FLAG : int {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
217 USBSUP_FLAG_NONE = 0,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
218 USBSUP_FLAG_SHORT_OK = 1
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
219 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
220 enum USBSUP_ERROR : int {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
221 USBSUP_XFER_OK = 0,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
222 USBSUP_XFER_STALL = 1,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
223 USBSUP_XFER_DNR = 2,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
224 USBSUP_XFER_CRC = 3,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
225 USBSUP_XFER_NAC = 4,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
226 USBSUP_XFER_UNDERRUN = 5,
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
227 USBSUP_XFER_OVERRUN = 6
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
228 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
229 [StructLayout(LayoutKind.Sequential, Pack = 4)]
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
230 unsafe struct USBSUP_URB {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
231 public USBSUP_TRANSFER_TYPE type;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
232 public UInt32 ep;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
233 public USBSUP_DIRECTION dir;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
234 public USBSUP_XFER_FLAG flags;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
235 public USBSUP_ERROR error;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
236 public UIntPtr len;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
237 public void* buf;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
238 public UInt32 numIsoPkts;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
239 public fixed byte aIsoPkts[8 * 8];
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
240 }
60
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
241 class USBRegistry : IUsbDeviceRegistry {
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
242 public DeviceNode DeviceNode { get; private set; }
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
243 public String DevicePath { get; private set; }
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
244 public String DeviceID { get; private set; }
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
245 public String SymbolicName { get { return DevicePath; } }
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
246 private UCIS.HWLib.Windows.USB.UsbDevice usbdev = null;
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
247 private Boolean hasDeviceDescriptor = false;
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
248 private UCIS.USBLib.Descriptor.UsbDeviceDescriptor deviceDescriptor;
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
249 private IDictionary<string, object> mDeviceProperties;
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
250 public UCIS.HWLib.Windows.USB.UsbDevice USBDevice {
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
251 get {
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
252 if (usbdev == null) usbdev = UCIS.HWLib.Windows.USB.UsbDevice.GetUsbDevice(DeviceNode);
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
253 return usbdev;
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
254 }
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
255 }
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
256 public UCIS.USBLib.Descriptor.UsbDeviceDescriptor DeviceDescriptor {
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
257 get {
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
258 if (!hasDeviceDescriptor) deviceDescriptor = UCIS.USBLib.Descriptor.UsbDeviceDescriptor.FromDevice(USBDevice);
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
259 return deviceDescriptor;
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
260 }
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
261 }
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
262 public IDictionary<string, object> DeviceProperties {
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
263 get {
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
264 if (mDeviceProperties == null) mDeviceProperties = SetupApi.GetSPDRPProperties(DeviceNode);
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
265 return mDeviceProperties;
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
266 }
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
267 }
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
268
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
269 internal USBRegistry(DeviceNode device, String interfacepath) {
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
270 DeviceNode = device;
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
271 DeviceID = device.DeviceID;
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
272 DevicePath = interfacepath;
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
273 }
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
274
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
275 public int Vid { get { return DeviceDescriptor.VendorID; } }
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
276 public int Pid { get { return DeviceDescriptor.ProductID; } }
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
277 public byte InterfaceID { get { return 0; } }
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
278
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
279 public string Name { get { return DeviceNode.GetPropertyString(CMRDP.DEVICEDESC); } }
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
280 public string Manufacturer { get { return DeviceNode.GetPropertyString(CMRDP.MFG); } }
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
281 public string FullName {
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
282 get {
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
283 String desc = Name;
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
284 String mfg = Manufacturer;
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
285 if (mfg == null) return desc;
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
286 if (desc == null) return mfg;
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
287 return mfg + " - " + desc;
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
288 }
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
289 }
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
290
57
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
291 public IUsbDevice Open() { return new VBoxUSB(this); }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
292 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
293
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
294 public class VBoxUSB : UsbInterface, IUsbDevice {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
295 const int FILE_DEVICE_UNKNOWN = 0x00000022;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
296 const int METHOD_BUFFERED = 0;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
297 const int FILE_WRITE_ACCESS = 0x0002;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
298 static int CTL_CODE(int DeviceType, int Function, int Method, int Access) { return (DeviceType << 16) | (Access << 14) | (Function << 2) | Method; }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
299 static readonly int SUPUSBFLT_IOCTL_ADD_FILTER = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x611, METHOD_BUFFERED, FILE_WRITE_ACCESS);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
300 static readonly int SUPUSBFLT_IOCTL_RUN_FILTERS = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x615, METHOD_BUFFERED, FILE_WRITE_ACCESS);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
301 static readonly int SUPUSBFLT_IOCTL_REMOVE_FILTER = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x612, METHOD_BUFFERED, FILE_WRITE_ACCESS);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
302 static readonly int SUPUSBFLT_IOCTL_GET_VERSION = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x610, METHOD_BUFFERED, FILE_WRITE_ACCESS);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
303 static readonly int SUPUSB_IOCTL_GET_VERSION = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x60F, METHOD_BUFFERED, FILE_WRITE_ACCESS);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
304 static readonly int SUPUSB_IOCTL_USB_CLAIM_DEVICE = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x60B, METHOD_BUFFERED, FILE_WRITE_ACCESS);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
305 static readonly int SUPUSB_IOCTL_USB_RELEASE_DEVICE = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x60C, METHOD_BUFFERED, FILE_WRITE_ACCESS);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
306 static readonly int SUPUSB_IOCTL_USB_RESET = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x608, METHOD_BUFFERED, FILE_WRITE_ACCESS);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
307 static readonly int SUPUSB_IOCTL_USB_CLEAR_ENDPOINT = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x60E, METHOD_BUFFERED, FILE_WRITE_ACCESS);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
308 static readonly int SUPUSB_IOCTL_USB_SET_CONFIG = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x60A, METHOD_BUFFERED, FILE_WRITE_ACCESS);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
309 static readonly int SUPUSB_IOCTL_USB_SELECT_INTERFACE = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x609, METHOD_BUFFERED, FILE_WRITE_ACCESS);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
310 static readonly int SUPUSB_IOCTL_SEND_URB = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x607, METHOD_BUFFERED, FILE_WRITE_ACCESS);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
311
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
312 const UInt32 USBDRV_MAJOR_VERSION = 4;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
313 const UInt32 USBDRV_MINOR_VERSION = 0;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
314 const UInt32 USBMON_MAJOR_VERSION = 5;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
315 const UInt32 USBMON_MINOR_VERSION = 0;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
316
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
317 static SafeFileHandle hMonitor = null;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
318 const String USBMON_DEVICE_NAME = "\\\\.\\VBoxUSBMon";
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
319
60
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
320 static unsafe int SyncIoControl(SafeHandle hDevice, int IoControlCode, void* InBuffer, int nInBufferSize, void* OutBuffer, int nOutBufferSize, Boolean throwError) {
57
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
321 Int32 pBytesReturned = 0;
60
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
322 if (Kernel32.DeviceIoControl(hDevice, IoControlCode, InBuffer, nInBufferSize, OutBuffer, nOutBufferSize, out pBytesReturned, null)) return 0;
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
323 int ret = Marshal.GetLastWin32Error();
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
324 if (throwError) throw new Win32Exception(ret);
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
325 return ret;
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
326 }
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
327 static unsafe void SyncIoControl(SafeHandle hDevice, int IoControlCode, void* InBuffer, int nInBufferSize, void* OutBuffer, int nOutBufferSize) {
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
328 SyncIoControl(hDevice, IoControlCode, InBuffer, nInBufferSize, OutBuffer, nOutBufferSize, true);
57
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
329 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
330
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
331 unsafe static void InitMonitor() {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
332 if (hMonitor != null && !hMonitor.IsClosed && !hMonitor.IsInvalid) return;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
333 hMonitor = Kernel32.CreateFile(USBMON_DEVICE_NAME, Kernel32.GENERIC_READ | Kernel32.GENERIC_WRITE, Kernel32.FILE_SHARE_READ | Kernel32.FILE_SHARE_WRITE, IntPtr.Zero, Kernel32.OPEN_EXISTING, Kernel32.FILE_ATTRIBUTE_SYSTEM, IntPtr.Zero);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
334 if (hMonitor.IsInvalid) throw new Win32Exception(Marshal.GetLastWin32Error());
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
335 try {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
336 USBSUP_VERSION Version = new USBSUP_VERSION();
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
337 SyncIoControl(hMonitor, SUPUSBFLT_IOCTL_GET_VERSION, null, 0, &Version, sizeof(USBSUP_VERSION));
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
338 if (Version.u32Major != USBMON_MAJOR_VERSION || Version.u32Minor < USBMON_MINOR_VERSION) throw new InvalidOperationException("Unsupported USBMON version");
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
339 } catch {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
340 hMonitor.Close();
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
341 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
342 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
343
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
344 static unsafe IntPtr USBLibAddFilter(ref USBFILTER filter) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
345 USBSUP_FLTADDOUT FltAddRc;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
346 fixed (USBFILTER* pFilter = &filter) SyncIoControl(hMonitor, SUPUSBFLT_IOCTL_ADD_FILTER, pFilter, sizeof(USBFILTER), &FltAddRc, sizeof(USBSUP_FLTADDOUT));
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
347 if (FltAddRc.rc != 0) throw new Exception(String.Format("rc={0}", FltAddRc.rc));
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
348 return FltAddRc.uId;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
349 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
350 static unsafe void USBLibRemoveFilter(UIntPtr filterId) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
351 SyncIoControl(hMonitor, SUPUSBFLT_IOCTL_REMOVE_FILTER, &filterId, sizeof(UIntPtr), null, 0);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
352 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
353 static unsafe void USBLibRunFilters() {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
354 SyncIoControl(hMonitor, SUPUSBFLT_IOCTL_RUN_FILTERS, null, 0, null, 0);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
355 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
356
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
357 static void initFilterFromDevice(ref USBFILTER aFilter, DeviceNode aDevice) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
358 int mVid, mPid, mRev, mMi;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
359 WindowsUsbDeviceRegistry.DecodeDeviceIDs(aDevice, out mVid, out mPid, out mRev, out mMi);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
360 if (mVid != -1) aFilter.SetNumExact(USBFILTERIDX.USBFILTERIDX_VENDOR_ID, (ushort)mVid, true);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
361 if (mPid != -1) aFilter.SetNumExact(USBFILTERIDX.USBFILTERIDX_PRODUCT_ID, (ushort)mPid, true);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
362 if (mRev != -1) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
363 int mRevBCD = (((mRev % 10) / 1) << 0) | (((mRev % 100) / 10) << 4) | (((mRev % 1000) / 100) << 8) | (((mRev % 10000) / 1000) << 12);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
364 aFilter.SetNumExact(USBFILTERIDX.USBFILTERIDX_DEVICE_REV, (ushort)mRevBCD, true);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
365 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
366 //aFilter.SetNumExact(USBFILTERIDX.USBFILTERIDX_DEVICE_CLASS, 0xff, true);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
367 //aFilter.SetNumExact(USBFILTERIDX.USBFILTERIDX_DEVICE_SUB_CLASS, 0x00, true);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
368 //aFilter.SetNumExact(USBFILTERIDX.USBFILTERIDX_DEVICE_PROTOCOL, 0x00, true);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
369 //aFilter.SetNumExact(USBFILTERIDX.USBFILTERIDX_PORT, 0, true);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
370 //aFilter.SetNumExact(USBFILTERIDX.USBFILTERIDX_BUS, 0, true);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
371 //if (pDev->pszSerialNumber) aFilter.SetStringExact(USBFILTERIDX.USBFILTERIDX_SERIAL_NUMBER_STR, pDev->pszSerialNumber, true);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
372 //if (pDev->pszProduct) aFilter.SetStringExact(USBFILTERIDX.USBFILTERIDX_PRODUCT_STR, pDev->pszProduct, true);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
373 //if (pDev->pszManufacturer) aFilter.SetStringExact(USBFILTERIDX.USBFILTERIDX_MANUFACTURER_STR, pDev->pszManufacturer, true);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
374 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
375
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
376 public unsafe static void Capture(DeviceNode aDevice) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
377 InitMonitor();
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
378 USBFILTER Filter = new USBFILTER(USBFILTERTYPE.USBFILTERTYPE_ONESHOT_CAPTURE);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
379 initFilterFromDevice(ref Filter, aDevice);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
380 IntPtr pvId = USBLibAddFilter(ref Filter);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
381 if (pvId == IntPtr.Zero) throw new Exception("Add one-shot Filter failed");
60
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
382 USBLibRunFilters();
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
383 //aDevice.Reenumerate(0);
57
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
384 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
385 public unsafe static void Release(DeviceNode aDevice) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
386 InitMonitor();
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
387 USBFILTER Filter = new USBFILTER(USBFILTERTYPE.USBFILTERTYPE_ONESHOT_IGNORE);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
388 initFilterFromDevice(ref Filter, aDevice);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
389 IntPtr pvId = USBLibAddFilter(ref Filter);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
390 if (pvId == IntPtr.Zero) throw new Exception("Add one-shot Filter failed");
60
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
391 USBLibRunFilters();
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
392 //aDevice.Reenumerate(0);
57
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
393 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
394 public static IUsbDeviceRegistry GetDeviceForDeviceNode(DeviceNode device) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
395 String[] intfpath = device.GetInterfaces(new Guid(0x873fdf, 0xCAFE, 0x80EE, 0xaa, 0x5e, 0x0, 0xc0, 0x4f, 0xb1, 0x72, 0xb));
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
396 if (intfpath == null || intfpath.Length == 0) return null;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
397 return new USBRegistry(device, intfpath[0]);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
398 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
399
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
400 SafeHandle hDev;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
401 Byte bInterfaceNumber;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
402
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
403 public IUsbDeviceRegistry Registry { get; private set; }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
404
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
405 internal unsafe VBoxUSB(USBRegistry devreg) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
406 this.Registry = devreg;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
407 hDev = Kernel32.CreateFile(devreg.DevicePath, Kernel32.GENERIC_READ | Kernel32.GENERIC_WRITE, Kernel32.FILE_SHARE_WRITE | Kernel32.FILE_SHARE_READ, IntPtr.Zero, Kernel32.OPEN_EXISTING, Kernel32.FILE_ATTRIBUTE_SYSTEM | Kernel32.FILE_FLAG_OVERLAPPED, IntPtr.Zero);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
408 if (hDev.IsInvalid) throw new Win32Exception(Marshal.GetLastWin32Error());
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
409 try {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
410 USBSUP_VERSION version = new USBSUP_VERSION();
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
411 SyncIoControl(hDev, SUPUSB_IOCTL_GET_VERSION, null, 0, &version, sizeof(USBSUP_VERSION));
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
412 if (version.u32Major != USBDRV_MAJOR_VERSION || version.u32Minor < USBDRV_MINOR_VERSION) throw new InvalidOperationException("Unsupported USBDRV version");
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
413 USBSUP_CLAIMDEV claim = new USBSUP_CLAIMDEV() { bInterfaceNumber = 0 };
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
414 SyncIoControl(hDev, SUPUSB_IOCTL_USB_CLAIM_DEVICE, &claim, sizeof(USBSUP_CLAIMDEV), &claim, sizeof(USBSUP_CLAIMDEV));
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
415 if (claim.fClaimed == 0) throw new InvalidOperationException("Claim failed");
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
416 } catch {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
417 hDev.Close();
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
418 throw;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
419 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
420 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
421 public unsafe override void Close() {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
422 if (!hDev.IsInvalid && !hDev.IsClosed) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
423 USBSUP_CLAIMDEV release = new USBSUP_CLAIMDEV() { bInterfaceNumber = bInterfaceNumber };
60
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
424 SyncIoControl(hDev, SUPUSB_IOCTL_USB_RELEASE_DEVICE, &release, sizeof(USBSUP_CLAIMDEV), null, 0, false);
57
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
425 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
426 hDev.Close();
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
427 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
428
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
429 public unsafe override void BulkReset(byte endpoint) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
430 USBSUP_CLEAR_ENDPOINT inp = new USBSUP_CLEAR_ENDPOINT() { bEndpoint = endpoint };
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
431 SyncIoControl(hDev, SUPUSB_IOCTL_USB_CLEAR_ENDPOINT, &inp, sizeof(USBSUP_CLEAR_ENDPOINT), null, 0);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
432 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
433 public override void InterruptReset(byte endpoint) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
434 BulkReset(endpoint);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
435 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
436
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
437 public unsafe void ResetDevice() {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
438 SyncIoControl(hDev, SUPUSB_IOCTL_USB_RESET, null, 0, null, 0);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
439 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
440
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
441 public unsafe override byte Configuration {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
442 get { return base.Configuration; }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
443 set {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
444 USBSUP_SET_CONFIG inp = new USBSUP_SET_CONFIG() { bConfigurationValue = value };
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
445 SyncIoControl(hDev, SUPUSB_IOCTL_USB_SET_CONFIG, &inp, sizeof(USBSUP_SET_CONFIG), null, 0);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
446 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
447 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
448
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
449 private unsafe void HandleURB(USBSUP_URB* urb) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
450 using (ManualResetEvent evt = new ManualResetEvent(false)) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
451 NativeOverlapped overlapped = new NativeOverlapped();
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
452 overlapped.EventHandle = evt.SafeWaitHandle.DangerousGetHandle();
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
453 int size;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
454 if (Kernel32.DeviceIoControl(hDev, SUPUSB_IOCTL_SEND_URB, urb, sizeof(USBSUP_URB), urb, sizeof(USBSUP_URB), out size, &overlapped))
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
455 return;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
456 int err = Marshal.GetLastWin32Error();
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
457 if (err != 997) throw new Win32Exception(err);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
458 evt.WaitOne();
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
459 if (!Kernel32.GetOverlappedResult(hDev, &overlapped, out size, false))
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
460 throw new Win32Exception(Marshal.GetLastWin32Error());
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
461 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
462 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
463
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
464 private unsafe int BlockTransfer(USBSUP_TRANSFER_TYPE type, USBSUP_DIRECTION dir, USBSUP_XFER_FLAG flags, UInt32 ep, Byte[] buffer, int offset, int length) {
60
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
465 if (offset < 0 || length < 0 || offset + length > buffer.Length) throw new ArgumentOutOfRangeException("length", "The specified offset and length exceed the buffer length");
57
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
466 fixed (Byte* ptr = buffer) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
467 USBSUP_URB urb = new USBSUP_URB();
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
468 urb.type = type;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
469 urb.dir = dir;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
470 urb.flags = flags;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
471 urb.ep = ep;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
472 urb.len = (UIntPtr)length;
60
3424fa5a12c9 Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents: 57
diff changeset
473 urb.buf = ptr + offset;
57
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
474 HandleURB(&urb);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
475 return (int)urb.len;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
476 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
477 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
478
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
479 public override int BulkWrite(byte endpoint, byte[] buffer, int offset, int length) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
480 return BlockTransfer(USBSUP_TRANSFER_TYPE.USBSUP_TRANSFER_TYPE_BULK, USBSUP_DIRECTION.USBSUP_DIRECTION_OUT, USBSUP_XFER_FLAG.USBSUP_FLAG_NONE, endpoint, buffer, offset, length);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
481 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
482 public override int BulkRead(byte endpoint, byte[] buffer, int offset, int length) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
483 return BlockTransfer(USBSUP_TRANSFER_TYPE.USBSUP_TRANSFER_TYPE_BULK, USBSUP_DIRECTION.USBSUP_DIRECTION_IN, USBSUP_XFER_FLAG.USBSUP_FLAG_NONE, endpoint, buffer, offset, length);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
484 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
485 public override int InterruptWrite(byte endpoint, byte[] buffer, int offset, int length) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
486 return BlockTransfer(USBSUP_TRANSFER_TYPE.USBSUP_TRANSFER_TYPE_INTR, USBSUP_DIRECTION.USBSUP_DIRECTION_OUT, USBSUP_XFER_FLAG.USBSUP_FLAG_NONE, endpoint, buffer, offset, length);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
487 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
488 public override int InterruptRead(byte endpoint, byte[] buffer, int offset, int length) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
489 return BlockTransfer(USBSUP_TRANSFER_TYPE.USBSUP_TRANSFER_TYPE_INTR, USBSUP_DIRECTION.USBSUP_DIRECTION_IN, USBSUP_XFER_FLAG.USBSUP_FLAG_NONE, endpoint, buffer, offset, length);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
490 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
491 private unsafe int ControlTransfer(UsbControlRequestType requestType, byte request, short value, short index, byte[] buffer, int offset, int length) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
492 Byte[] bigbuffer = new Byte[sizeof(UsbSetupPacket) + length];
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
493 Boolean isout = (requestType & UsbControlRequestType.EndpointMask) == UsbControlRequestType.EndpointOut;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
494 if (isout && length > 0) Buffer.BlockCopy(buffer, offset, bigbuffer, sizeof(UsbSetupPacket), length);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
495 fixed (Byte* ptr = bigbuffer) *(UsbSetupPacket*)ptr = new UsbSetupPacket((Byte)requestType, request, value, index, (short)length);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
496 int dlen = BlockTransfer(USBSUP_TRANSFER_TYPE.USBSUP_TRANSFER_TYPE_MSG, isout ? USBSUP_DIRECTION.USBSUP_DIRECTION_OUT : USBSUP_DIRECTION.USBSUP_DIRECTION_IN, USBSUP_XFER_FLAG.USBSUP_FLAG_NONE, 0, bigbuffer, 0, bigbuffer.Length);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
497 dlen -= sizeof(UsbSetupPacket);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
498 if (dlen > length) dlen = length;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
499 if (dlen < 0) dlen = 0;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
500 if (!isout) Buffer.BlockCopy(bigbuffer, sizeof(UsbSetupPacket), buffer, offset, dlen);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
501 return dlen;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
502 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
503 public override int ControlWrite(UsbControlRequestType requestType, byte request, short value, short index, byte[] buffer, int offset, int length) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
504 return ControlTransfer(requestType, request, value, index, buffer, offset, length);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
505 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
506 public override int ControlRead(UsbControlRequestType requestType, byte request, short value, short index, byte[] buffer, int offset, int length) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
507 return ControlTransfer(requestType, request, value, index, buffer, offset, length);
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
508 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
509
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
510 public void ClaimInterface(int interfaceID) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
511 bInterfaceNumber = (Byte)interfaceID;
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
512 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
513
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
514 public void ReleaseInterface(int interfaceID) {
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
515 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
516 }
b1efeada517e Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
517 }