1 // Copyright © 2016-2017 winapi-rs developers
2 // Licensed under the Apache License, Version 2.0
3 // <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
4 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
5 // All files in the project carrying such notice may not be copied, modified, or distributed
6 // except according to those terms.
7 //! FFI bindings to winusb.
8 use shared::minwindef::{BOOL, LPDWORD, PUCHAR, PULONG, UCHAR, ULONG, USHORT};
9 use shared::usb::PUSBD_ISO_PACKET_DESCRIPTOR;
10 use shared::usbspec::PUSB_CONFIGURATION_DESCRIPTOR;
11 use shared::winusbio::{PWINUSB_PIPE_INFORMATION, PWINUSB_PIPE_INFORMATION_EX};
12 use um::minwinbase::LPOVERLAPPED;
13 use um::winnt::{HANDLE, LARGE_INTEGER, LONG, PVOID};
14 pub type WINUSB_INTERFACE_HANDLE = PVOID;
15 pub type PWINUSB_INTERFACE_HANDLE = *mut PVOID;
16 pub type WINUSB_ISOCH_BUFFER_HANDLE = PVOID;
17 pub type PWINUSB_ISOCH_BUFFER_HANDLE = *mut PVOID;
18 STRUCT!{#[repr(packed)] struct WINUSB_SETUP_PACKET {
19     RequestType: UCHAR,
20     Request: UCHAR,
21     Value: USHORT,
22     Index: USHORT,
23     Length: USHORT,
24 }}
25 pub type PWINUSB_SETUP_PACKET = *mut WINUSB_SETUP_PACKET;
26 extern "system" {
WinUsb_Initialize( DeviceHandle: HANDLE, InterfaceHandle: PWINUSB_INTERFACE_HANDLE, ) -> BOOL27     pub fn WinUsb_Initialize(
28         DeviceHandle: HANDLE,
29         InterfaceHandle: PWINUSB_INTERFACE_HANDLE,
30     ) -> BOOL;
WinUsb_Free( InterfaceHandle: WINUSB_INTERFACE_HANDLE, ) -> BOOL31     pub fn WinUsb_Free(
32         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
33     ) -> BOOL;
WinUsb_GetAssociatedInterface( InterfaceHandle: WINUSB_INTERFACE_HANDLE, AssociatedInterfaceIndex: UCHAR, AssociatedInterfaceHandle: PWINUSB_INTERFACE_HANDLE, ) -> BOOL34     pub fn WinUsb_GetAssociatedInterface(
35         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
36         AssociatedInterfaceIndex: UCHAR,
37         AssociatedInterfaceHandle: PWINUSB_INTERFACE_HANDLE,
38     ) -> BOOL;
WinUsb_GetDescriptor( InterfaceHandle: WINUSB_INTERFACE_HANDLE, DescriptorType: UCHAR, Index: UCHAR, LanguageID: USHORT, Buffer: PUCHAR, BufferLength: ULONG, LengthTransferred: PULONG, ) -> BOOL39     pub fn WinUsb_GetDescriptor(
40         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
41         DescriptorType: UCHAR,
42         Index: UCHAR,
43         LanguageID: USHORT,
44         Buffer: PUCHAR,
45         BufferLength: ULONG,
46         LengthTransferred: PULONG,
47     ) -> BOOL;
WinUsb_QueryInterfaceSettings( InterfaceHandle: WINUSB_INTERFACE_HANDLE, AlternateInterfaceNumber: UCHAR, UsbAltInterfaceDescriptor: PUSB_INTERFACE_DESCRIPTOR, ) -> BOOL48     pub fn WinUsb_QueryInterfaceSettings(
49         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
50         AlternateInterfaceNumber: UCHAR,
51         UsbAltInterfaceDescriptor: PUSB_INTERFACE_DESCRIPTOR,
52     ) -> BOOL;
WinUsb_QueryDeviceInformation( InterfaceHandle: WINUSB_INTERFACE_HANDLE, InformationType: ULONG, BufferLength: PULONG, Buffer: PVOID, ) -> BOOL53     pub fn WinUsb_QueryDeviceInformation(
54         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
55         InformationType: ULONG,
56         BufferLength: PULONG,
57         Buffer: PVOID,
58     ) -> BOOL;
WinUsb_SetCurrentAlternateSetting( InterfaceHandle: WINUSB_INTERFACE_HANDLE, SettingNumber: UCHAR, ) -> BOOL59     pub fn WinUsb_SetCurrentAlternateSetting(
60         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
61         SettingNumber: UCHAR,
62     ) -> BOOL;
WinUsb_GetCurrentAlternateSetting( InterfaceHandle: WINUSB_INTERFACE_HANDLE, SettingNumber: PUCHAR, ) -> BOOL63     pub fn WinUsb_GetCurrentAlternateSetting(
64         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
65         SettingNumber: PUCHAR,
66     ) -> BOOL;
WinUsb_QueryPipe( InterfaceHandle: WINUSB_INTERFACE_HANDLE, AlternateInterfaceNumber: UCHAR, PipeIndex: UCHAR, PipeInformationEx: PWINUSB_PIPE_INFORMATION, ) -> BOOL67     pub fn WinUsb_QueryPipe(
68         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
69         AlternateInterfaceNumber: UCHAR,
70         PipeIndex: UCHAR,
71         PipeInformationEx: PWINUSB_PIPE_INFORMATION,
72     ) -> BOOL;
WinUsb_QueryPipeEx( InterfaceHandle: WINUSB_INTERFACE_HANDLE, AlternateInterfaceNumber: UCHAR, PipeIndex: UCHAR, PipeInformationEx: PWINUSB_PIPE_INFORMATION_EX, ) -> BOOL73     pub fn WinUsb_QueryPipeEx(
74         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
75         AlternateInterfaceNumber: UCHAR,
76         PipeIndex: UCHAR,
77         PipeInformationEx: PWINUSB_PIPE_INFORMATION_EX,
78     ) -> BOOL;
WinUsb_SetPipePolicy( InterfaceHandle: WINUSB_INTERFACE_HANDLE, PipeID: UCHAR, PolicyType: ULONG, ValueLength: ULONG, Value: PVOID, ) -> BOOL79     pub fn WinUsb_SetPipePolicy(
80         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
81         PipeID: UCHAR,
82         PolicyType: ULONG,
83         ValueLength: ULONG,
84         Value: PVOID,
85     ) -> BOOL;
WinUsb_GetPipePolicy( InterfaceHandle: WINUSB_INTERFACE_HANDLE, PipeID: UCHAR, PolicyType: ULONG, ValueLength: PULONG, Value: PVOID, ) -> BOOL86     pub fn WinUsb_GetPipePolicy(
87         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
88         PipeID: UCHAR,
89         PolicyType: ULONG,
90         ValueLength: PULONG,
91         Value: PVOID,
92     ) -> BOOL;
WinUsb_ReadPipe( InterfaceHandle: WINUSB_INTERFACE_HANDLE, PipeID: UCHAR, Buffer: PUCHAR, BufferLength: ULONG, LengthTransferred: PULONG, Overlapped: LPOVERLAPPED, ) -> BOOL93     pub fn WinUsb_ReadPipe(
94         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
95         PipeID: UCHAR,
96         Buffer: PUCHAR,
97         BufferLength: ULONG,
98         LengthTransferred: PULONG,
99         Overlapped: LPOVERLAPPED,
100     ) -> BOOL;
WinUsb_WritePipe( InterfaceHandle: WINUSB_INTERFACE_HANDLE, PipeID: UCHAR, Buffer: PUCHAR, BufferLength: ULONG, LengthTransferred: PULONG, Overlapped: LPOVERLAPPED, ) -> BOOL101     pub fn WinUsb_WritePipe(
102         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
103         PipeID: UCHAR,
104         Buffer: PUCHAR,
105         BufferLength: ULONG,
106         LengthTransferred: PULONG,
107         Overlapped: LPOVERLAPPED,
108     ) -> BOOL;
WinUsb_ControlTransfer( InterfaceHandle: WINUSB_INTERFACE_HANDLE, SetupPacket: WINUSB_SETUP_PACKET, Buffer: PUCHAR, BufferLength: ULONG, LengthTransferred: PULONG, Overlapped: LPOVERLAPPED, ) -> BOOL109     pub fn WinUsb_ControlTransfer(
110         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
111         SetupPacket: WINUSB_SETUP_PACKET,
112         Buffer: PUCHAR,
113         BufferLength: ULONG,
114         LengthTransferred: PULONG,
115         Overlapped: LPOVERLAPPED,
116     ) -> BOOL;
WinUsb_ResetPipe( InterfaceHandle: WINUSB_INTERFACE_HANDLE, PipeID: UCHAR, ) -> BOOL117     pub fn WinUsb_ResetPipe(
118         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
119         PipeID: UCHAR,
120     ) -> BOOL;
WinUsb_AbortPipe( InterfaceHandle: WINUSB_INTERFACE_HANDLE, PipeID: UCHAR, ) -> BOOL121     pub fn WinUsb_AbortPipe(
122         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
123         PipeID: UCHAR,
124     ) -> BOOL;
WinUsb_FlushPipe( InterfaceHandle: WINUSB_INTERFACE_HANDLE, PipeID: UCHAR, ) -> BOOL125     pub fn WinUsb_FlushPipe(
126         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
127         PipeID: UCHAR,
128     ) -> BOOL;
WinUsb_SetPowerPolicy( InterfaceHandle: WINUSB_INTERFACE_HANDLE, PolicyType: ULONG, ValueLength: ULONG, Value: PVOID, ) -> BOOL129     pub fn WinUsb_SetPowerPolicy(
130         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
131         PolicyType: ULONG,
132         ValueLength: ULONG,
133         Value: PVOID,
134     ) -> BOOL;
WinUsb_GetPowerPolicy( InterfaceHandle: WINUSB_INTERFACE_HANDLE, PolicyType: ULONG, ValueLength: PULONG, Value: PVOID, ) -> BOOL135     pub fn WinUsb_GetPowerPolicy(
136         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
137         PolicyType: ULONG,
138         ValueLength: PULONG,
139         Value: PVOID,
140     ) -> BOOL;
WinUsb_GetOverlappedResult( InterfaceHandle: WINUSB_INTERFACE_HANDLE, lpOverlapped: LPOVERLAPPED, lpNumberOfBytesTransferred: LPDWORD, bWait: BOOL, ) -> BOOL141     pub fn WinUsb_GetOverlappedResult(
142         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
143         lpOverlapped: LPOVERLAPPED,
144         lpNumberOfBytesTransferred: LPDWORD,
145         bWait: BOOL,
146     ) -> BOOL;
WinUsb_ParseConfigurationDescriptor( ConfigurationDescriptor: PUSB_CONFIGURATION_DESCRIPTOR, StartPosition: PVOID, InterfaceNumber: LONG, AlternateSetting: LONG, InterfaceClass: LONG, InterfaceSubClass: LONG, InterfaceProtocol: LONG, ) -> BOOL147     pub fn WinUsb_ParseConfigurationDescriptor(
148         ConfigurationDescriptor: PUSB_CONFIGURATION_DESCRIPTOR,
149         StartPosition: PVOID,
150         InterfaceNumber: LONG,
151         AlternateSetting: LONG,
152         InterfaceClass: LONG,
153         InterfaceSubClass: LONG,
154         InterfaceProtocol: LONG,
155     ) -> BOOL;
WinUsb_ParseDescriptors( DescriptorBuffer: PVOID, TotalLength: ULONG, StartPosition: PVOID, DescriptorType: LONG, ) -> BOOL156     pub fn WinUsb_ParseDescriptors(
157         DescriptorBuffer: PVOID,
158         TotalLength: ULONG,
159         StartPosition: PVOID,
160         DescriptorType: LONG,
161     ) -> BOOL;
WinUsb_GetCurrentFrameNumber( InterfaceHandle: WINUSB_INTERFACE_HANDLE, CurrentFrameNumber: PULONG, TimeStamp: *mut LARGE_INTEGER, ) -> BOOL162     pub fn WinUsb_GetCurrentFrameNumber(
163         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
164         CurrentFrameNumber: PULONG,
165         TimeStamp: *mut LARGE_INTEGER,
166     ) -> BOOL;
WinUsb_GetAdjustedFrameNumber( CurrentFrameNumber: PULONG, TimeStamp: LARGE_INTEGER, ) -> BOOL167     pub fn WinUsb_GetAdjustedFrameNumber(
168         CurrentFrameNumber: PULONG,
169         TimeStamp: LARGE_INTEGER,
170     ) -> BOOL;
WinUsb_RegisterIsochBuffer( InterfaceHandle: WINUSB_INTERFACE_HANDLE, PipeID: UCHAR, Buffer: PUCHAR, BufferLength: ULONG, IsochBufferHandle: PWINUSB_ISOCH_BUFFER_HANDLE, ) -> BOOL171     pub fn WinUsb_RegisterIsochBuffer(
172         InterfaceHandle: WINUSB_INTERFACE_HANDLE,
173         PipeID: UCHAR,
174         Buffer: PUCHAR,
175         BufferLength: ULONG,
176         IsochBufferHandle: PWINUSB_ISOCH_BUFFER_HANDLE,
177     ) -> BOOL;
WinUsb_UnregisterIsochBuffer( IsochBufferHandle: WINUSB_ISOCH_BUFFER_HANDLE, ) -> BOOL178     pub fn WinUsb_UnregisterIsochBuffer(
179         IsochBufferHandle: WINUSB_ISOCH_BUFFER_HANDLE,
180     ) -> BOOL;
WinUsb_WriteIsochPipe( BufferHandle: WINUSB_ISOCH_BUFFER_HANDLE, Offset: ULONG, Length: ULONG, FrameNumber: PULONG, Overlapped: LPOVERLAPPED, ) -> BOOL181     pub fn WinUsb_WriteIsochPipe(
182         BufferHandle: WINUSB_ISOCH_BUFFER_HANDLE,
183         Offset: ULONG,
184         Length: ULONG,
185         FrameNumber: PULONG,
186         Overlapped: LPOVERLAPPED,
187     ) -> BOOL;
WinUsb_ReadIsochPipe( BufferHandle: WINUSB_ISOCH_BUFFER_HANDLE, Offset: ULONG, Length: ULONG, FrameNumber: PULONG, NumberOfPackets: ULONG, IsoPacketDescriptors: PUSBD_ISO_PACKET_DESCRIPTOR, Overlapped: LPOVERLAPPED, ) -> BOOL188     pub fn WinUsb_ReadIsochPipe(
189         BufferHandle: WINUSB_ISOCH_BUFFER_HANDLE,
190         Offset: ULONG,
191         Length: ULONG,
192         FrameNumber: PULONG,
193         NumberOfPackets: ULONG,
194         IsoPacketDescriptors: PUSBD_ISO_PACKET_DESCRIPTOR,
195         Overlapped: LPOVERLAPPED,
196     ) -> BOOL;
WinUsb_WriteIsochPipeAsap( BufferHandle: WINUSB_ISOCH_BUFFER_HANDLE, Offset: ULONG, Length: ULONG, ContinueStream: BOOL, Overlapped: LPOVERLAPPED, ) -> BOOL197     pub fn WinUsb_WriteIsochPipeAsap(
198         BufferHandle: WINUSB_ISOCH_BUFFER_HANDLE,
199         Offset: ULONG,
200         Length: ULONG,
201         ContinueStream: BOOL,
202         Overlapped: LPOVERLAPPED,
203     ) -> BOOL;
WinUsb_ReadIsochPipeAsap( BufferHandle: WINUSB_ISOCH_BUFFER_HANDLE, Offset: ULONG, Length: ULONG, ContinueStream: BOOL, NumberOfPackets: ULONG, IsoPacketDescriptors: PUSBD_ISO_PACKET_DESCRIPTOR, Overlapped: LPOVERLAPPED, ) -> BOOL204     pub fn WinUsb_ReadIsochPipeAsap(
205         BufferHandle: WINUSB_ISOCH_BUFFER_HANDLE,
206         Offset: ULONG,
207         Length: ULONG,
208         ContinueStream: BOOL,
209         NumberOfPackets: ULONG,
210         IsoPacketDescriptors: PUSBD_ISO_PACKET_DESCRIPTOR,
211         Overlapped: LPOVERLAPPED,
212     ) -> BOOL;
213 }
214 STRUCT!{struct USB_INTERFACE_DESCRIPTOR {
215     bLength: UCHAR,
216     bDescriptorType: UCHAR,
217     bInterfaceNumber: UCHAR,
218     bAlternateSetting: UCHAR,
219     bNumEndpoints: UCHAR,
220     bInterfaceClass: UCHAR,
221     bInterfaceSubClass: UCHAR,
222     bInterfaceProtocol: UCHAR,
223     iInterface: UCHAR,
224 }}
225 pub type PUSB_INTERFACE_DESCRIPTOR = *mut USB_INTERFACE_DESCRIPTOR;
226