1 // Licensed under the Apache License, Version 2.0
2 // <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
4 // All files in the project carrying such notice may not be copied, modified, or distributed
5 // except according to those terms.
6 //! FFI bindings to winusb.
7 use shared::minwindef::{BOOL, LPDWORD, PUCHAR, PULONG, UCHAR, ULONG, USHORT};
8 use shared::usb::PUSBD_ISO_PACKET_DESCRIPTOR;
9 use shared::usbspec::PUSB_CONFIGURATION_DESCRIPTOR;
10 use shared::winusbio::{PWINUSB_PIPE_INFORMATION, PWINUSB_PIPE_INFORMATION_EX};
11 use um::minwinbase::LPOVERLAPPED;
12 use um::winnt::{HANDLE, LARGE_INTEGER, LONG, PVOID};
13 pub type WINUSB_INTERFACE_HANDLE = PVOID;
14 pub type PWINUSB_INTERFACE_HANDLE = *mut PVOID;
15 pub type WINUSB_ISOCH_BUFFER_HANDLE = PVOID;
16 pub type PWINUSB_ISOCH_BUFFER_HANDLE = *mut PVOID;
17 STRUCT!{#[repr(packed)] struct WINUSB_SETUP_PACKET {
18     RequestType: UCHAR,
19     Request: UCHAR,
20     Value: USHORT,
21     Index: USHORT,
22     Length: USHORT,
23 }}
24 pub type PWINUSB_SETUP_PACKET = *mut WINUSB_SETUP_PACKET;
25 extern "system" {
WinUsb_Initialize( DeviceHandle: HANDLE, InterfaceHandle: PWINUSB_INTERFACE_HANDLE, ) -> BOOL26     pub fn WinUsb_Initialize(
27         DeviceHandle: HANDLE,
28         InterfaceHandle: PWINUSB_INTERFACE_HANDLE,
29     ) -> BOOL;
WinUsb_Free( InterfaceHandle: WINUSB_INTERFACE_HANDLE, ) -> BOOL30     pub fn WinUsb_Free(
31         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
32     ) -> BOOL;
WinUsb_GetAssociatedInterface( InterfaceHandle: WINUSB_INTERFACE_HANDLE, AssociatedInterfaceIndex: UCHAR, AssociatedInterfaceHandle: PWINUSB_INTERFACE_HANDLE, ) -> BOOL33     pub fn WinUsb_GetAssociatedInterface(
34         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
35         AssociatedInterfaceIndex: UCHAR,
36         AssociatedInterfaceHandle: PWINUSB_INTERFACE_HANDLE,
37     ) -> BOOL;
WinUsb_GetDescriptor( InterfaceHandle: WINUSB_INTERFACE_HANDLE, DescriptorType: UCHAR, Index: UCHAR, LanguageID: USHORT, Buffer: PUCHAR, BufferLength: ULONG, LengthTransferred: PULONG, ) -> BOOL38     pub fn WinUsb_GetDescriptor(
39         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
40         DescriptorType: UCHAR,
41         Index: UCHAR,
42         LanguageID: USHORT,
43         Buffer: PUCHAR,
44         BufferLength: ULONG,
45         LengthTransferred: PULONG,
46     ) -> BOOL;
WinUsb_QueryInterfaceSettings( InterfaceHandle: WINUSB_INTERFACE_HANDLE, AlternateInterfaceNumber: UCHAR, UsbAltInterfaceDescriptor: PUSB_INTERFACE_DESCRIPTOR, ) -> BOOL47     pub fn WinUsb_QueryInterfaceSettings(
48         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
49         AlternateInterfaceNumber: UCHAR,
50         UsbAltInterfaceDescriptor: PUSB_INTERFACE_DESCRIPTOR,
51     ) -> BOOL;
WinUsb_QueryDeviceInformation( InterfaceHandle: WINUSB_INTERFACE_HANDLE, InformationType: ULONG, BufferLength: PULONG, Buffer: PVOID, ) -> BOOL52     pub fn WinUsb_QueryDeviceInformation(
53         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
54         InformationType: ULONG,
55         BufferLength: PULONG,
56         Buffer: PVOID,
57     ) -> BOOL;
WinUsb_SetCurrentAlternateSetting( InterfaceHandle: WINUSB_INTERFACE_HANDLE, SettingNumber: UCHAR, ) -> BOOL58     pub fn WinUsb_SetCurrentAlternateSetting(
59         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
60         SettingNumber: UCHAR,
61     ) -> BOOL;
WinUsb_GetCurrentAlternateSetting( InterfaceHandle: WINUSB_INTERFACE_HANDLE, SettingNumber: PUCHAR, ) -> BOOL62     pub fn WinUsb_GetCurrentAlternateSetting(
63         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
64         SettingNumber: PUCHAR,
65     ) -> BOOL;
WinUsb_QueryPipe( InterfaceHandle: WINUSB_INTERFACE_HANDLE, AlternateInterfaceNumber: UCHAR, PipeIndex: UCHAR, PipeInformationEx: PWINUSB_PIPE_INFORMATION, ) -> BOOL66     pub fn WinUsb_QueryPipe(
67         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
68         AlternateInterfaceNumber: UCHAR,
69         PipeIndex: UCHAR,
70         PipeInformationEx: PWINUSB_PIPE_INFORMATION,
71     ) -> BOOL;
WinUsb_QueryPipeEx( InterfaceHandle: WINUSB_INTERFACE_HANDLE, AlternateInterfaceNumber: UCHAR, PipeIndex: UCHAR, PipeInformationEx: PWINUSB_PIPE_INFORMATION_EX, ) -> BOOL72     pub fn WinUsb_QueryPipeEx(
73         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
74         AlternateInterfaceNumber: UCHAR,
75         PipeIndex: UCHAR,
76         PipeInformationEx: PWINUSB_PIPE_INFORMATION_EX,
77     ) -> BOOL;
WinUsb_SetPipePolicy( InterfaceHandle: WINUSB_INTERFACE_HANDLE, PipeID: UCHAR, PolicyType: ULONG, ValueLength: ULONG, Value: PVOID, ) -> BOOL78     pub fn WinUsb_SetPipePolicy(
79         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
80         PipeID: UCHAR,
81         PolicyType: ULONG,
82         ValueLength: ULONG,
83         Value: PVOID,
84     ) -> BOOL;
WinUsb_GetPipePolicy( InterfaceHandle: WINUSB_INTERFACE_HANDLE, PipeID: UCHAR, PolicyType: ULONG, ValueLength: PULONG, Value: PVOID, ) -> BOOL85     pub fn WinUsb_GetPipePolicy(
86         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
87         PipeID: UCHAR,
88         PolicyType: ULONG,
89         ValueLength: PULONG,
90         Value: PVOID,
91     ) -> BOOL;
WinUsb_ReadPipe( InterfaceHandle: WINUSB_INTERFACE_HANDLE, PipeID: UCHAR, Buffer: PUCHAR, BufferLength: ULONG, LengthTransferred: PULONG, Overlapped: LPOVERLAPPED, ) -> BOOL92     pub fn WinUsb_ReadPipe(
93         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
94         PipeID: UCHAR,
95         Buffer: PUCHAR,
96         BufferLength: ULONG,
97         LengthTransferred: PULONG,
98         Overlapped: LPOVERLAPPED,
99     ) -> BOOL;
WinUsb_WritePipe( InterfaceHandle: WINUSB_INTERFACE_HANDLE, PipeID: UCHAR, Buffer: PUCHAR, BufferLength: ULONG, LengthTransferred: PULONG, Overlapped: LPOVERLAPPED, ) -> BOOL100     pub fn WinUsb_WritePipe(
101         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
102         PipeID: UCHAR,
103         Buffer: PUCHAR,
104         BufferLength: ULONG,
105         LengthTransferred: PULONG,
106         Overlapped: LPOVERLAPPED,
107     ) -> BOOL;
WinUsb_ControlTransfer( InterfaceHandle: WINUSB_INTERFACE_HANDLE, SetupPacket: WINUSB_SETUP_PACKET, Buffer: PUCHAR, BufferLength: ULONG, LengthTransferred: PULONG, Overlapped: LPOVERLAPPED, ) -> BOOL108     pub fn WinUsb_ControlTransfer(
109         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
110         SetupPacket: WINUSB_SETUP_PACKET,
111         Buffer: PUCHAR,
112         BufferLength: ULONG,
113         LengthTransferred: PULONG,
114         Overlapped: LPOVERLAPPED,
115     ) -> BOOL;
WinUsb_ResetPipe( InterfaceHandle: WINUSB_INTERFACE_HANDLE, PipeID: UCHAR, ) -> BOOL116     pub fn WinUsb_ResetPipe(
117         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
118         PipeID: UCHAR,
119     ) -> BOOL;
WinUsb_AbortPipe( InterfaceHandle: WINUSB_INTERFACE_HANDLE, PipeID: UCHAR, ) -> BOOL120     pub fn WinUsb_AbortPipe(
121         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
122         PipeID: UCHAR,
123     ) -> BOOL;
WinUsb_FlushPipe( InterfaceHandle: WINUSB_INTERFACE_HANDLE, PipeID: UCHAR, ) -> BOOL124     pub fn WinUsb_FlushPipe(
125         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
126         PipeID: UCHAR,
127     ) -> BOOL;
WinUsb_SetPowerPolicy( InterfaceHandle: WINUSB_INTERFACE_HANDLE, PolicyType: ULONG, ValueLength: ULONG, Value: PVOID, ) -> BOOL128     pub fn WinUsb_SetPowerPolicy(
129         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
130         PolicyType: ULONG,
131         ValueLength: ULONG,
132         Value: PVOID,
133     ) -> BOOL;
WinUsb_GetPowerPolicy( InterfaceHandle: WINUSB_INTERFACE_HANDLE, PolicyType: ULONG, ValueLength: PULONG, Value: PVOID, ) -> BOOL134     pub fn WinUsb_GetPowerPolicy(
135         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
136         PolicyType: ULONG,
137         ValueLength: PULONG,
138         Value: PVOID,
139     ) -> BOOL;
WinUsb_GetOverlappedResult( InterfaceHandle: WINUSB_INTERFACE_HANDLE, lpOverlapped: LPOVERLAPPED, lpNumberOfBytesTransferred: LPDWORD, bWait: BOOL, ) -> BOOL140     pub fn WinUsb_GetOverlappedResult(
141         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
142         lpOverlapped: LPOVERLAPPED,
143         lpNumberOfBytesTransferred: LPDWORD,
144         bWait: BOOL,
145     ) -> BOOL;
WinUsb_ParseConfigurationDescriptor( ConfigurationDescriptor: PUSB_CONFIGURATION_DESCRIPTOR, StartPosition: PVOID, InterfaceNumber: LONG, AlternateSetting: LONG, InterfaceClass: LONG, InterfaceSubClass: LONG, InterfaceProtocol: LONG, ) -> BOOL146     pub fn WinUsb_ParseConfigurationDescriptor(
147         ConfigurationDescriptor: PUSB_CONFIGURATION_DESCRIPTOR,
148         StartPosition: PVOID,
149         InterfaceNumber: LONG,
150         AlternateSetting: LONG,
151         InterfaceClass: LONG,
152         InterfaceSubClass: LONG,
153         InterfaceProtocol: LONG,
154     ) -> BOOL;
WinUsb_ParseDescriptors( DescriptorBuffer: PVOID, TotalLength: ULONG, StartPosition: PVOID, DescriptorType: LONG, ) -> BOOL155     pub fn WinUsb_ParseDescriptors(
156         DescriptorBuffer: PVOID,
157         TotalLength: ULONG,
158         StartPosition: PVOID,
159         DescriptorType: LONG,
160     ) -> BOOL;
WinUsb_GetCurrentFrameNumber( InterfaceHandle: WINUSB_INTERFACE_HANDLE, CurrentFrameNumber: PULONG, TimeStamp: *mut LARGE_INTEGER, ) -> BOOL161     pub fn WinUsb_GetCurrentFrameNumber(
162         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
163         CurrentFrameNumber: PULONG,
164         TimeStamp: *mut LARGE_INTEGER,
165     ) -> BOOL;
WinUsb_GetAdjustedFrameNumber( CurrentFrameNumber: PULONG, TimeStamp: LARGE_INTEGER, ) -> BOOL166     pub fn WinUsb_GetAdjustedFrameNumber(
167         CurrentFrameNumber: PULONG,
168         TimeStamp: LARGE_INTEGER,
169     ) -> BOOL;
WinUsb_RegisterIsochBuffer( InterfaceHandle: WINUSB_INTERFACE_HANDLE, PipeID: UCHAR, Buffer: PUCHAR, BufferLength: ULONG, IsochBufferHandle: PWINUSB_ISOCH_BUFFER_HANDLE, ) -> BOOL170     pub fn WinUsb_RegisterIsochBuffer(
171         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
172         PipeID: UCHAR,
173         Buffer: PUCHAR,
174         BufferLength: ULONG,
175         IsochBufferHandle: PWINUSB_ISOCH_BUFFER_HANDLE,
176     ) -> BOOL;
WinUsb_UnregisterIsochBuffer( IsochBufferHandle: WINUSB_ISOCH_BUFFER_HANDLE, ) -> BOOL177     pub fn WinUsb_UnregisterIsochBuffer(
178         IsochBufferHandle: WINUSB_ISOCH_BUFFER_HANDLE,
179     ) -> BOOL;
WinUsb_WriteIsochPipe( BufferHandle: WINUSB_ISOCH_BUFFER_HANDLE, Offset: ULONG, Length: ULONG, FrameNumber: PULONG, Overlapped: LPOVERLAPPED, ) -> BOOL180     pub fn WinUsb_WriteIsochPipe(
181         BufferHandle: WINUSB_ISOCH_BUFFER_HANDLE,
182         Offset: ULONG,
183         Length: ULONG,
184         FrameNumber: PULONG,
185         Overlapped: LPOVERLAPPED,
186     ) -> BOOL;
WinUsb_ReadIsochPipe( BufferHandle: WINUSB_ISOCH_BUFFER_HANDLE, Offset: ULONG, Length: ULONG, FrameNumber: PULONG, NumberOfPackets: ULONG, IsoPacketDescriptors: PUSBD_ISO_PACKET_DESCRIPTOR, Overlapped: LPOVERLAPPED, ) -> BOOL187     pub fn WinUsb_ReadIsochPipe(
188         BufferHandle: WINUSB_ISOCH_BUFFER_HANDLE,
189         Offset: ULONG,
190         Length: ULONG,
191         FrameNumber: PULONG,
192         NumberOfPackets: ULONG,
193         IsoPacketDescriptors: PUSBD_ISO_PACKET_DESCRIPTOR,
194         Overlapped: LPOVERLAPPED,
195     ) -> BOOL;
WinUsb_WriteIsochPipeAsap( BufferHandle: WINUSB_ISOCH_BUFFER_HANDLE, Offset: ULONG, Length: ULONG, ContinueStream: BOOL, Overlapped: LPOVERLAPPED, ) -> BOOL196     pub fn WinUsb_WriteIsochPipeAsap(
197         BufferHandle: WINUSB_ISOCH_BUFFER_HANDLE,
198         Offset: ULONG,
199         Length: ULONG,
200         ContinueStream: BOOL,
201         Overlapped: LPOVERLAPPED,
202     ) -> BOOL;
WinUsb_ReadIsochPipeAsap( BufferHandle: WINUSB_ISOCH_BUFFER_HANDLE, Offset: ULONG, Length: ULONG, ContinueStream: BOOL, NumberOfPackets: ULONG, IsoPacketDescriptors: PUSBD_ISO_PACKET_DESCRIPTOR, Overlapped: LPOVERLAPPED, ) -> BOOL203     pub fn WinUsb_ReadIsochPipeAsap(
204         BufferHandle: WINUSB_ISOCH_BUFFER_HANDLE,
205         Offset: ULONG,
206         Length: ULONG,
207         ContinueStream: BOOL,
208         NumberOfPackets: ULONG,
209         IsoPacketDescriptors: PUSBD_ISO_PACKET_DESCRIPTOR,
210         Overlapped: LPOVERLAPPED,
211     ) -> BOOL;
212 }
213 STRUCT!{struct USB_INTERFACE_DESCRIPTOR {
214     bLength: UCHAR,
215     bDescriptorType: UCHAR,
216     bInterfaceNumber: UCHAR,
217     bAlternateSetting: UCHAR,
218     bNumEndpoints: UCHAR,
219     bInterfaceClass: UCHAR,
220     bInterfaceSubClass: UCHAR,
221     bInterfaceProtocol: UCHAR,
222     iInterface: UCHAR,
223 }}
224 pub type PUSB_INTERFACE_DESCRIPTOR = *mut USB_INTERFACE_DESCRIPTOR;
225