usb 2.1.1 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/README.md +4 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/usb/bindings.d.ts +4 -0
- package/dist/usb/device.js +5 -0
- package/dist/usb/device.js.map +1 -1
- package/dist/usb/interface.d.ts +1 -1
- package/dist/usb/interface.js +1 -5
- package/dist/usb/interface.js.map +1 -1
- package/dist/webusb/webusb-device.d.ts +2 -1
- package/dist/webusb/webusb-device.js +21 -14
- package/dist/webusb/webusb-device.js.map +1 -1
- package/libusb/.gitattributes +2 -6
- package/libusb/.private/appveyor_build.sh +22 -0
- package/libusb/.private/bm.sh +1 -1
- package/libusb/.private/ci-build.sh +67 -0
- package/libusb/.private/post-rewrite.sh +5 -1
- package/libusb/.private/pre-commit.sh +5 -1
- package/libusb/.private/wbs.txt +4 -19
- package/libusb/.travis.yml +32 -23
- package/libusb/AUTHORS +76 -3
- package/libusb/ChangeLog +41 -3
- package/libusb/INSTALL_WIN.txt +22 -44
- package/libusb/Makefile.am +32 -10
- package/libusb/{README.md → README} +2 -2
- package/libusb/README.git +3 -3
- package/libusb/Xcode/common.xcconfig +23 -19
- package/libusb/Xcode/config.h +25 -13
- package/libusb/Xcode/libusb.xcodeproj/project.pbxproj +511 -109
- package/libusb/android/README +90 -54
- package/libusb/android/config.h +23 -43
- package/libusb/android/examples/unrooted_android.c +301 -0
- package/libusb/android/examples/unrooted_android.h +36 -0
- package/libusb/android/jni/Android.mk +1 -1
- package/libusb/android/jni/Application.mk +16 -0
- package/libusb/android/jni/examples.mk +63 -29
- package/libusb/android/jni/libusb.mk +14 -8
- package/libusb/android/jni/tests.mk +13 -24
- package/libusb/appveyor.yml +69 -30
- package/libusb/autogen.sh +5 -3
- package/libusb/bootstrap.sh +6 -2
- package/libusb/configure.ac +302 -228
- package/libusb/doc/Makefile.in +22 -0
- package/libusb/doc/doxygen.cfg.in +460 -223
- package/libusb/examples/Makefile.am +6 -13
- package/libusb/examples/dpfp.c +276 -73
- package/libusb/examples/ezusb.c +18 -8
- package/libusb/examples/ezusb.h +6 -17
- package/libusb/examples/fxload.c +4 -5
- package/libusb/examples/hotplugtest.c +1 -1
- package/libusb/examples/sam3u_benchmark.c +59 -24
- package/libusb/examples/testlibusb.c +138 -104
- package/libusb/examples/xusb.c +26 -22
- package/libusb/libusb/Makefile.am +57 -70
- package/libusb/libusb/Makefile.am.extra +26 -0
- package/libusb/libusb/core.c +420 -423
- package/libusb/libusb/descriptor.c +365 -419
- package/libusb/libusb/hotplug.c +197 -104
- package/libusb/libusb/io.c +491 -528
- package/libusb/libusb/libusb-1.0.def +7 -3
- package/libusb/libusb/libusb-1.0.rc +1 -9
- package/libusb/libusb/libusb.h +295 -226
- package/libusb/libusb/libusbi.h +587 -314
- package/libusb/libusb/os/darwin_usb.c +634 -317
- package/libusb/libusb/os/darwin_usb.h +39 -15
- package/libusb/libusb/os/events_posix.c +300 -0
- package/libusb/libusb/os/events_posix.h +59 -0
- package/libusb/libusb/os/events_windows.c +214 -0
- package/libusb/{msvc/missing.h → libusb/os/events_windows.h} +25 -11
- package/libusb/libusb/os/haiku_pollfs.cpp +14 -9
- package/libusb/libusb/os/haiku_usb.h +12 -12
- package/libusb/libusb/os/haiku_usb_backend.cpp +36 -37
- package/libusb/libusb/os/haiku_usb_raw.cpp +80 -116
- package/libusb/libusb/os/linux_netlink.c +55 -63
- package/libusb/libusb/os/linux_udev.c +61 -69
- package/libusb/libusb/os/linux_usbfs.c +926 -1015
- package/libusb/libusb/os/linux_usbfs.h +74 -57
- package/libusb/libusb/os/netbsd_usb.c +103 -168
- package/libusb/libusb/os/null_usb.c +111 -0
- package/libusb/libusb/os/openbsd_usb.c +71 -120
- package/libusb/libusb/os/sunos_usb.c +289 -375
- package/libusb/libusb/os/sunos_usb.h +0 -1
- package/libusb/libusb/os/threads_posix.c +81 -32
- package/libusb/libusb/os/threads_posix.h +19 -23
- package/libusb/libusb/os/threads_windows.c +9 -95
- package/libusb/libusb/os/threads_windows.h +33 -31
- package/libusb/libusb/os/windows_common.c +904 -0
- package/libusb/libusb/os/windows_common.h +329 -42
- package/libusb/libusb/os/windows_usbdk.c +161 -267
- package/libusb/libusb/os/windows_usbdk.h +5 -2
- package/libusb/libusb/os/windows_winusb.c +1326 -1190
- package/libusb/libusb/os/windows_winusb.h +167 -167
- package/libusb/libusb/strerror.c +20 -30
- package/libusb/libusb/sync.c +20 -21
- package/libusb/libusb/version.h +1 -1
- package/libusb/libusb/version_nano.h +1 -1
- package/libusb/msvc/.gitattributes +3 -0
- package/libusb/msvc/config.h +27 -20
- package/libusb/msvc/{hotplugtest_2012.vcxproj → dpfp_2013.vcxproj} +14 -10
- package/libusb/msvc/dpfp_2013.vcxproj.filters +26 -0
- package/libusb/msvc/{listdevs_2010.vcxproj → dpfp_2015.vcxproj} +14 -9
- package/libusb/msvc/dpfp_2015.vcxproj.filters +26 -0
- package/libusb/msvc/dpfp_2017.vcxproj +106 -0
- package/libusb/msvc/dpfp_2017.vcxproj.filters +26 -0
- package/libusb/msvc/dpfp_2019.vcxproj +106 -0
- package/libusb/msvc/dpfp_2019.vcxproj.filters +26 -0
- package/libusb/msvc/dpfp_threaded_2013.vcxproj +87 -0
- package/libusb/msvc/dpfp_threaded_2013.vcxproj.filters +26 -0
- package/libusb/msvc/dpfp_threaded_2015.vcxproj +87 -0
- package/libusb/msvc/dpfp_threaded_2015.vcxproj.filters +26 -0
- package/libusb/msvc/dpfp_threaded_2017.vcxproj +106 -0
- package/libusb/msvc/dpfp_threaded_2017.vcxproj.filters +26 -0
- package/libusb/msvc/{fxload_2012.vcxproj → dpfp_threaded_2019.vcxproj} +32 -17
- package/libusb/msvc/dpfp_threaded_2019.vcxproj.filters +26 -0
- package/libusb/msvc/fxload_2013.vcxproj +6 -3
- package/libusb/msvc/fxload_2013.vcxproj.filters +35 -0
- package/libusb/msvc/fxload_2015.vcxproj +6 -3
- package/libusb/msvc/fxload_2015.vcxproj.filters +35 -0
- package/libusb/msvc/fxload_2017.vcxproj +6 -7
- package/libusb/msvc/fxload_2017.vcxproj.filters +35 -0
- package/libusb/msvc/{fxload_2010.vcxproj → fxload_2019.vcxproj} +29 -6
- package/libusb/msvc/fxload_2019.vcxproj.filters +35 -0
- package/libusb/{examples → msvc}/getopt/getopt.c +0 -0
- package/libusb/{examples → msvc}/getopt/getopt.h +0 -0
- package/libusb/{examples → msvc}/getopt/getopt1.c +0 -0
- package/libusb/msvc/getopt_2013.vcxproj +4 -5
- package/libusb/msvc/getopt_2013.vcxproj.filters +26 -0
- package/libusb/msvc/getopt_2015.vcxproj +4 -4
- package/libusb/msvc/getopt_2015.vcxproj.filters +26 -0
- package/libusb/msvc/getopt_2017.vcxproj +4 -10
- package/libusb/msvc/getopt_2017.vcxproj.filters +26 -0
- package/libusb/msvc/{getopt_2012.vcxproj → getopt_2019.vcxproj} +25 -6
- package/libusb/msvc/getopt_2019.vcxproj.filters +26 -0
- package/libusb/msvc/hotplugtest_2013.vcxproj +6 -3
- package/libusb/msvc/hotplugtest_2013.vcxproj.filters +23 -0
- package/libusb/msvc/hotplugtest_2015.vcxproj +6 -3
- package/libusb/msvc/hotplugtest_2015.vcxproj.filters +23 -0
- package/libusb/msvc/hotplugtest_2017.vcxproj +6 -7
- package/libusb/msvc/hotplugtest_2017.vcxproj.filters +23 -0
- package/libusb/msvc/hotplugtest_2019.vcxproj +105 -0
- package/libusb/msvc/hotplugtest_2019.vcxproj.filters +23 -0
- package/libusb/msvc/libusb_2013.sln +50 -20
- package/libusb/msvc/libusb_2015.sln +51 -21
- package/libusb/msvc/libusb_2017.sln +90 -36
- package/libusb/msvc/libusb_2019.sln +240 -0
- package/libusb/msvc/libusb_dll_2013.vcxproj +6 -9
- package/libusb/msvc/libusb_dll_2013.vcxproj.filters +94 -0
- package/libusb/msvc/libusb_dll_2015.vcxproj +6 -8
- package/libusb/msvc/libusb_dll_2015.vcxproj.filters +94 -0
- package/libusb/msvc/libusb_dll_2017.vcxproj +6 -16
- package/libusb/msvc/libusb_dll_2017.vcxproj.filters +94 -0
- package/libusb/msvc/{libusb_dll_2010.vcxproj → libusb_dll_2019.vcxproj} +27 -9
- package/libusb/msvc/libusb_dll_2019.vcxproj.filters +94 -0
- package/libusb/msvc/libusb_static_2013.vcxproj +5 -9
- package/libusb/msvc/libusb_static_2013.vcxproj.filters +80 -0
- package/libusb/msvc/libusb_static_2015.vcxproj +5 -8
- package/libusb/msvc/libusb_static_2015.vcxproj.filters +80 -0
- package/libusb/msvc/libusb_static_2017.vcxproj +5 -8
- package/libusb/msvc/libusb_static_2017.vcxproj.filters +80 -0
- package/libusb/msvc/{libusb_static_2010.vcxproj → libusb_static_2019.vcxproj} +26 -9
- package/libusb/msvc/libusb_static_2019.vcxproj.filters +80 -0
- package/libusb/msvc/listdevs_2013.vcxproj +6 -3
- package/libusb/msvc/listdevs_2013.vcxproj.filters +23 -0
- package/libusb/msvc/listdevs_2015.vcxproj +6 -3
- package/libusb/msvc/listdevs_2015.vcxproj.filters +23 -0
- package/libusb/msvc/listdevs_2017.vcxproj +6 -7
- package/libusb/msvc/listdevs_2017.vcxproj.filters +23 -0
- package/libusb/msvc/listdevs_2019.vcxproj +105 -0
- package/libusb/msvc/listdevs_2019.vcxproj.filters +23 -0
- package/libusb/msvc/{listdevs_2012.vcxproj → sam3u_benchmark_2013.vcxproj} +13 -9
- package/libusb/msvc/sam3u_benchmark_2013.vcxproj.filters +26 -0
- package/libusb/msvc/{hotplugtest_2010.vcxproj → sam3u_benchmark_2015.vcxproj} +13 -8
- package/libusb/msvc/sam3u_benchmark_2015.vcxproj.filters +26 -0
- package/libusb/msvc/sam3u_benchmark_2017.vcxproj +106 -0
- package/libusb/msvc/sam3u_benchmark_2017.vcxproj.filters +26 -0
- package/libusb/msvc/sam3u_benchmark_2019.vcxproj +106 -0
- package/libusb/msvc/sam3u_benchmark_2019.vcxproj.filters +26 -0
- package/libusb/msvc/stress_2013.vcxproj +4 -2
- package/libusb/msvc/stress_2013.vcxproj.filters +32 -0
- package/libusb/msvc/stress_2015.vcxproj +4 -2
- package/libusb/msvc/stress_2015.vcxproj.filters +32 -0
- package/libusb/msvc/stress_2017.vcxproj +4 -6
- package/libusb/msvc/stress_2017.vcxproj.filters +32 -0
- package/libusb/msvc/{stress_2010.vcxproj → stress_2019.vcxproj} +26 -4
- package/libusb/msvc/stress_2019.vcxproj.filters +32 -0
- package/libusb/msvc/testlibusb_2013.vcxproj +6 -3
- package/libusb/msvc/testlibusb_2013.vcxproj.filters +23 -0
- package/libusb/msvc/testlibusb_2015.vcxproj +6 -3
- package/libusb/msvc/testlibusb_2015.vcxproj.filters +23 -0
- package/libusb/msvc/testlibusb_2017.vcxproj +6 -7
- package/libusb/msvc/testlibusb_2017.vcxproj.filters +23 -0
- package/libusb/msvc/{testlibusb_2010.vcxproj → testlibusb_2019.vcxproj} +28 -5
- package/libusb/msvc/testlibusb_2019.vcxproj.filters +23 -0
- package/libusb/msvc/xusb_2013.vcxproj +6 -3
- package/libusb/msvc/xusb_2013.vcxproj.filters +23 -0
- package/libusb/msvc/xusb_2015.vcxproj +6 -3
- package/libusb/msvc/xusb_2015.vcxproj.filters +23 -0
- package/libusb/msvc/xusb_2017.vcxproj +6 -7
- package/libusb/msvc/xusb_2017.vcxproj.filters +23 -0
- package/libusb/msvc/{xusb_2010.vcxproj → xusb_2019.vcxproj} +28 -5
- package/libusb/msvc/xusb_2019.vcxproj.filters +23 -0
- package/libusb/tests/Makefile.am +1 -0
- package/libusb/tests/libusb_testlib.h +12 -43
- package/libusb/tests/stress.c +59 -50
- package/libusb/tests/testlib.c +78 -171
- package/libusb.gypi +10 -11
- package/package.json +2 -2
- package/prebuilds/android-arm/node.napi.armv7.node +0 -0
- package/prebuilds/android-arm64/node.napi.armv8.node +0 -0
- package/prebuilds/darwin-x64+arm64/node.napi.node +0 -0
- package/prebuilds/linux-arm/node.napi.armv6.node +0 -0
- package/prebuilds/linux-arm/node.napi.armv7.node +0 -0
- package/prebuilds/linux-arm64/node.napi.armv8.node +0 -0
- package/prebuilds/linux-ia32/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.glibc.node +0 -0
- package/prebuilds/linux-x64/node.napi.musl.node +0 -0
- package/prebuilds/win32-ia32/node.napi.node +0 -0
- package/prebuilds/win32-x64/node.napi.node +0 -0
- package/src/device.cc +12 -7
- package/src/node_usb.cc +10 -0
- package/test/usb.coffee +6 -0
- package/tsc/index.ts +2 -0
- package/tsc/usb/bindings.ts +5 -0
- package/tsc/usb/device.ts +6 -0
- package/tsc/usb/interface.ts +2 -7
- package/tsc/webusb/webusb-device.ts +12 -8
- package/libusb/.private/bd.cmd +0 -89
- package/libusb/.private/bwince.cmd +0 -57
- package/libusb/.private/wbs_wince.txt +0 -42
- package/libusb/Brewfile +0 -4
- package/libusb/appveyor_cygwin.bat +0 -11
- package/libusb/appveyor_minGW.bat +0 -19
- package/libusb/doc/Makefile.am +0 -9
- package/libusb/examples/dpfp_threaded.c +0 -557
- package/libusb/libusb/hotplug.h +0 -99
- package/libusb/libusb/os/poll_posix.c +0 -84
- package/libusb/libusb/os/poll_posix.h +0 -14
- package/libusb/libusb/os/poll_windows.c +0 -447
- package/libusb/libusb/os/poll_windows.h +0 -98
- package/libusb/libusb/os/wince_usb.c +0 -888
- package/libusb/libusb/os/wince_usb.h +0 -126
- package/libusb/libusb/os/windows_nt_common.c +0 -1010
- package/libusb/libusb/os/windows_nt_common.h +0 -110
- package/libusb/libusb/os/windows_nt_shared_types.h +0 -147
- package/libusb/msvc/appveyor.bat +0 -27
- package/libusb/msvc/ddk_build.cmd +0 -219
- package/libusb/msvc/errno.h +0 -102
- package/libusb/msvc/fxload_sources +0 -23
- package/libusb/msvc/getopt_2005.vcproj +0 -288
- package/libusb/msvc/getopt_2010.vcxproj +0 -72
- package/libusb/msvc/getopt_sources +0 -24
- package/libusb/msvc/hotplugtest_sources +0 -20
- package/libusb/msvc/inttypes.h +0 -295
- package/libusb/msvc/libusb.dsw +0 -71
- package/libusb/msvc/libusb_2005.sln +0 -95
- package/libusb/msvc/libusb_2010.sln +0 -105
- package/libusb/msvc/libusb_2012.sln +0 -105
- package/libusb/msvc/libusb_dll.dsp +0 -194
- package/libusb/msvc/libusb_dll_2005.vcproj +0 -464
- package/libusb/msvc/libusb_dll_2012.vcxproj +0 -107
- package/libusb/msvc/libusb_dll_wince.vcproj +0 -1251
- package/libusb/msvc/libusb_sources +0 -43
- package/libusb/msvc/libusb_static.dsp +0 -174
- package/libusb/msvc/libusb_static_2005.vcproj +0 -390
- package/libusb/msvc/libusb_static_2012.vcxproj +0 -98
- package/libusb/msvc/libusb_static_wince.vcproj +0 -1179
- package/libusb/msvc/libusb_wince.sln +0 -246
- package/libusb/msvc/listdevs.dsp +0 -103
- package/libusb/msvc/listdevs_2005.vcproj +0 -360
- package/libusb/msvc/listdevs_sources +0 -20
- package/libusb/msvc/listdevs_wince.vcproj +0 -1120
- package/libusb/msvc/missing.c +0 -80
- package/libusb/msvc/stdint.h +0 -256
- package/libusb/msvc/stress_2005.vcproj +0 -390
- package/libusb/msvc/stress_2012.vcxproj +0 -87
- package/libusb/msvc/stress_sources +0 -21
- package/libusb/msvc/stress_wince.vcproj +0 -1128
- package/libusb/msvc/testlibusb_2012.vcxproj +0 -83
- package/libusb/msvc/testlibusb_sources +0 -20
- package/libusb/msvc/xusb.dsp +0 -102
- package/libusb/msvc/xusb_2005.vcproj +0 -344
- package/libusb/msvc/xusb_2012.vcxproj +0 -83
- package/libusb/msvc/xusb_sources +0 -20
- package/libusb/msvc/xusb_wince.vcproj +0 -1120
- package/libusb/travis-autogen.sh +0 -39
|
@@ -27,8 +27,6 @@
|
|
|
27
27
|
#include <stdio.h>
|
|
28
28
|
|
|
29
29
|
#include "libusbi.h"
|
|
30
|
-
#include "windows_common.h"
|
|
31
|
-
#include "windows_nt_common.h"
|
|
32
30
|
#include "windows_usbdk.h"
|
|
33
31
|
|
|
34
32
|
#if !defined(STATUS_SUCCESS)
|
|
@@ -44,28 +42,6 @@ typedef LONG NTSTATUS;
|
|
|
44
42
|
#define STATUS_REQUEST_CANCELED ((NTSTATUS)0xC0000703L)
|
|
45
43
|
#endif
|
|
46
44
|
|
|
47
|
-
#if !defined(USBD_SUCCESS)
|
|
48
|
-
typedef LONG USBD_STATUS;
|
|
49
|
-
#define USBD_SUCCESS(Status) ((USBD_STATUS) (Status) >= 0)
|
|
50
|
-
#define USBD_PENDING(Status) ((ULONG) (Status) >> 30 == 1)
|
|
51
|
-
#define USBD_ERROR(Status) ((USBD_STATUS) (Status) < 0)
|
|
52
|
-
#define USBD_STATUS_STALL_PID ((USBD_STATUS) 0xc0000004)
|
|
53
|
-
#define USBD_STATUS_ENDPOINT_HALTED ((USBD_STATUS) 0xc0000030)
|
|
54
|
-
#define USBD_STATUS_BAD_START_FRAME ((USBD_STATUS) 0xc0000a00)
|
|
55
|
-
#define USBD_STATUS_TIMEOUT ((USBD_STATUS) 0xc0006000)
|
|
56
|
-
#define USBD_STATUS_CANCELED ((USBD_STATUS) 0xc0010000)
|
|
57
|
-
#endif
|
|
58
|
-
|
|
59
|
-
static inline struct usbdk_device_priv *_usbdk_device_priv(struct libusb_device *dev)
|
|
60
|
-
{
|
|
61
|
-
return (struct usbdk_device_priv *)dev->os_priv;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
static inline struct usbdk_transfer_priv *_usbdk_transfer_priv(struct usbi_transfer *itransfer)
|
|
65
|
-
{
|
|
66
|
-
return (struct usbdk_transfer_priv *)usbi_transfer_get_os_priv(itransfer);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
45
|
static struct {
|
|
70
46
|
HMODULE module;
|
|
71
47
|
|
|
@@ -104,7 +80,7 @@ static void unload_usbdk_helper_dll(void)
|
|
|
104
80
|
|
|
105
81
|
static int load_usbdk_helper_dll(struct libusb_context *ctx)
|
|
106
82
|
{
|
|
107
|
-
usbdk_helper.module =
|
|
83
|
+
usbdk_helper.module = load_system_library(ctx, "UsbDkHelper");
|
|
108
84
|
if (usbdk_helper.module == NULL) {
|
|
109
85
|
usbi_err(ctx, "Failed to load UsbDkHelper.dll: %s", windows_error_str(0));
|
|
110
86
|
return LIBUSB_ERROR_NOT_FOUND;
|
|
@@ -170,29 +146,65 @@ error_unload:
|
|
|
170
146
|
return LIBUSB_ERROR_NOT_FOUND;
|
|
171
147
|
}
|
|
172
148
|
|
|
149
|
+
typedef SC_HANDLE (WINAPI *POPENSCMANAGERA)(LPCSTR, LPCSTR, DWORD);
|
|
150
|
+
typedef SC_HANDLE (WINAPI *POPENSERVICEA)(SC_HANDLE, LPCSTR, DWORD);
|
|
151
|
+
typedef BOOL (WINAPI *PCLOSESERVICEHANDLE)(SC_HANDLE);
|
|
152
|
+
|
|
173
153
|
static int usbdk_init(struct libusb_context *ctx)
|
|
174
154
|
{
|
|
155
|
+
POPENSCMANAGERA pOpenSCManagerA;
|
|
156
|
+
POPENSERVICEA pOpenServiceA;
|
|
157
|
+
PCLOSESERVICEHANDLE pCloseServiceHandle;
|
|
175
158
|
SC_HANDLE managerHandle;
|
|
176
159
|
SC_HANDLE serviceHandle;
|
|
160
|
+
HMODULE h;
|
|
161
|
+
|
|
162
|
+
h = load_system_library(ctx, "Advapi32");
|
|
163
|
+
if (h == NULL) {
|
|
164
|
+
usbi_warn(ctx, "failed to open Advapi32\n");
|
|
165
|
+
return LIBUSB_ERROR_OTHER;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
pOpenSCManagerA = (POPENSCMANAGERA)GetProcAddress(h, "OpenSCManagerA");
|
|
169
|
+
if (pOpenSCManagerA == NULL) {
|
|
170
|
+
usbi_warn(ctx, "failed to find %s in Advapi32\n", "OpenSCManagerA");
|
|
171
|
+
goto error_free_library;
|
|
172
|
+
}
|
|
173
|
+
pOpenServiceA = (POPENSERVICEA)GetProcAddress(h, "OpenServiceA");
|
|
174
|
+
if (pOpenServiceA == NULL) {
|
|
175
|
+
usbi_warn(ctx, "failed to find %s in Advapi32\n", "OpenServiceA");
|
|
176
|
+
goto error_free_library;
|
|
177
|
+
}
|
|
178
|
+
pCloseServiceHandle = (PCLOSESERVICEHANDLE)GetProcAddress(h, "CloseServiceHandle");
|
|
179
|
+
if (pCloseServiceHandle == NULL) {
|
|
180
|
+
usbi_warn(ctx, "failed to find %s in Advapi32\n", "CloseServiceHandle");
|
|
181
|
+
goto error_free_library;
|
|
182
|
+
}
|
|
177
183
|
|
|
178
|
-
managerHandle =
|
|
184
|
+
managerHandle = pOpenSCManagerA(NULL, NULL, SC_MANAGER_CONNECT);
|
|
179
185
|
if (managerHandle == NULL) {
|
|
180
186
|
usbi_warn(ctx, "failed to open service control manager: %s", windows_error_str(0));
|
|
181
|
-
|
|
187
|
+
goto error_free_library;
|
|
182
188
|
}
|
|
183
189
|
|
|
184
|
-
serviceHandle =
|
|
185
|
-
|
|
190
|
+
serviceHandle = pOpenServiceA(managerHandle, "UsbDk", GENERIC_READ);
|
|
191
|
+
pCloseServiceHandle(managerHandle);
|
|
186
192
|
|
|
187
193
|
if (serviceHandle == NULL) {
|
|
188
194
|
if (GetLastError() != ERROR_SERVICE_DOES_NOT_EXIST)
|
|
189
195
|
usbi_warn(ctx, "failed to open UsbDk service: %s", windows_error_str(0));
|
|
196
|
+
FreeLibrary(h);
|
|
190
197
|
return LIBUSB_ERROR_NOT_FOUND;
|
|
191
198
|
}
|
|
192
199
|
|
|
193
|
-
|
|
200
|
+
pCloseServiceHandle(serviceHandle);
|
|
201
|
+
FreeLibrary(h);
|
|
194
202
|
|
|
195
203
|
return load_usbdk_helper_dll(ctx);
|
|
204
|
+
|
|
205
|
+
error_free_library:
|
|
206
|
+
FreeLibrary(h);
|
|
207
|
+
return LIBUSB_ERROR_OTHER;
|
|
196
208
|
}
|
|
197
209
|
|
|
198
210
|
static void usbdk_exit(struct libusb_context *ctx)
|
|
@@ -216,26 +228,26 @@ static int usbdk_get_session_id_for_device(struct libusb_context *ctx,
|
|
|
216
228
|
return LIBUSB_SUCCESS;
|
|
217
229
|
}
|
|
218
230
|
|
|
219
|
-
static void usbdk_release_config_descriptors(struct usbdk_device_priv *
|
|
231
|
+
static void usbdk_release_config_descriptors(struct usbdk_device_priv *priv, uint8_t count)
|
|
220
232
|
{
|
|
221
233
|
uint8_t i;
|
|
222
234
|
|
|
223
235
|
for (i = 0; i < count; i++)
|
|
224
|
-
usbdk_helper.ReleaseConfigurationDescriptor(
|
|
236
|
+
usbdk_helper.ReleaseConfigurationDescriptor(priv->config_descriptors[i]);
|
|
225
237
|
|
|
226
|
-
free(
|
|
227
|
-
|
|
238
|
+
free(priv->config_descriptors);
|
|
239
|
+
priv->config_descriptors = NULL;
|
|
228
240
|
}
|
|
229
241
|
|
|
230
242
|
static int usbdk_cache_config_descriptors(struct libusb_context *ctx,
|
|
231
|
-
struct usbdk_device_priv *
|
|
243
|
+
struct usbdk_device_priv *priv, PUSB_DK_DEVICE_INFO info)
|
|
232
244
|
{
|
|
233
245
|
uint8_t i;
|
|
234
246
|
USB_DK_CONFIG_DESCRIPTOR_REQUEST Request;
|
|
235
247
|
Request.ID = info->ID;
|
|
236
248
|
|
|
237
|
-
|
|
238
|
-
if (
|
|
249
|
+
priv->config_descriptors = calloc(info->DeviceDescriptor.bNumConfigurations, sizeof(PUSB_CONFIGURATION_DESCRIPTOR));
|
|
250
|
+
if (priv->config_descriptors == NULL) {
|
|
239
251
|
usbi_err(ctx, "failed to allocate configuration descriptors holder");
|
|
240
252
|
return LIBUSB_ERROR_NO_MEM;
|
|
241
253
|
}
|
|
@@ -244,9 +256,9 @@ static int usbdk_cache_config_descriptors(struct libusb_context *ctx,
|
|
|
244
256
|
ULONG Length;
|
|
245
257
|
|
|
246
258
|
Request.Index = i;
|
|
247
|
-
if (!usbdk_helper.GetConfigurationDescriptor(&Request, &
|
|
259
|
+
if (!usbdk_helper.GetConfigurationDescriptor(&Request, &priv->config_descriptors[i], &Length)) {
|
|
248
260
|
usbi_err(ctx, "failed to retrieve configuration descriptors");
|
|
249
|
-
usbdk_release_config_descriptors(
|
|
261
|
+
usbdk_release_config_descriptors(priv, i);
|
|
250
262
|
return LIBUSB_ERROR_OTHER;
|
|
251
263
|
}
|
|
252
264
|
}
|
|
@@ -256,15 +268,15 @@ static int usbdk_cache_config_descriptors(struct libusb_context *ctx,
|
|
|
256
268
|
|
|
257
269
|
static inline int usbdk_device_priv_init(struct libusb_context *ctx, struct libusb_device *dev, PUSB_DK_DEVICE_INFO info)
|
|
258
270
|
{
|
|
259
|
-
struct usbdk_device_priv *
|
|
271
|
+
struct usbdk_device_priv *priv = usbi_get_device_priv(dev);
|
|
260
272
|
|
|
261
|
-
|
|
262
|
-
|
|
273
|
+
priv->ID = info->ID;
|
|
274
|
+
priv->active_configuration = 0;
|
|
263
275
|
|
|
264
|
-
return usbdk_cache_config_descriptors(ctx,
|
|
276
|
+
return usbdk_cache_config_descriptors(ctx, priv, info);
|
|
265
277
|
}
|
|
266
278
|
|
|
267
|
-
static void usbdk_device_init(libusb_device *dev, PUSB_DK_DEVICE_INFO info)
|
|
279
|
+
static void usbdk_device_init(struct libusb_device *dev, PUSB_DK_DEVICE_INFO info)
|
|
268
280
|
{
|
|
269
281
|
dev->bus_number = (uint8_t)info->FilterID;
|
|
270
282
|
dev->port_number = (uint8_t)info->Port;
|
|
@@ -273,8 +285,10 @@ static void usbdk_device_init(libusb_device *dev, PUSB_DK_DEVICE_INFO info)
|
|
|
273
285
|
// Addresses in libusb are 1-based
|
|
274
286
|
dev->device_address = (uint8_t)(info->Port + 1);
|
|
275
287
|
|
|
276
|
-
dev->
|
|
288
|
+
static_assert(sizeof(dev->device_descriptor) == sizeof(info->DeviceDescriptor),
|
|
289
|
+
"mismatch between libusb and OS device descriptor sizes");
|
|
277
290
|
memcpy(&dev->device_descriptor, &info->DeviceDescriptor, LIBUSB_DT_DEVICE_SIZE);
|
|
291
|
+
usbi_localize_device_descriptor(&dev->device_descriptor);
|
|
278
292
|
|
|
279
293
|
switch (info->Speed) {
|
|
280
294
|
case LowSpeed:
|
|
@@ -345,24 +359,12 @@ func_exit:
|
|
|
345
359
|
return r;
|
|
346
360
|
}
|
|
347
361
|
|
|
348
|
-
static int
|
|
362
|
+
static int usbdk_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, void *buffer, size_t len)
|
|
349
363
|
{
|
|
350
|
-
struct usbdk_device_priv *priv =
|
|
351
|
-
|
|
352
|
-
memcpy(buffer, &priv->info.DeviceDescriptor, DEVICE_DESC_LENGTH);
|
|
353
|
-
|
|
354
|
-
return LIBUSB_SUCCESS;
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
static int usbdk_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len)
|
|
358
|
-
{
|
|
359
|
-
struct usbdk_device_priv *priv = _usbdk_device_priv(dev);
|
|
364
|
+
struct usbdk_device_priv *priv = usbi_get_device_priv(dev);
|
|
360
365
|
PUSB_CONFIGURATION_DESCRIPTOR config_header;
|
|
361
366
|
size_t size;
|
|
362
367
|
|
|
363
|
-
if (config_index >= dev->num_configurations)
|
|
364
|
-
return LIBUSB_ERROR_INVALID_PARAM;
|
|
365
|
-
|
|
366
368
|
config_header = (PUSB_CONFIGURATION_DESCRIPTOR)priv->config_descriptors[config_index];
|
|
367
369
|
|
|
368
370
|
size = min(config_header->wTotalLength, len);
|
|
@@ -371,16 +373,16 @@ static int usbdk_get_config_descriptor(struct libusb_device *dev, uint8_t config
|
|
|
371
373
|
}
|
|
372
374
|
|
|
373
375
|
static int usbdk_get_config_descriptor_by_value(struct libusb_device *dev, uint8_t bConfigurationValue,
|
|
374
|
-
|
|
376
|
+
void **buffer)
|
|
375
377
|
{
|
|
376
|
-
struct usbdk_device_priv *priv =
|
|
378
|
+
struct usbdk_device_priv *priv = usbi_get_device_priv(dev);
|
|
377
379
|
PUSB_CONFIGURATION_DESCRIPTOR config_header;
|
|
378
380
|
uint8_t index;
|
|
379
381
|
|
|
380
|
-
for (index = 0; index < dev->
|
|
382
|
+
for (index = 0; index < dev->device_descriptor.bNumConfigurations; index++) {
|
|
381
383
|
config_header = priv->config_descriptors[index];
|
|
382
384
|
if (config_header->bConfigurationValue == bConfigurationValue) {
|
|
383
|
-
*buffer =
|
|
385
|
+
*buffer = priv->config_descriptors[index];
|
|
384
386
|
return (int)config_header->wTotalLength;
|
|
385
387
|
}
|
|
386
388
|
}
|
|
@@ -388,70 +390,87 @@ static int usbdk_get_config_descriptor_by_value(struct libusb_device *dev, uint8
|
|
|
388
390
|
return LIBUSB_ERROR_NOT_FOUND;
|
|
389
391
|
}
|
|
390
392
|
|
|
391
|
-
static int usbdk_get_active_config_descriptor(struct libusb_device *dev,
|
|
393
|
+
static int usbdk_get_active_config_descriptor(struct libusb_device *dev, void *buffer, size_t len)
|
|
392
394
|
{
|
|
393
|
-
|
|
394
|
-
|
|
395
|
+
struct usbdk_device_priv *priv = usbi_get_device_priv(dev);
|
|
396
|
+
|
|
397
|
+
return usbdk_get_config_descriptor(dev, priv->active_configuration, buffer, len);
|
|
395
398
|
}
|
|
396
399
|
|
|
397
400
|
static int usbdk_open(struct libusb_device_handle *dev_handle)
|
|
398
401
|
{
|
|
399
|
-
struct
|
|
402
|
+
struct libusb_device *dev = dev_handle->dev;
|
|
403
|
+
struct libusb_context *ctx = DEVICE_CTX(dev);
|
|
404
|
+
struct windows_context_priv *priv = usbi_get_context_priv(ctx);
|
|
405
|
+
struct usbdk_device_priv *device_priv = usbi_get_device_priv(dev);
|
|
400
406
|
|
|
401
|
-
|
|
402
|
-
if (
|
|
403
|
-
usbi_err(
|
|
407
|
+
device_priv->redirector_handle = usbdk_helper.StartRedirect(&device_priv->ID);
|
|
408
|
+
if (device_priv->redirector_handle == INVALID_HANDLE_VALUE) {
|
|
409
|
+
usbi_err(ctx, "Redirector startup failed");
|
|
410
|
+
device_priv->redirector_handle = NULL;
|
|
404
411
|
return LIBUSB_ERROR_OTHER;
|
|
405
412
|
}
|
|
406
413
|
|
|
407
|
-
|
|
414
|
+
device_priv->system_handle = usbdk_helper.GetRedirectorSystemHandle(device_priv->redirector_handle);
|
|
415
|
+
|
|
416
|
+
if (CreateIoCompletionPort(device_priv->system_handle, priv->completion_port, (ULONG_PTR)dev_handle, 0) == NULL) {
|
|
417
|
+
usbi_err(ctx, "failed to associate handle to I/O completion port: %s", windows_error_str(0));
|
|
418
|
+
usbdk_helper.StopRedirect(device_priv->redirector_handle);
|
|
419
|
+
device_priv->system_handle = NULL;
|
|
420
|
+
device_priv->redirector_handle = NULL;
|
|
421
|
+
return LIBUSB_ERROR_OTHER;
|
|
422
|
+
}
|
|
408
423
|
|
|
409
424
|
return LIBUSB_SUCCESS;
|
|
410
425
|
}
|
|
411
426
|
|
|
412
427
|
static void usbdk_close(struct libusb_device_handle *dev_handle)
|
|
413
428
|
{
|
|
414
|
-
struct usbdk_device_priv *priv =
|
|
429
|
+
struct usbdk_device_priv *priv = usbi_get_device_priv(dev_handle->dev);
|
|
415
430
|
|
|
416
431
|
if (!usbdk_helper.StopRedirect(priv->redirector_handle))
|
|
417
432
|
usbi_err(HANDLE_CTX(dev_handle), "Redirector shutdown failed");
|
|
433
|
+
|
|
434
|
+
priv->system_handle = NULL;
|
|
435
|
+
priv->redirector_handle = NULL;
|
|
418
436
|
}
|
|
419
437
|
|
|
420
|
-
static int usbdk_get_configuration(struct libusb_device_handle *dev_handle,
|
|
438
|
+
static int usbdk_get_configuration(struct libusb_device_handle *dev_handle, uint8_t *config)
|
|
421
439
|
{
|
|
422
|
-
*
|
|
440
|
+
struct usbdk_device_priv *priv = usbi_get_device_priv(dev_handle->dev);
|
|
441
|
+
|
|
442
|
+
*config = priv->active_configuration;
|
|
423
443
|
|
|
424
444
|
return LIBUSB_SUCCESS;
|
|
425
445
|
}
|
|
426
446
|
|
|
427
|
-
static int usbdk_set_configuration(struct libusb_device_handle *dev_handle,
|
|
447
|
+
static int usbdk_set_configuration(struct libusb_device_handle *dev_handle, uint8_t config)
|
|
428
448
|
{
|
|
429
449
|
UNUSED(dev_handle);
|
|
430
450
|
UNUSED(config);
|
|
431
451
|
return LIBUSB_SUCCESS;
|
|
432
452
|
}
|
|
433
453
|
|
|
434
|
-
static int usbdk_claim_interface(struct libusb_device_handle *dev_handle,
|
|
454
|
+
static int usbdk_claim_interface(struct libusb_device_handle *dev_handle, uint8_t iface)
|
|
435
455
|
{
|
|
436
456
|
UNUSED(dev_handle);
|
|
437
457
|
UNUSED(iface);
|
|
438
458
|
return LIBUSB_SUCCESS;
|
|
439
459
|
}
|
|
440
460
|
|
|
441
|
-
static int usbdk_set_interface_altsetting(struct libusb_device_handle *dev_handle,
|
|
461
|
+
static int usbdk_set_interface_altsetting(struct libusb_device_handle *dev_handle, uint8_t iface, uint8_t altsetting)
|
|
442
462
|
{
|
|
443
|
-
struct
|
|
444
|
-
struct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev);
|
|
463
|
+
struct usbdk_device_priv *priv = usbi_get_device_priv(dev_handle->dev);
|
|
445
464
|
|
|
446
465
|
if (!usbdk_helper.SetAltsetting(priv->redirector_handle, iface, altsetting)) {
|
|
447
|
-
usbi_err(
|
|
466
|
+
usbi_err(HANDLE_CTX(dev_handle), "SetAltsetting failed: %s", windows_error_str(0));
|
|
448
467
|
return LIBUSB_ERROR_NO_DEVICE;
|
|
449
468
|
}
|
|
450
469
|
|
|
451
470
|
return LIBUSB_SUCCESS;
|
|
452
471
|
}
|
|
453
472
|
|
|
454
|
-
static int usbdk_release_interface(struct libusb_device_handle *dev_handle,
|
|
473
|
+
static int usbdk_release_interface(struct libusb_device_handle *dev_handle, uint8_t iface)
|
|
455
474
|
{
|
|
456
475
|
UNUSED(dev_handle);
|
|
457
476
|
UNUSED(iface);
|
|
@@ -460,11 +479,10 @@ static int usbdk_release_interface(struct libusb_device_handle *dev_handle, int
|
|
|
460
479
|
|
|
461
480
|
static int usbdk_clear_halt(struct libusb_device_handle *dev_handle, unsigned char endpoint)
|
|
462
481
|
{
|
|
463
|
-
struct
|
|
464
|
-
struct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev);
|
|
482
|
+
struct usbdk_device_priv *priv = usbi_get_device_priv(dev_handle->dev);
|
|
465
483
|
|
|
466
484
|
if (!usbdk_helper.ResetPipe(priv->redirector_handle, endpoint)) {
|
|
467
|
-
usbi_err(
|
|
485
|
+
usbi_err(HANDLE_CTX(dev_handle), "ResetPipe failed: %s", windows_error_str(0));
|
|
468
486
|
return LIBUSB_ERROR_NO_DEVICE;
|
|
469
487
|
}
|
|
470
488
|
|
|
@@ -473,11 +491,10 @@ static int usbdk_clear_halt(struct libusb_device_handle *dev_handle, unsigned ch
|
|
|
473
491
|
|
|
474
492
|
static int usbdk_reset_device(struct libusb_device_handle *dev_handle)
|
|
475
493
|
{
|
|
476
|
-
struct
|
|
477
|
-
struct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev);
|
|
494
|
+
struct usbdk_device_priv *priv = usbi_get_device_priv(dev_handle->dev);
|
|
478
495
|
|
|
479
496
|
if (!usbdk_helper.ResetDevice(priv->redirector_handle)) {
|
|
480
|
-
usbi_err(
|
|
497
|
+
usbi_err(HANDLE_CTX(dev_handle), "ResetDevice failed: %s", windows_error_str(0));
|
|
481
498
|
return LIBUSB_ERROR_NO_DEVICE;
|
|
482
499
|
}
|
|
483
500
|
|
|
@@ -486,21 +503,17 @@ static int usbdk_reset_device(struct libusb_device_handle *dev_handle)
|
|
|
486
503
|
|
|
487
504
|
static void usbdk_destroy_device(struct libusb_device *dev)
|
|
488
505
|
{
|
|
489
|
-
struct usbdk_device_priv*
|
|
506
|
+
struct usbdk_device_priv *priv = usbi_get_device_priv(dev);
|
|
490
507
|
|
|
491
|
-
if (
|
|
492
|
-
usbdk_release_config_descriptors(
|
|
508
|
+
if (priv->config_descriptors != NULL)
|
|
509
|
+
usbdk_release_config_descriptors(priv, dev->device_descriptor.bNumConfigurations);
|
|
493
510
|
}
|
|
494
511
|
|
|
495
512
|
static void usbdk_clear_transfer_priv(struct usbi_transfer *itransfer)
|
|
496
513
|
{
|
|
497
|
-
struct usbdk_transfer_priv *transfer_priv =
|
|
514
|
+
struct usbdk_transfer_priv *transfer_priv = get_usbdk_transfer_priv(itransfer);
|
|
498
515
|
struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
|
|
499
516
|
|
|
500
|
-
usbi_close(transfer_priv->pollable_fd.fd);
|
|
501
|
-
transfer_priv->pollable_fd = INVALID_WINFD;
|
|
502
|
-
transfer_priv->system_handle = NULL;
|
|
503
|
-
|
|
504
517
|
if (transfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS) {
|
|
505
518
|
safe_free(transfer_priv->IsochronousPacketsArray);
|
|
506
519
|
safe_free(transfer_priv->IsochronousResultsArray);
|
|
@@ -510,16 +523,17 @@ static void usbdk_clear_transfer_priv(struct usbi_transfer *itransfer)
|
|
|
510
523
|
static int usbdk_do_control_transfer(struct usbi_transfer *itransfer)
|
|
511
524
|
{
|
|
512
525
|
struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
|
|
513
|
-
struct usbdk_device_priv *priv =
|
|
514
|
-
struct usbdk_transfer_priv *transfer_priv =
|
|
515
|
-
|
|
516
|
-
OVERLAPPED *overlapped = transfer_priv->pollable_fd.overlapped;
|
|
526
|
+
struct usbdk_device_priv *priv = usbi_get_device_priv(transfer->dev_handle->dev);
|
|
527
|
+
struct usbdk_transfer_priv *transfer_priv = get_usbdk_transfer_priv(itransfer);
|
|
528
|
+
OVERLAPPED *overlapped = get_transfer_priv_overlapped(itransfer);
|
|
517
529
|
TransferResult transResult;
|
|
518
530
|
|
|
519
531
|
transfer_priv->request.Buffer = (PVOID64)transfer->buffer;
|
|
520
532
|
transfer_priv->request.BufferLength = transfer->length;
|
|
521
533
|
transfer_priv->request.TransferType = ControlTransferType;
|
|
522
534
|
|
|
535
|
+
set_transfer_priv_handle(itransfer, priv->system_handle);
|
|
536
|
+
|
|
523
537
|
if (transfer->buffer[0] & LIBUSB_ENDPOINT_IN)
|
|
524
538
|
transResult = usbdk_helper.ReadPipe(priv->redirector_handle, &transfer_priv->request, overlapped);
|
|
525
539
|
else
|
|
@@ -527,12 +541,12 @@ static int usbdk_do_control_transfer(struct usbi_transfer *itransfer)
|
|
|
527
541
|
|
|
528
542
|
switch (transResult) {
|
|
529
543
|
case TransferSuccess:
|
|
530
|
-
windows_force_sync_completion(
|
|
544
|
+
windows_force_sync_completion(itransfer, (ULONG)transfer_priv->request.Result.GenResult.BytesTransferred);
|
|
531
545
|
break;
|
|
532
546
|
case TransferSuccessAsync:
|
|
533
547
|
break;
|
|
534
548
|
case TransferFailure:
|
|
535
|
-
usbi_err(
|
|
549
|
+
usbi_err(TRANSFER_CTX(transfer), "ControlTransfer failed: %s", windows_error_str(0));
|
|
536
550
|
return LIBUSB_ERROR_IO;
|
|
537
551
|
}
|
|
538
552
|
|
|
@@ -542,10 +556,9 @@ static int usbdk_do_control_transfer(struct usbi_transfer *itransfer)
|
|
|
542
556
|
static int usbdk_do_bulk_transfer(struct usbi_transfer *itransfer)
|
|
543
557
|
{
|
|
544
558
|
struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
|
|
545
|
-
struct usbdk_device_priv *priv =
|
|
546
|
-
struct usbdk_transfer_priv *transfer_priv =
|
|
547
|
-
|
|
548
|
-
OVERLAPPED *overlapped = transfer_priv->pollable_fd.overlapped;
|
|
559
|
+
struct usbdk_device_priv *priv = usbi_get_device_priv(transfer->dev_handle->dev);
|
|
560
|
+
struct usbdk_transfer_priv *transfer_priv = get_usbdk_transfer_priv(itransfer);
|
|
561
|
+
OVERLAPPED *overlapped = get_transfer_priv_overlapped(itransfer);
|
|
549
562
|
TransferResult transferRes;
|
|
550
563
|
|
|
551
564
|
transfer_priv->request.Buffer = (PVOID64)transfer->buffer;
|
|
@@ -559,11 +572,10 @@ static int usbdk_do_bulk_transfer(struct usbi_transfer *itransfer)
|
|
|
559
572
|
case LIBUSB_TRANSFER_TYPE_INTERRUPT:
|
|
560
573
|
transfer_priv->request.TransferType = InterruptTransferType;
|
|
561
574
|
break;
|
|
562
|
-
default:
|
|
563
|
-
usbi_err(ctx, "Wrong transfer type (%d) in usbdk_do_bulk_transfer", transfer->type);
|
|
564
|
-
return LIBUSB_ERROR_INVALID_PARAM;
|
|
565
575
|
}
|
|
566
576
|
|
|
577
|
+
set_transfer_priv_handle(itransfer, priv->system_handle);
|
|
578
|
+
|
|
567
579
|
if (IS_XFERIN(transfer))
|
|
568
580
|
transferRes = usbdk_helper.ReadPipe(priv->redirector_handle, &transfer_priv->request, overlapped);
|
|
569
581
|
else
|
|
@@ -571,12 +583,12 @@ static int usbdk_do_bulk_transfer(struct usbi_transfer *itransfer)
|
|
|
571
583
|
|
|
572
584
|
switch (transferRes) {
|
|
573
585
|
case TransferSuccess:
|
|
574
|
-
windows_force_sync_completion(
|
|
586
|
+
windows_force_sync_completion(itransfer, (ULONG)transfer_priv->request.Result.GenResult.BytesTransferred);
|
|
575
587
|
break;
|
|
576
588
|
case TransferSuccessAsync:
|
|
577
589
|
break;
|
|
578
590
|
case TransferFailure:
|
|
579
|
-
usbi_err(
|
|
591
|
+
usbi_err(TRANSFER_CTX(transfer), "ReadPipe/WritePipe failed: %s", windows_error_str(0));
|
|
580
592
|
return LIBUSB_ERROR_IO;
|
|
581
593
|
}
|
|
582
594
|
|
|
@@ -586,10 +598,9 @@ static int usbdk_do_bulk_transfer(struct usbi_transfer *itransfer)
|
|
|
586
598
|
static int usbdk_do_iso_transfer(struct usbi_transfer *itransfer)
|
|
587
599
|
{
|
|
588
600
|
struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
|
|
589
|
-
struct usbdk_device_priv *priv =
|
|
590
|
-
struct usbdk_transfer_priv *transfer_priv =
|
|
591
|
-
|
|
592
|
-
OVERLAPPED *overlapped = transfer_priv->pollable_fd.overlapped;
|
|
601
|
+
struct usbdk_device_priv *priv = usbi_get_device_priv(transfer->dev_handle->dev);
|
|
602
|
+
struct usbdk_transfer_priv *transfer_priv = get_usbdk_transfer_priv(itransfer);
|
|
603
|
+
OVERLAPPED *overlapped = get_transfer_priv_overlapped(itransfer);
|
|
593
604
|
TransferResult transferRes;
|
|
594
605
|
int i;
|
|
595
606
|
|
|
@@ -601,20 +612,22 @@ static int usbdk_do_iso_transfer(struct usbi_transfer *itransfer)
|
|
|
601
612
|
transfer_priv->IsochronousPacketsArray = malloc(transfer->num_iso_packets * sizeof(ULONG64));
|
|
602
613
|
transfer_priv->request.IsochronousPacketsArray = (PVOID64)transfer_priv->IsochronousPacketsArray;
|
|
603
614
|
if (!transfer_priv->IsochronousPacketsArray) {
|
|
604
|
-
usbi_err(
|
|
615
|
+
usbi_err(TRANSFER_CTX(transfer), "Allocation of IsochronousPacketsArray failed");
|
|
605
616
|
return LIBUSB_ERROR_NO_MEM;
|
|
606
617
|
}
|
|
607
618
|
|
|
608
619
|
transfer_priv->IsochronousResultsArray = malloc(transfer->num_iso_packets * sizeof(USB_DK_ISO_TRANSFER_RESULT));
|
|
609
620
|
transfer_priv->request.Result.IsochronousResultsArray = (PVOID64)transfer_priv->IsochronousResultsArray;
|
|
610
621
|
if (!transfer_priv->IsochronousResultsArray) {
|
|
611
|
-
usbi_err(
|
|
622
|
+
usbi_err(TRANSFER_CTX(transfer), "Allocation of isochronousResultsArray failed");
|
|
612
623
|
return LIBUSB_ERROR_NO_MEM;
|
|
613
624
|
}
|
|
614
625
|
|
|
615
626
|
for (i = 0; i < transfer->num_iso_packets; i++)
|
|
616
627
|
transfer_priv->IsochronousPacketsArray[i] = transfer->iso_packet_desc[i].length;
|
|
617
628
|
|
|
629
|
+
set_transfer_priv_handle(itransfer, priv->system_handle);
|
|
630
|
+
|
|
618
631
|
if (IS_XFERIN(transfer))
|
|
619
632
|
transferRes = usbdk_helper.ReadPipe(priv->redirector_handle, &transfer_priv->request, overlapped);
|
|
620
633
|
else
|
|
@@ -622,7 +635,7 @@ static int usbdk_do_iso_transfer(struct usbi_transfer *itransfer)
|
|
|
622
635
|
|
|
623
636
|
switch (transferRes) {
|
|
624
637
|
case TransferSuccess:
|
|
625
|
-
windows_force_sync_completion(
|
|
638
|
+
windows_force_sync_completion(itransfer, (ULONG)transfer_priv->request.Result.GenResult.BytesTransferred);
|
|
626
639
|
break;
|
|
627
640
|
case TransferSuccessAsync:
|
|
628
641
|
break;
|
|
@@ -633,174 +646,58 @@ static int usbdk_do_iso_transfer(struct usbi_transfer *itransfer)
|
|
|
633
646
|
return LIBUSB_SUCCESS;
|
|
634
647
|
}
|
|
635
648
|
|
|
636
|
-
static int usbdk_do_submit_transfer(struct usbi_transfer *itransfer,
|
|
637
|
-
short events, int (*transfer_fn)(struct usbi_transfer *))
|
|
638
|
-
{
|
|
639
|
-
struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
|
|
640
|
-
struct libusb_context *ctx = TRANSFER_CTX(transfer);
|
|
641
|
-
struct usbdk_device_priv *priv = _usbdk_device_priv(transfer->dev_handle->dev);
|
|
642
|
-
struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer);
|
|
643
|
-
struct winfd wfd;
|
|
644
|
-
int r;
|
|
645
|
-
|
|
646
|
-
wfd = usbi_create_fd();
|
|
647
|
-
if (wfd.fd < 0)
|
|
648
|
-
return LIBUSB_ERROR_NO_MEM;
|
|
649
|
-
|
|
650
|
-
r = usbi_add_pollfd(ctx, wfd.fd, events);
|
|
651
|
-
if (r) {
|
|
652
|
-
usbi_close(wfd.fd);
|
|
653
|
-
return r;
|
|
654
|
-
}
|
|
655
|
-
|
|
656
|
-
// Use transfer_priv to store data needed for async polling
|
|
657
|
-
transfer_priv->pollable_fd = wfd;
|
|
658
|
-
transfer_priv->system_handle = priv->system_handle;
|
|
659
|
-
|
|
660
|
-
r = transfer_fn(itransfer);
|
|
661
|
-
if (r != LIBUSB_SUCCESS) {
|
|
662
|
-
usbi_remove_pollfd(ctx, wfd.fd);
|
|
663
|
-
usbdk_clear_transfer_priv(itransfer);
|
|
664
|
-
return r;
|
|
665
|
-
}
|
|
666
|
-
|
|
667
|
-
return LIBUSB_SUCCESS;
|
|
668
|
-
}
|
|
669
|
-
|
|
670
649
|
static int usbdk_submit_transfer(struct usbi_transfer *itransfer)
|
|
671
650
|
{
|
|
672
651
|
struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
|
|
673
|
-
int (*transfer_fn)(struct usbi_transfer *);
|
|
674
|
-
short events;
|
|
675
652
|
|
|
676
653
|
switch (transfer->type) {
|
|
677
654
|
case LIBUSB_TRANSFER_TYPE_CONTROL:
|
|
678
|
-
|
|
679
|
-
transfer_fn = usbdk_do_control_transfer;
|
|
680
|
-
break;
|
|
655
|
+
return usbdk_do_control_transfer(itransfer);
|
|
681
656
|
case LIBUSB_TRANSFER_TYPE_BULK:
|
|
682
657
|
case LIBUSB_TRANSFER_TYPE_INTERRUPT:
|
|
683
658
|
if (IS_XFEROUT(transfer) && (transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET))
|
|
684
659
|
return LIBUSB_ERROR_NOT_SUPPORTED; //TODO: Check whether we can support this in UsbDk
|
|
685
|
-
|
|
686
|
-
transfer_fn = usbdk_do_bulk_transfer;
|
|
687
|
-
break;
|
|
660
|
+
return usbdk_do_bulk_transfer(itransfer);
|
|
688
661
|
case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:
|
|
689
|
-
|
|
690
|
-
transfer_fn = usbdk_do_iso_transfer;
|
|
691
|
-
break;
|
|
662
|
+
return usbdk_do_iso_transfer(itransfer);
|
|
692
663
|
default:
|
|
693
|
-
|
|
694
|
-
|
|
664
|
+
// Should not get here since windows_submit_transfer() validates
|
|
665
|
+
// the transfer->type field
|
|
666
|
+
usbi_err(TRANSFER_CTX(transfer), "unsupported endpoint type %d", transfer->type);
|
|
667
|
+
return LIBUSB_ERROR_NOT_SUPPORTED;
|
|
695
668
|
}
|
|
696
|
-
|
|
697
|
-
return usbdk_do_submit_transfer(itransfer, events, transfer_fn);
|
|
698
669
|
}
|
|
699
670
|
|
|
700
|
-
static
|
|
671
|
+
static enum libusb_transfer_status usbdk_copy_transfer_data(struct usbi_transfer *itransfer, DWORD length)
|
|
701
672
|
{
|
|
702
673
|
struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
|
|
703
|
-
struct
|
|
704
|
-
struct usbdk_device_priv *priv = _usbdk_device_priv(transfer->dev_handle->dev);
|
|
705
|
-
struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer);
|
|
706
|
-
struct winfd *pollable_fd = &transfer_priv->pollable_fd;
|
|
707
|
-
|
|
708
|
-
if (pCancelIoEx != NULL) {
|
|
709
|
-
// Use CancelIoEx if available to cancel just a single transfer
|
|
710
|
-
if (!pCancelIoEx(priv->system_handle, pollable_fd->overlapped)) {
|
|
711
|
-
usbi_err(ctx, "CancelIoEx failed: %s", windows_error_str(0));
|
|
712
|
-
return LIBUSB_ERROR_NO_DEVICE;
|
|
713
|
-
}
|
|
714
|
-
} else {
|
|
715
|
-
if (!usbdk_helper.AbortPipe(priv->redirector_handle, transfer->endpoint)) {
|
|
716
|
-
usbi_err(ctx, "AbortPipe failed: %s", windows_error_str(0));
|
|
717
|
-
return LIBUSB_ERROR_NO_DEVICE;
|
|
718
|
-
}
|
|
719
|
-
}
|
|
674
|
+
struct usbdk_transfer_priv *transfer_priv = get_usbdk_transfer_priv(itransfer);
|
|
720
675
|
|
|
721
|
-
|
|
722
|
-
}
|
|
676
|
+
UNUSED(length);
|
|
723
677
|
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
return LIBUSB_ERROR_INVALID_PARAM;
|
|
740
|
-
}
|
|
741
|
-
}
|
|
742
|
-
|
|
743
|
-
static int usbdk_copy_transfer_data(struct usbi_transfer *itransfer, uint32_t io_size)
|
|
744
|
-
{
|
|
745
|
-
itransfer->transferred += io_size;
|
|
746
|
-
return LIBUSB_TRANSFER_COMPLETED;
|
|
747
|
-
}
|
|
748
|
-
|
|
749
|
-
static int usbdk_get_transfer_fd(struct usbi_transfer *itransfer)
|
|
750
|
-
{
|
|
751
|
-
struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer);
|
|
752
|
-
return transfer_priv->pollable_fd.fd;
|
|
753
|
-
}
|
|
754
|
-
|
|
755
|
-
static DWORD usbdk_translate_usbd_status(USBD_STATUS UsbdStatus)
|
|
756
|
-
{
|
|
757
|
-
if (USBD_SUCCESS(UsbdStatus))
|
|
758
|
-
return NO_ERROR;
|
|
759
|
-
|
|
760
|
-
switch (UsbdStatus) {
|
|
761
|
-
case USBD_STATUS_TIMEOUT:
|
|
762
|
-
return ERROR_SEM_TIMEOUT;
|
|
763
|
-
case USBD_STATUS_CANCELED:
|
|
764
|
-
return ERROR_OPERATION_ABORTED;
|
|
765
|
-
default:
|
|
766
|
-
return ERROR_GEN_FAILURE;
|
|
767
|
-
}
|
|
768
|
-
}
|
|
769
|
-
|
|
770
|
-
static void usbdk_get_overlapped_result(struct usbi_transfer *itransfer, DWORD *io_result, DWORD *io_size)
|
|
771
|
-
{
|
|
772
|
-
struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer);
|
|
773
|
-
struct winfd *pollable_fd = &transfer_priv->pollable_fd;
|
|
774
|
-
|
|
775
|
-
if (HasOverlappedIoCompletedSync(pollable_fd->overlapped) // Handle async requests that completed synchronously first
|
|
776
|
-
|| GetOverlappedResult(transfer_priv->system_handle, pollable_fd->overlapped, io_size, FALSE)) { // Regular async overlapped
|
|
777
|
-
struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
|
|
778
|
-
|
|
779
|
-
if (transfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS) {
|
|
780
|
-
ULONG64 i;
|
|
781
|
-
for (i = 0; i < transfer_priv->request.IsochronousPacketsArraySize; i++) {
|
|
782
|
-
struct libusb_iso_packet_descriptor *lib_desc = &transfer->iso_packet_desc[i];
|
|
783
|
-
|
|
784
|
-
switch (transfer_priv->IsochronousResultsArray[i].TransferResult) {
|
|
785
|
-
case STATUS_SUCCESS:
|
|
786
|
-
case STATUS_CANCELLED:
|
|
787
|
-
case STATUS_REQUEST_CANCELED:
|
|
788
|
-
lib_desc->status = LIBUSB_TRANSFER_COMPLETED; // == ERROR_SUCCESS
|
|
789
|
-
break;
|
|
790
|
-
default:
|
|
791
|
-
lib_desc->status = LIBUSB_TRANSFER_ERROR; // ERROR_UNKNOWN_EXCEPTION;
|
|
792
|
-
break;
|
|
793
|
-
}
|
|
794
|
-
|
|
795
|
-
lib_desc->actual_length = (unsigned int)transfer_priv->IsochronousResultsArray[i].ActualLength;
|
|
678
|
+
if (transfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS) {
|
|
679
|
+
ULONG64 i;
|
|
680
|
+
|
|
681
|
+
for (i = 0; i < transfer_priv->request.IsochronousPacketsArraySize; i++) {
|
|
682
|
+
struct libusb_iso_packet_descriptor *lib_desc = &transfer->iso_packet_desc[i];
|
|
683
|
+
|
|
684
|
+
switch (transfer_priv->IsochronousResultsArray[i].TransferResult) {
|
|
685
|
+
case STATUS_SUCCESS:
|
|
686
|
+
case STATUS_CANCELLED:
|
|
687
|
+
case STATUS_REQUEST_CANCELED:
|
|
688
|
+
lib_desc->status = LIBUSB_TRANSFER_COMPLETED; // == ERROR_SUCCESS
|
|
689
|
+
break;
|
|
690
|
+
default:
|
|
691
|
+
lib_desc->status = LIBUSB_TRANSFER_ERROR; // ERROR_UNKNOWN_EXCEPTION;
|
|
692
|
+
break;
|
|
796
693
|
}
|
|
797
|
-
}
|
|
798
694
|
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
} else {
|
|
802
|
-
*io_result = GetLastError();
|
|
695
|
+
lib_desc->actual_length = (unsigned int)transfer_priv->IsochronousResultsArray[i].ActualLength;
|
|
696
|
+
}
|
|
803
697
|
}
|
|
698
|
+
|
|
699
|
+
itransfer->transferred += (int)transfer_priv->request.Result.GenResult.BytesTransferred;
|
|
700
|
+
return usbd_status_to_libusb_transfer_status((USBD_STATUS)transfer_priv->request.Result.GenResult.UsbdStatus);
|
|
804
701
|
}
|
|
805
702
|
|
|
806
703
|
const struct windows_backend usbdk_backend = {
|
|
@@ -809,7 +706,6 @@ const struct windows_backend usbdk_backend = {
|
|
|
809
706
|
usbdk_get_device_list,
|
|
810
707
|
usbdk_open,
|
|
811
708
|
usbdk_close,
|
|
812
|
-
usbdk_get_device_descriptor,
|
|
813
709
|
usbdk_get_active_config_descriptor,
|
|
814
710
|
usbdk_get_config_descriptor,
|
|
815
711
|
usbdk_get_config_descriptor_by_value,
|
|
@@ -822,9 +718,7 @@ const struct windows_backend usbdk_backend = {
|
|
|
822
718
|
usbdk_reset_device,
|
|
823
719
|
usbdk_destroy_device,
|
|
824
720
|
usbdk_submit_transfer,
|
|
825
|
-
|
|
721
|
+
NULL, /* cancel_transfer */
|
|
826
722
|
usbdk_clear_transfer_priv,
|
|
827
723
|
usbdk_copy_transfer_data,
|
|
828
|
-
usbdk_get_transfer_fd,
|
|
829
|
-
usbdk_get_overlapped_result,
|
|
830
724
|
};
|