diff options
Diffstat (limited to 'libusb/os/windows_winusb.h')
-rw-r--r-- | libusb/os/windows_winusb.h | 158 |
1 files changed, 80 insertions, 78 deletions
diff --git a/libusb/os/windows_winusb.h b/libusb/os/windows_winusb.h index 6ac39c3..57d4b7f 100644 --- a/libusb/os/windows_winusb.h +++ b/libusb/os/windows_winusb.h @@ -69,6 +69,8 @@ const GUID GUID_DEVINTERFACE_USB_HUB = {0xF18A0E88, 0xC30C, 0x11D0, {0x88, 0x15, const GUID GUID_DEVINTERFACE_LIBUSB0_FILTER = {0xF9F3FF14, 0xAE21, 0x48A0, {0x8A, 0x25, 0x80, 0x11, 0xA7, 0xA9, 0x31, 0xD9}}; #endif +// The following define MUST be == sizeof(USB_DESCRIPTOR_REQUEST) +#define USB_DESCRIPTOR_REQUEST_SIZE 12U /* * Multiple USB API backend support @@ -93,7 +95,7 @@ struct windows_usb_api_backend { const char * const designation; const char * const * const driver_name_list; // Driver name, without .sys, e.g. "usbccgp" const uint8_t nb_driver_names; - int (*init)(struct libusb_context *ctx); + bool (*init)(struct libusb_context *ctx); void (*exit)(void); int (*open)(int sub_api, struct libusb_device_handle *dev_handle); void (*close)(int sub_api, struct libusb_device_handle *dev_handle); @@ -106,9 +108,8 @@ struct windows_usb_api_backend { int (*submit_bulk_transfer)(int sub_api, struct usbi_transfer *itransfer); int (*submit_iso_transfer)(int sub_api, struct usbi_transfer *itransfer); int (*submit_control_transfer)(int sub_api, struct usbi_transfer *itransfer); - int (*abort_control)(int sub_api, struct usbi_transfer *itransfer); - int (*abort_transfers)(int sub_api, struct usbi_transfer *itransfer); - int (*copy_transfer_data)(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size); + int (*cancel_transfer)(int sub_api, struct usbi_transfer *itransfer); + enum libusb_transfer_status (*copy_transfer_data)(int sub_api, struct usbi_transfer *itransfer, DWORD length); }; extern const struct windows_usb_api_backend usb_api_backend[USB_API_MAX]; @@ -226,8 +227,11 @@ static inline void winusb_device_priv_release(struct libusb_device *dev) free(p->dev_id); free(p->path); if ((dev->num_configurations > 0) && (p->config_descriptor != NULL)) { - for (i = 0; i < dev->num_configurations; i++) - free(p->config_descriptor[i]); + for (i = 0; i < dev->num_configurations; i++) { + if (p->config_descriptor[i] == NULL) + continue; + free((UCHAR *)p->config_descriptor[i] - USB_DESCRIPTOR_REQUEST_SIZE); + } } free(p->config_descriptor); free(p->hid); @@ -422,6 +426,12 @@ typedef struct _USB_NODE_CONNECTION_INFORMATION_EX_V2 { /* libusbK */ #define ISO_ALWAYS_START_ASAP 0x21 +typedef struct _USBD_ISO_PACKET_DESCRIPTOR { + ULONG Offset; + ULONG Length; + USBD_STATUS Status; +} USBD_ISO_PACKET_DESCRIPTOR, *PUSBD_ISO_PACKET_DESCRIPTOR; + typedef enum _USBD_PIPE_TYPE { UsbdPipeTypeControl, UsbdPipeTypeIsochronous, @@ -429,6 +439,14 @@ typedef enum _USBD_PIPE_TYPE { UsbdPipeTypeInterrupt } USBD_PIPE_TYPE; +typedef struct { + USBD_PIPE_TYPE PipeType; + UCHAR PipeId; + USHORT MaximumPacketSize; + UCHAR Interval; + ULONG MaximumBytesPerInterval; +} WINUSB_PIPE_INFORMATION_EX, *PWINUSB_PIPE_INFORMATION_EX; + #include <pshpack1.h> typedef struct _WINUSB_SETUP_PACKET { @@ -441,7 +459,8 @@ typedef struct _WINUSB_SETUP_PACKET { #include <poppack.h> -typedef void *WINUSB_INTERFACE_HANDLE, *PWINUSB_INTERFACE_HANDLE; +typedef PVOID WINUSB_INTERFACE_HANDLE, *PWINUSB_INTERFACE_HANDLE; +typedef PVOID WINUSB_ISOCH_BUFFER_HANDLE, *PWINUSB_ISOCH_BUFFER_HANDLE; typedef BOOL (WINAPI *WinUsb_AbortPipe_t)( WINUSB_INTERFACE_HANDLE InterfaceHandle, @@ -471,6 +490,21 @@ typedef BOOL (WINAPI *WinUsb_Initialize_t)( HANDLE DeviceHandle, PWINUSB_INTERFACE_HANDLE InterfaceHandle ); +typedef BOOL (WINAPI *WinUsb_QueryPipeEx_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR AlternateInterfaceHandle, + UCHAR PipeIndex, + PWINUSB_PIPE_INFORMATION_EX PipeInformationEx +); +typedef BOOL (WINAPI *WinUsb_ReadIsochPipeAsap_t)( + PWINUSB_ISOCH_BUFFER_HANDLE BufferHandle, + ULONG Offset, + ULONG Length, + BOOL ContinueStream, + ULONG NumberOfPackets, + PUSBD_ISO_PACKET_DESCRIPTOR IsoPacketDescriptors, + LPOVERLAPPED Overlapped +); typedef BOOL (WINAPI *WinUsb_ReadPipe_t)( WINUSB_INTERFACE_HANDLE InterfaceHandle, UCHAR PipeID, @@ -479,8 +513,12 @@ typedef BOOL (WINAPI *WinUsb_ReadPipe_t)( PULONG LengthTransferred, LPOVERLAPPED Overlapped ); -typedef BOOL (WINAPI *WinUsb_ResetDevice_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle +typedef BOOL (WINAPI *WinUsb_RegisterIsochBuffer_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR PipeID, + PVOID Buffer, + ULONG BufferLength, + PWINUSB_ISOCH_BUFFER_HANDLE BufferHandle ); typedef BOOL (WINAPI *WinUsb_ResetPipe_t)( WINUSB_INTERFACE_HANDLE InterfaceHandle, @@ -497,29 +535,9 @@ typedef BOOL (WINAPI *WinUsb_SetPipePolicy_t)( ULONG ValueLength, PVOID Value ); -typedef BOOL (WINAPI *WinUsb_WritePipe_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - UCHAR PipeID, - PUCHAR Buffer, - ULONG BufferLength, - PULONG LengthTransferred, - LPOVERLAPPED Overlapped -); - -typedef PVOID WINUSB_ISOCH_BUFFER_HANDLE, *PWINUSB_ISOCH_BUFFER_HANDLE; - -typedef BOOL (WINAPI *WinUsb_RegisterIsochBuffer_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - UCHAR PipeID, - PVOID Buffer, - ULONG BufferLength, - PWINUSB_ISOCH_BUFFER_HANDLE BufferHandle -); - typedef BOOL (WINAPI *WinUsb_UnregisterIsochBuffer_t)( WINUSB_ISOCH_BUFFER_HANDLE BufferHandle ); - typedef BOOL (WINAPI *WinUsb_WriteIsochPipeAsap_t)( WINUSB_ISOCH_BUFFER_HANDLE BufferHandle, ULONG Offset, @@ -527,37 +545,13 @@ typedef BOOL (WINAPI *WinUsb_WriteIsochPipeAsap_t)( BOOL ContinueStream, LPOVERLAPPED Overlapped ); - -typedef LONG USBD_STATUS; -typedef struct { - ULONG Offset; - ULONG Length; - USBD_STATUS Status; -} USBD_ISO_PACKET_DESCRIPTOR, *PUSBD_ISO_PACKET_DESCRIPTOR; - -typedef BOOL (WINAPI *WinUsb_ReadIsochPipeAsap_t)( - PWINUSB_ISOCH_BUFFER_HANDLE BufferHandle, - ULONG Offset, - ULONG Length, - BOOL ContinueStream, - ULONG NumberOfPackets, - PUSBD_ISO_PACKET_DESCRIPTOR IsoPacketDescriptors, - LPOVERLAPPED Overlapped -); - -typedef struct { - USBD_PIPE_TYPE PipeType; - UCHAR PipeId; - USHORT MaximumPacketSize; - UCHAR Interval; - ULONG MaximumBytesPerInterval; -} WINUSB_PIPE_INFORMATION_EX, *PWINUSB_PIPE_INFORMATION_EX; - -typedef BOOL (WINAPI *WinUsb_QueryPipeEx_t)( +typedef BOOL (WINAPI *WinUsb_WritePipe_t)( WINUSB_INTERFACE_HANDLE InterfaceHandle, - UCHAR AlternateInterfaceHandle, - UCHAR PipeIndex, - PWINUSB_PIPE_INFORMATION_EX PipeInformationEx + UCHAR PipeID, + PUCHAR Buffer, + ULONG BufferLength, + PULONG LengthTransferred, + LPOVERLAPPED Overlapped ); /* /!\ These must match the ones from the official libusbk.h */ @@ -607,15 +601,19 @@ typedef struct _KLIB_VERSION { } KLIB_VERSION, *PKLIB_VERSION; typedef BOOL (WINAPI *LibK_GetProcAddress_t)( - PVOID *ProcAddress, - ULONG DriverID, - ULONG FunctionID + PVOID ProcAddress, + INT DriverID, + INT FunctionID ); typedef VOID (WINAPI *LibK_GetVersion_t)( PKLIB_VERSION Version ); +typedef BOOL (WINAPI *LibK_ResetDevice_t)( + WINUSB_INTERFACE_HANDLE InterfaceHandle +); + //KISO_PACKET is equivalent of libusb_iso_packet_descriptor except uses absolute "offset" field instead of sequential Lengths typedef struct _KISO_PACKET { UINT offset; @@ -638,7 +636,7 @@ typedef struct _KISO_CONTEXT { KISO_PACKET IsoPackets[0]; } KISO_CONTEXT, *PKISO_CONTEXT; -typedef BOOL(WINAPI *WinUsb_IsoReadPipe_t)( +typedef BOOL(WINAPI *LibK_IsoReadPipe_t)( WINUSB_INTERFACE_HANDLE InterfaceHandle, UCHAR PipeID, PUCHAR Buffer, @@ -647,7 +645,7 @@ typedef BOOL(WINAPI *WinUsb_IsoReadPipe_t)( PKISO_CONTEXT IsoContext ); -typedef BOOL(WINAPI *WinUsb_IsoWritePipe_t)( +typedef BOOL(WINAPI *LibK_IsoWritePipe_t)( WINUSB_INTERFACE_HANDLE InterfaceHandle, UCHAR PipeID, PUCHAR Buffer, @@ -657,8 +655,7 @@ typedef BOOL(WINAPI *WinUsb_IsoWritePipe_t)( ); struct winusb_interface { - bool initialized; - bool CancelIoEx_supported; + HMODULE hDll; WinUsb_AbortPipe_t AbortPipe; WinUsb_ControlTransfer_t ControlTransfer; WinUsb_FlushPipe_t FlushPipe; @@ -666,22 +663,27 @@ struct winusb_interface { WinUsb_GetAssociatedInterface_t GetAssociatedInterface; WinUsb_Initialize_t Initialize; WinUsb_ReadPipe_t ReadPipe; - WinUsb_ResetDevice_t ResetDevice; WinUsb_ResetPipe_t ResetPipe; WinUsb_SetCurrentAlternateSetting_t SetCurrentAlternateSetting; WinUsb_SetPipePolicy_t SetPipePolicy; WinUsb_WritePipe_t WritePipe; - - // Isochoronous functions for LibUSBk sub api: - WinUsb_IsoReadPipe_t IsoReadPipe; - WinUsb_IsoWritePipe_t IsoWritePipe; - - // Isochronous functions for Microsoft WinUSB sub api (native WinUSB): - WinUsb_RegisterIsochBuffer_t RegisterIsochBuffer; - WinUsb_UnregisterIsochBuffer_t UnregisterIsochBuffer; - WinUsb_WriteIsochPipeAsap_t WriteIsochPipeAsap; - WinUsb_ReadIsochPipeAsap_t ReadIsochPipeAsap; - WinUsb_QueryPipeEx_t QueryPipeEx; + union { + struct { + // Isochoronous functions for libusbK sub api: + LibK_IsoReadPipe_t IsoReadPipe; + LibK_IsoWritePipe_t IsoWritePipe; + // Reset device function for libusbK sub api: + LibK_ResetDevice_t ResetDevice; + }; + struct { + // Isochronous functions for WinUSB sub api: + WinUsb_QueryPipeEx_t QueryPipeEx; + WinUsb_ReadIsochPipeAsap_t ReadIsochPipeAsap; + WinUsb_RegisterIsochBuffer_t RegisterIsochBuffer; + WinUsb_UnregisterIsochBuffer_t UnregisterIsochBuffer; + WinUsb_WriteIsochPipeAsap_t WriteIsochPipeAsap; + }; + }; }; /* hid.dll interface */ |