summaryrefslogtreecommitdiff
path: root/libusb/os/windows_nt_common.h
diff options
context:
space:
mode:
authorChris Dickens <christopher.a.dickens@gmail.com>2018-01-08 10:17:26 -0800
committerChris Dickens <christopher.a.dickens@gmail.com>2018-01-08 10:17:26 -0800
commit54884e84d024e761450287ab56aca8fc69f45d01 (patch)
tree84209847fcee262dd4731e26a910940ca038b582 /libusb/os/windows_nt_common.h
parentd0779e93032affec1dcf04a5bba18f3968aa7922 (diff)
downloadlibusb-54884e84d024e761450287ab56aca8fc69f45d01.tar.gz
Windows: Enable dynamic selection between WinUSB and UsbDk backends
This commit unifies the two Windows backends into a single project and enables the user to switch to the UsbDk backend, if available, using the libusb_set_option() function. All contexts will use the WinUSB backend by default for backwards compatibility. With this change, the UsbDk-specific projects are no longer required. Closes #309 Signed-off-by: Chris Dickens <christopher.a.dickens@gmail.com>
Diffstat (limited to 'libusb/os/windows_nt_common.h')
-rw-r--r--libusb/os/windows_nt_common.h97
1 files changed, 68 insertions, 29 deletions
diff --git a/libusb/os/windows_nt_common.h b/libusb/os/windows_nt_common.h
index d3ac6bc..e155b5d 100644
--- a/libusb/os/windows_nt_common.h
+++ b/libusb/os/windows_nt_common.h
@@ -26,45 +26,84 @@
#pragma once
-// Missing from MinGW
-#if !defined(FACILITY_SETUPAPI)
-#define FACILITY_SETUPAPI 15
-#endif
-
-#include <pshpack1.h>
+#include "windows_nt_shared_types.h"
-typedef struct USB_CONFIGURATION_DESCRIPTOR {
- UCHAR bLength;
- UCHAR bDescriptorType;
- USHORT wTotalLength;
- UCHAR bNumInterfaces;
- UCHAR bConfigurationValue;
- UCHAR iConfiguration;
- UCHAR bmAttributes;
- UCHAR MaxPower;
-} USB_CONFIGURATION_DESCRIPTOR, *PUSB_CONFIGURATION_DESCRIPTOR;
+ /* Windows versions */
+enum windows_version {
+ WINDOWS_UNDEFINED,
+ WINDOWS_2000,
+ WINDOWS_XP,
+ WINDOWS_2003, // Also XP x64
+ WINDOWS_VISTA,
+ WINDOWS_7,
+ WINDOWS_8,
+ WINDOWS_8_1,
+ WINDOWS_10,
+ WINDOWS_11_OR_LATER
+};
-#include <poppack.h>
-
-typedef struct libusb_device_descriptor USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR;
+extern enum windows_version windows_version;
/* This call is only available from Vista */
extern BOOL (WINAPI *pCancelIoEx)(HANDLE, LPOVERLAPPED);
-int windows_common_init(struct libusb_context *ctx);
-void windows_common_exit(void);
+struct windows_backend {
+ int (*init)(struct libusb_context *ctx);
+ void (*exit)(struct libusb_context *ctx);
+ int (*get_device_list)(struct libusb_context *ctx,
+ struct discovered_devs **discdevs);
+ int (*open)(struct libusb_device_handle *dev_handle);
+ void (*close)(struct libusb_device_handle *dev_handle);
+ int (*get_device_descriptor)(struct libusb_device *device, unsigned char *buffer);
+ int (*get_active_config_descriptor)(struct libusb_device *device,
+ unsigned char *buffer, size_t len);
+ int (*get_config_descriptor)(struct libusb_device *device,
+ uint8_t config_index, unsigned char *buffer, size_t len);
+ int (*get_config_descriptor_by_value)(struct libusb_device *device,
+ uint8_t bConfigurationValue, unsigned char **buffer);
+ int (*get_configuration)(struct libusb_device_handle *dev_handle, int *config);
+ int (*set_configuration)(struct libusb_device_handle *dev_handle, int config);
+ int (*claim_interface)(struct libusb_device_handle *dev_handle, int interface_number);
+ int (*release_interface)(struct libusb_device_handle *dev_handle, int interface_number);
+ int (*set_interface_altsetting)(struct libusb_device_handle *dev_handle,
+ int interface_number, int altsetting);
+ int (*clear_halt)(struct libusb_device_handle *dev_handle,
+ unsigned char endpoint);
+ int (*reset_device)(struct libusb_device_handle *dev_handle);
+ void (*destroy_device)(struct libusb_device *dev);
+ int (*submit_transfer)(struct usbi_transfer *itransfer);
+ int (*cancel_transfer)(struct usbi_transfer *itransfer);
+ void (*clear_transfer_priv)(struct usbi_transfer *itransfer);
+ int (*copy_transfer_data)(struct usbi_transfer *itransfer, uint32_t io_size);
+ int (*get_transfer_fd)(struct usbi_transfer *itransfer);
+ void (*get_overlapped_result)(struct usbi_transfer *itransfer,
+ DWORD *io_result, DWORD *io_size);
+};
-unsigned long htab_hash(const char *str);
-int windows_clock_gettime(int clk_id, struct timespec *tp);
+struct windows_context_priv {
+ const struct windows_backend *backend;
+};
-void windows_clear_transfer_priv(struct usbi_transfer *itransfer);
-int windows_copy_transfer_data(struct usbi_transfer *itransfer, uint32_t io_size);
-int windows_get_transfer_fd(struct usbi_transfer *itransfer);
-void windows_get_overlapped_result(struct usbi_transfer *itransfer, DWORD *io_result, DWORD *io_size);
+union windows_device_priv {
+ struct usbdk_device_priv usbdk_priv;
+ struct winusb_device_priv winusb_priv;
+};
+union windows_device_handle_priv {
+ struct usbdk_device_handle_priv usbdk_priv;
+ struct winusb_device_handle_priv winusb_priv;
+};
+
+union windows_transfer_priv {
+ struct usbdk_transfer_priv usbdk_priv;
+ struct winusb_transfer_priv winusb_priv;
+};
+
+extern const struct windows_backend usbdk_backend;
+extern const struct windows_backend winusb_backend;
+
+unsigned long htab_hash(const char *str);
void windows_force_sync_completion(OVERLAPPED *overlapped, ULONG size);
-void windows_handle_callback(struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size);
-int windows_handle_events(struct libusb_context *ctx, struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready);
#if defined(ENABLE_LOGGING)
const char *windows_error_str(DWORD error_code);