Mercurial > hg > ucis.core
annotate USBLib/Communication/VBoxUSB.cs @ 62:edc41c861d96
Updates and cleanup in Windows USB enumeration code
author | Ivo Smits <Ivo@UCIS.nl> |
---|---|
date | Sun, 13 Oct 2013 02:47:08 +0200 |
parents | 3424fa5a12c9 |
children | 99ed461509fe |
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 } |