Mercurial > hg > ucis.core
annotate USBLib/Communication/VBoxUSB.cs @ 67:2d16447eff12
Simplified USB communication code, added functions to abort pipe transfers
author | Ivo Smits <Ivo@UCIS.nl> |
---|---|
date | Wed, 16 Oct 2013 01:11:49 +0200 |
parents | 99ed461509fe |
children |
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 |
64
99ed461509fe
Fixed data type for USB vendor and product IDs
Ivo Smits <Ivo@UCIS.nl>
parents:
60
diff
changeset
|
275 public UInt16 Vid { get { return DeviceDescriptor.VendorID; } } |
99ed461509fe
Fixed data type for USB vendor and product IDs
Ivo Smits <Ivo@UCIS.nl>
parents:
60
diff
changeset
|
276 public UInt16 Pid { get { return DeviceDescriptor.ProductID; } } |
60
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); |
67
2d16447eff12
Simplified USB communication code, added functions to abort pipe transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
64
diff
changeset
|
311 static readonly int SUPUSB_IOCTL_USB_ABORT_ENDPOINT = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x610, METHOD_BUFFERED, FILE_WRITE_ACCESS); |
57
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
312 |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
313 const UInt32 USBDRV_MAJOR_VERSION = 4; |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
314 const UInt32 USBDRV_MINOR_VERSION = 0; |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
315 const UInt32 USBMON_MAJOR_VERSION = 5; |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
316 const UInt32 USBMON_MINOR_VERSION = 0; |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
317 |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
318 static SafeFileHandle hMonitor = null; |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
319 const String USBMON_DEVICE_NAME = "\\\\.\\VBoxUSBMon"; |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
320 |
60
3424fa5a12c9
Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents:
57
diff
changeset
|
321 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
|
322 Int32 pBytesReturned = 0; |
60
3424fa5a12c9
Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents:
57
diff
changeset
|
323 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
|
324 int ret = Marshal.GetLastWin32Error(); |
3424fa5a12c9
Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents:
57
diff
changeset
|
325 if (throwError) throw new Win32Exception(ret); |
3424fa5a12c9
Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents:
57
diff
changeset
|
326 return ret; |
3424fa5a12c9
Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents:
57
diff
changeset
|
327 } |
3424fa5a12c9
Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents:
57
diff
changeset
|
328 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
|
329 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
|
330 } |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
331 |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
332 unsafe static void InitMonitor() { |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
333 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
|
334 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
|
335 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
|
336 try { |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
337 USBSUP_VERSION Version = new USBSUP_VERSION(); |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
338 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
|
339 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
|
340 } catch { |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
341 hMonitor.Close(); |
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 |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
345 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
|
346 USBSUP_FLTADDOUT FltAddRc; |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
347 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
|
348 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
|
349 return FltAddRc.uId; |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
350 } |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
351 static unsafe void USBLibRemoveFilter(UIntPtr filterId) { |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
352 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
|
353 } |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
354 static unsafe void USBLibRunFilters() { |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
355 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
|
356 } |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
357 |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
358 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
|
359 int mVid, mPid, mRev, mMi; |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
360 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
|
361 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
|
362 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
|
363 if (mRev != -1) { |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
364 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
|
365 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
|
366 } |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
367 //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
|
368 //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
|
369 //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
|
370 //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
|
371 //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
|
372 //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
|
373 //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
|
374 //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
|
375 } |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
376 |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
377 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
|
378 InitMonitor(); |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
379 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
|
380 initFilterFromDevice(ref Filter, aDevice); |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
381 IntPtr pvId = USBLibAddFilter(ref Filter); |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
382 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
|
383 USBLibRunFilters(); |
3424fa5a12c9
Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents:
57
diff
changeset
|
384 //aDevice.Reenumerate(0); |
57
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
385 } |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
386 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
|
387 InitMonitor(); |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
388 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
|
389 initFilterFromDevice(ref Filter, aDevice); |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
390 IntPtr pvId = USBLibAddFilter(ref Filter); |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
391 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
|
392 USBLibRunFilters(); |
3424fa5a12c9
Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents:
57
diff
changeset
|
393 //aDevice.Reenumerate(0); |
57
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
394 } |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
395 public static IUsbDeviceRegistry GetDeviceForDeviceNode(DeviceNode device) { |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
396 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
|
397 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
|
398 return new USBRegistry(device, intfpath[0]); |
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 |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
401 SafeHandle hDev; |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
402 Byte bInterfaceNumber; |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
403 |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
404 public IUsbDeviceRegistry Registry { get; private set; } |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
405 |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
406 internal unsafe VBoxUSB(USBRegistry devreg) { |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
407 this.Registry = devreg; |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
408 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
|
409 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
|
410 try { |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
411 USBSUP_VERSION version = new USBSUP_VERSION(); |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
412 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
|
413 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
|
414 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
|
415 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
|
416 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
|
417 } catch { |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
418 hDev.Close(); |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
419 throw; |
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 } |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
422 public unsafe override void Close() { |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
423 if (!hDev.IsInvalid && !hDev.IsClosed) { |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
424 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
|
425 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
|
426 } |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
427 hDev.Close(); |
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 |
67
2d16447eff12
Simplified USB communication code, added functions to abort pipe transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
64
diff
changeset
|
430 public unsafe override void PipeReset(byte endpoint) { |
57
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
431 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
|
432 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
|
433 } |
67
2d16447eff12
Simplified USB communication code, added functions to abort pipe transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
64
diff
changeset
|
434 public unsafe override void PipeAbort(byte endpoint) { |
2d16447eff12
Simplified USB communication code, added functions to abort pipe transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
64
diff
changeset
|
435 USBSUP_CLEAR_ENDPOINT inp = new USBSUP_CLEAR_ENDPOINT() { bEndpoint = endpoint }; |
2d16447eff12
Simplified USB communication code, added functions to abort pipe transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
64
diff
changeset
|
436 SyncIoControl(hDev, SUPUSB_IOCTL_USB_ABORT_ENDPOINT, &inp, sizeof(USBSUP_CLEAR_ENDPOINT), null, 0); |
57
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
437 } |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
438 |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
439 public unsafe void ResetDevice() { |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
440 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
|
441 } |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
442 |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
443 public unsafe override byte Configuration { |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
444 get { return base.Configuration; } |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
445 set { |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
446 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
|
447 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
|
448 } |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
449 } |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
450 |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
451 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
|
452 using (ManualResetEvent evt = new ManualResetEvent(false)) { |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
453 NativeOverlapped overlapped = new NativeOverlapped(); |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
454 overlapped.EventHandle = evt.SafeWaitHandle.DangerousGetHandle(); |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
455 int size; |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
456 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
|
457 return; |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
458 int err = Marshal.GetLastWin32Error(); |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
459 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
|
460 evt.WaitOne(); |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
461 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
|
462 throw new Win32Exception(Marshal.GetLastWin32Error()); |
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 } |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
465 |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
466 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
|
467 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
|
468 fixed (Byte* ptr = buffer) { |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
469 USBSUP_URB urb = new USBSUP_URB(); |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
470 urb.type = type; |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
471 urb.dir = dir; |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
472 urb.flags = flags; |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
473 urb.ep = ep; |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
474 urb.len = (UIntPtr)length; |
60
3424fa5a12c9
Updated Windows USB enumeration classes and VBoxUSB backend
Ivo Smits <Ivo@UCIS.nl>
parents:
57
diff
changeset
|
475 urb.buf = ptr + offset; |
57
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
476 HandleURB(&urb); |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
477 return (int)urb.len; |
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 } |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
480 |
67
2d16447eff12
Simplified USB communication code, added functions to abort pipe transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
64
diff
changeset
|
481 public override int PipeTransfer(byte endpoint, byte[] buffer, int offset, int length) { |
2d16447eff12
Simplified USB communication code, added functions to abort pipe transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
64
diff
changeset
|
482 return BlockTransfer(USBSUP_TRANSFER_TYPE.USBSUP_TRANSFER_TYPE_BULK, (endpoint & 0x80) == 0 ? USBSUP_DIRECTION.USBSUP_DIRECTION_OUT : USBSUP_DIRECTION.USBSUP_DIRECTION_IN, USBSUP_XFER_FLAG.USBSUP_FLAG_NONE, endpoint, buffer, offset, length); |
2d16447eff12
Simplified USB communication code, added functions to abort pipe transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
64
diff
changeset
|
483 //return BlockTransfer(USBSUP_TRANSFER_TYPE.USBSUP_TRANSFER_TYPE_INTR, USBSUP_DIRECTION.USBSUP_DIRECTION_OUT, USBSUP_XFER_FLAG.USBSUP_FLAG_NONE, endpoint, buffer, offset, length); |
57
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
484 } |
67
2d16447eff12
Simplified USB communication code, added functions to abort pipe transfers
Ivo Smits <Ivo@UCIS.nl>
parents:
64
diff
changeset
|
485 public override unsafe int ControlTransfer(UsbControlRequestType requestType, byte request, short value, short index, byte[] buffer, int offset, int length) { |
57
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
486 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
|
487 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
|
488 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
|
489 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
|
490 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
|
491 dlen -= sizeof(UsbSetupPacket); |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
492 if (dlen > length) dlen = length; |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
493 if (dlen < 0) dlen = 0; |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
494 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
|
495 return dlen; |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
496 } |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
497 |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
498 public void ClaimInterface(int interfaceID) { |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
499 bInterfaceNumber = (Byte)interfaceID; |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
500 } |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
501 |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
502 public void ReleaseInterface(int interfaceID) { |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
503 } |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
504 } |
b1efeada517e
Added VirtualBox USB driver backend for direct USB communication
Ivo Smits <Ivo@UCIS.nl>
parents:
diff
changeset
|
505 } |