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.
Files changed (287) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +4 -0
  3. package/dist/index.d.ts +2 -1
  4. package/dist/index.js +3 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/usb/bindings.d.ts +4 -0
  7. package/dist/usb/device.js +5 -0
  8. package/dist/usb/device.js.map +1 -1
  9. package/dist/usb/interface.d.ts +1 -1
  10. package/dist/usb/interface.js +1 -5
  11. package/dist/usb/interface.js.map +1 -1
  12. package/dist/webusb/webusb-device.d.ts +2 -1
  13. package/dist/webusb/webusb-device.js +21 -14
  14. package/dist/webusb/webusb-device.js.map +1 -1
  15. package/libusb/.gitattributes +2 -6
  16. package/libusb/.private/appveyor_build.sh +22 -0
  17. package/libusb/.private/bm.sh +1 -1
  18. package/libusb/.private/ci-build.sh +67 -0
  19. package/libusb/.private/post-rewrite.sh +5 -1
  20. package/libusb/.private/pre-commit.sh +5 -1
  21. package/libusb/.private/wbs.txt +4 -19
  22. package/libusb/.travis.yml +32 -23
  23. package/libusb/AUTHORS +76 -3
  24. package/libusb/ChangeLog +41 -3
  25. package/libusb/INSTALL_WIN.txt +22 -44
  26. package/libusb/Makefile.am +32 -10
  27. package/libusb/{README.md → README} +2 -2
  28. package/libusb/README.git +3 -3
  29. package/libusb/Xcode/common.xcconfig +23 -19
  30. package/libusb/Xcode/config.h +25 -13
  31. package/libusb/Xcode/libusb.xcodeproj/project.pbxproj +511 -109
  32. package/libusb/android/README +90 -54
  33. package/libusb/android/config.h +23 -43
  34. package/libusb/android/examples/unrooted_android.c +301 -0
  35. package/libusb/android/examples/unrooted_android.h +36 -0
  36. package/libusb/android/jni/Android.mk +1 -1
  37. package/libusb/android/jni/Application.mk +16 -0
  38. package/libusb/android/jni/examples.mk +63 -29
  39. package/libusb/android/jni/libusb.mk +14 -8
  40. package/libusb/android/jni/tests.mk +13 -24
  41. package/libusb/appveyor.yml +69 -30
  42. package/libusb/autogen.sh +5 -3
  43. package/libusb/bootstrap.sh +6 -2
  44. package/libusb/configure.ac +302 -228
  45. package/libusb/doc/Makefile.in +22 -0
  46. package/libusb/doc/doxygen.cfg.in +460 -223
  47. package/libusb/examples/Makefile.am +6 -13
  48. package/libusb/examples/dpfp.c +276 -73
  49. package/libusb/examples/ezusb.c +18 -8
  50. package/libusb/examples/ezusb.h +6 -17
  51. package/libusb/examples/fxload.c +4 -5
  52. package/libusb/examples/hotplugtest.c +1 -1
  53. package/libusb/examples/sam3u_benchmark.c +59 -24
  54. package/libusb/examples/testlibusb.c +138 -104
  55. package/libusb/examples/xusb.c +26 -22
  56. package/libusb/libusb/Makefile.am +57 -70
  57. package/libusb/libusb/Makefile.am.extra +26 -0
  58. package/libusb/libusb/core.c +420 -423
  59. package/libusb/libusb/descriptor.c +365 -419
  60. package/libusb/libusb/hotplug.c +197 -104
  61. package/libusb/libusb/io.c +491 -528
  62. package/libusb/libusb/libusb-1.0.def +7 -3
  63. package/libusb/libusb/libusb-1.0.rc +1 -9
  64. package/libusb/libusb/libusb.h +295 -226
  65. package/libusb/libusb/libusbi.h +587 -314
  66. package/libusb/libusb/os/darwin_usb.c +634 -317
  67. package/libusb/libusb/os/darwin_usb.h +39 -15
  68. package/libusb/libusb/os/events_posix.c +300 -0
  69. package/libusb/libusb/os/events_posix.h +59 -0
  70. package/libusb/libusb/os/events_windows.c +214 -0
  71. package/libusb/{msvc/missing.h → libusb/os/events_windows.h} +25 -11
  72. package/libusb/libusb/os/haiku_pollfs.cpp +14 -9
  73. package/libusb/libusb/os/haiku_usb.h +12 -12
  74. package/libusb/libusb/os/haiku_usb_backend.cpp +36 -37
  75. package/libusb/libusb/os/haiku_usb_raw.cpp +80 -116
  76. package/libusb/libusb/os/linux_netlink.c +55 -63
  77. package/libusb/libusb/os/linux_udev.c +61 -69
  78. package/libusb/libusb/os/linux_usbfs.c +926 -1015
  79. package/libusb/libusb/os/linux_usbfs.h +74 -57
  80. package/libusb/libusb/os/netbsd_usb.c +103 -168
  81. package/libusb/libusb/os/null_usb.c +111 -0
  82. package/libusb/libusb/os/openbsd_usb.c +71 -120
  83. package/libusb/libusb/os/sunos_usb.c +289 -375
  84. package/libusb/libusb/os/sunos_usb.h +0 -1
  85. package/libusb/libusb/os/threads_posix.c +81 -32
  86. package/libusb/libusb/os/threads_posix.h +19 -23
  87. package/libusb/libusb/os/threads_windows.c +9 -95
  88. package/libusb/libusb/os/threads_windows.h +33 -31
  89. package/libusb/libusb/os/windows_common.c +904 -0
  90. package/libusb/libusb/os/windows_common.h +329 -42
  91. package/libusb/libusb/os/windows_usbdk.c +161 -267
  92. package/libusb/libusb/os/windows_usbdk.h +5 -2
  93. package/libusb/libusb/os/windows_winusb.c +1326 -1190
  94. package/libusb/libusb/os/windows_winusb.h +167 -167
  95. package/libusb/libusb/strerror.c +20 -30
  96. package/libusb/libusb/sync.c +20 -21
  97. package/libusb/libusb/version.h +1 -1
  98. package/libusb/libusb/version_nano.h +1 -1
  99. package/libusb/msvc/.gitattributes +3 -0
  100. package/libusb/msvc/config.h +27 -20
  101. package/libusb/msvc/{hotplugtest_2012.vcxproj → dpfp_2013.vcxproj} +14 -10
  102. package/libusb/msvc/dpfp_2013.vcxproj.filters +26 -0
  103. package/libusb/msvc/{listdevs_2010.vcxproj → dpfp_2015.vcxproj} +14 -9
  104. package/libusb/msvc/dpfp_2015.vcxproj.filters +26 -0
  105. package/libusb/msvc/dpfp_2017.vcxproj +106 -0
  106. package/libusb/msvc/dpfp_2017.vcxproj.filters +26 -0
  107. package/libusb/msvc/dpfp_2019.vcxproj +106 -0
  108. package/libusb/msvc/dpfp_2019.vcxproj.filters +26 -0
  109. package/libusb/msvc/dpfp_threaded_2013.vcxproj +87 -0
  110. package/libusb/msvc/dpfp_threaded_2013.vcxproj.filters +26 -0
  111. package/libusb/msvc/dpfp_threaded_2015.vcxproj +87 -0
  112. package/libusb/msvc/dpfp_threaded_2015.vcxproj.filters +26 -0
  113. package/libusb/msvc/dpfp_threaded_2017.vcxproj +106 -0
  114. package/libusb/msvc/dpfp_threaded_2017.vcxproj.filters +26 -0
  115. package/libusb/msvc/{fxload_2012.vcxproj → dpfp_threaded_2019.vcxproj} +32 -17
  116. package/libusb/msvc/dpfp_threaded_2019.vcxproj.filters +26 -0
  117. package/libusb/msvc/fxload_2013.vcxproj +6 -3
  118. package/libusb/msvc/fxload_2013.vcxproj.filters +35 -0
  119. package/libusb/msvc/fxload_2015.vcxproj +6 -3
  120. package/libusb/msvc/fxload_2015.vcxproj.filters +35 -0
  121. package/libusb/msvc/fxload_2017.vcxproj +6 -7
  122. package/libusb/msvc/fxload_2017.vcxproj.filters +35 -0
  123. package/libusb/msvc/{fxload_2010.vcxproj → fxload_2019.vcxproj} +29 -6
  124. package/libusb/msvc/fxload_2019.vcxproj.filters +35 -0
  125. package/libusb/{examples → msvc}/getopt/getopt.c +0 -0
  126. package/libusb/{examples → msvc}/getopt/getopt.h +0 -0
  127. package/libusb/{examples → msvc}/getopt/getopt1.c +0 -0
  128. package/libusb/msvc/getopt_2013.vcxproj +4 -5
  129. package/libusb/msvc/getopt_2013.vcxproj.filters +26 -0
  130. package/libusb/msvc/getopt_2015.vcxproj +4 -4
  131. package/libusb/msvc/getopt_2015.vcxproj.filters +26 -0
  132. package/libusb/msvc/getopt_2017.vcxproj +4 -10
  133. package/libusb/msvc/getopt_2017.vcxproj.filters +26 -0
  134. package/libusb/msvc/{getopt_2012.vcxproj → getopt_2019.vcxproj} +25 -6
  135. package/libusb/msvc/getopt_2019.vcxproj.filters +26 -0
  136. package/libusb/msvc/hotplugtest_2013.vcxproj +6 -3
  137. package/libusb/msvc/hotplugtest_2013.vcxproj.filters +23 -0
  138. package/libusb/msvc/hotplugtest_2015.vcxproj +6 -3
  139. package/libusb/msvc/hotplugtest_2015.vcxproj.filters +23 -0
  140. package/libusb/msvc/hotplugtest_2017.vcxproj +6 -7
  141. package/libusb/msvc/hotplugtest_2017.vcxproj.filters +23 -0
  142. package/libusb/msvc/hotplugtest_2019.vcxproj +105 -0
  143. package/libusb/msvc/hotplugtest_2019.vcxproj.filters +23 -0
  144. package/libusb/msvc/libusb_2013.sln +50 -20
  145. package/libusb/msvc/libusb_2015.sln +51 -21
  146. package/libusb/msvc/libusb_2017.sln +90 -36
  147. package/libusb/msvc/libusb_2019.sln +240 -0
  148. package/libusb/msvc/libusb_dll_2013.vcxproj +6 -9
  149. package/libusb/msvc/libusb_dll_2013.vcxproj.filters +94 -0
  150. package/libusb/msvc/libusb_dll_2015.vcxproj +6 -8
  151. package/libusb/msvc/libusb_dll_2015.vcxproj.filters +94 -0
  152. package/libusb/msvc/libusb_dll_2017.vcxproj +6 -16
  153. package/libusb/msvc/libusb_dll_2017.vcxproj.filters +94 -0
  154. package/libusb/msvc/{libusb_dll_2010.vcxproj → libusb_dll_2019.vcxproj} +27 -9
  155. package/libusb/msvc/libusb_dll_2019.vcxproj.filters +94 -0
  156. package/libusb/msvc/libusb_static_2013.vcxproj +5 -9
  157. package/libusb/msvc/libusb_static_2013.vcxproj.filters +80 -0
  158. package/libusb/msvc/libusb_static_2015.vcxproj +5 -8
  159. package/libusb/msvc/libusb_static_2015.vcxproj.filters +80 -0
  160. package/libusb/msvc/libusb_static_2017.vcxproj +5 -8
  161. package/libusb/msvc/libusb_static_2017.vcxproj.filters +80 -0
  162. package/libusb/msvc/{libusb_static_2010.vcxproj → libusb_static_2019.vcxproj} +26 -9
  163. package/libusb/msvc/libusb_static_2019.vcxproj.filters +80 -0
  164. package/libusb/msvc/listdevs_2013.vcxproj +6 -3
  165. package/libusb/msvc/listdevs_2013.vcxproj.filters +23 -0
  166. package/libusb/msvc/listdevs_2015.vcxproj +6 -3
  167. package/libusb/msvc/listdevs_2015.vcxproj.filters +23 -0
  168. package/libusb/msvc/listdevs_2017.vcxproj +6 -7
  169. package/libusb/msvc/listdevs_2017.vcxproj.filters +23 -0
  170. package/libusb/msvc/listdevs_2019.vcxproj +105 -0
  171. package/libusb/msvc/listdevs_2019.vcxproj.filters +23 -0
  172. package/libusb/msvc/{listdevs_2012.vcxproj → sam3u_benchmark_2013.vcxproj} +13 -9
  173. package/libusb/msvc/sam3u_benchmark_2013.vcxproj.filters +26 -0
  174. package/libusb/msvc/{hotplugtest_2010.vcxproj → sam3u_benchmark_2015.vcxproj} +13 -8
  175. package/libusb/msvc/sam3u_benchmark_2015.vcxproj.filters +26 -0
  176. package/libusb/msvc/sam3u_benchmark_2017.vcxproj +106 -0
  177. package/libusb/msvc/sam3u_benchmark_2017.vcxproj.filters +26 -0
  178. package/libusb/msvc/sam3u_benchmark_2019.vcxproj +106 -0
  179. package/libusb/msvc/sam3u_benchmark_2019.vcxproj.filters +26 -0
  180. package/libusb/msvc/stress_2013.vcxproj +4 -2
  181. package/libusb/msvc/stress_2013.vcxproj.filters +32 -0
  182. package/libusb/msvc/stress_2015.vcxproj +4 -2
  183. package/libusb/msvc/stress_2015.vcxproj.filters +32 -0
  184. package/libusb/msvc/stress_2017.vcxproj +4 -6
  185. package/libusb/msvc/stress_2017.vcxproj.filters +32 -0
  186. package/libusb/msvc/{stress_2010.vcxproj → stress_2019.vcxproj} +26 -4
  187. package/libusb/msvc/stress_2019.vcxproj.filters +32 -0
  188. package/libusb/msvc/testlibusb_2013.vcxproj +6 -3
  189. package/libusb/msvc/testlibusb_2013.vcxproj.filters +23 -0
  190. package/libusb/msvc/testlibusb_2015.vcxproj +6 -3
  191. package/libusb/msvc/testlibusb_2015.vcxproj.filters +23 -0
  192. package/libusb/msvc/testlibusb_2017.vcxproj +6 -7
  193. package/libusb/msvc/testlibusb_2017.vcxproj.filters +23 -0
  194. package/libusb/msvc/{testlibusb_2010.vcxproj → testlibusb_2019.vcxproj} +28 -5
  195. package/libusb/msvc/testlibusb_2019.vcxproj.filters +23 -0
  196. package/libusb/msvc/xusb_2013.vcxproj +6 -3
  197. package/libusb/msvc/xusb_2013.vcxproj.filters +23 -0
  198. package/libusb/msvc/xusb_2015.vcxproj +6 -3
  199. package/libusb/msvc/xusb_2015.vcxproj.filters +23 -0
  200. package/libusb/msvc/xusb_2017.vcxproj +6 -7
  201. package/libusb/msvc/xusb_2017.vcxproj.filters +23 -0
  202. package/libusb/msvc/{xusb_2010.vcxproj → xusb_2019.vcxproj} +28 -5
  203. package/libusb/msvc/xusb_2019.vcxproj.filters +23 -0
  204. package/libusb/tests/Makefile.am +1 -0
  205. package/libusb/tests/libusb_testlib.h +12 -43
  206. package/libusb/tests/stress.c +59 -50
  207. package/libusb/tests/testlib.c +78 -171
  208. package/libusb.gypi +10 -11
  209. package/package.json +2 -2
  210. package/prebuilds/android-arm/node.napi.armv7.node +0 -0
  211. package/prebuilds/android-arm64/node.napi.armv8.node +0 -0
  212. package/prebuilds/darwin-x64+arm64/node.napi.node +0 -0
  213. package/prebuilds/linux-arm/node.napi.armv6.node +0 -0
  214. package/prebuilds/linux-arm/node.napi.armv7.node +0 -0
  215. package/prebuilds/linux-arm64/node.napi.armv8.node +0 -0
  216. package/prebuilds/linux-ia32/node.napi.node +0 -0
  217. package/prebuilds/linux-x64/node.napi.glibc.node +0 -0
  218. package/prebuilds/linux-x64/node.napi.musl.node +0 -0
  219. package/prebuilds/win32-ia32/node.napi.node +0 -0
  220. package/prebuilds/win32-x64/node.napi.node +0 -0
  221. package/src/device.cc +12 -7
  222. package/src/node_usb.cc +10 -0
  223. package/test/usb.coffee +6 -0
  224. package/tsc/index.ts +2 -0
  225. package/tsc/usb/bindings.ts +5 -0
  226. package/tsc/usb/device.ts +6 -0
  227. package/tsc/usb/interface.ts +2 -7
  228. package/tsc/webusb/webusb-device.ts +12 -8
  229. package/libusb/.private/bd.cmd +0 -89
  230. package/libusb/.private/bwince.cmd +0 -57
  231. package/libusb/.private/wbs_wince.txt +0 -42
  232. package/libusb/Brewfile +0 -4
  233. package/libusb/appveyor_cygwin.bat +0 -11
  234. package/libusb/appveyor_minGW.bat +0 -19
  235. package/libusb/doc/Makefile.am +0 -9
  236. package/libusb/examples/dpfp_threaded.c +0 -557
  237. package/libusb/libusb/hotplug.h +0 -99
  238. package/libusb/libusb/os/poll_posix.c +0 -84
  239. package/libusb/libusb/os/poll_posix.h +0 -14
  240. package/libusb/libusb/os/poll_windows.c +0 -447
  241. package/libusb/libusb/os/poll_windows.h +0 -98
  242. package/libusb/libusb/os/wince_usb.c +0 -888
  243. package/libusb/libusb/os/wince_usb.h +0 -126
  244. package/libusb/libusb/os/windows_nt_common.c +0 -1010
  245. package/libusb/libusb/os/windows_nt_common.h +0 -110
  246. package/libusb/libusb/os/windows_nt_shared_types.h +0 -147
  247. package/libusb/msvc/appveyor.bat +0 -27
  248. package/libusb/msvc/ddk_build.cmd +0 -219
  249. package/libusb/msvc/errno.h +0 -102
  250. package/libusb/msvc/fxload_sources +0 -23
  251. package/libusb/msvc/getopt_2005.vcproj +0 -288
  252. package/libusb/msvc/getopt_2010.vcxproj +0 -72
  253. package/libusb/msvc/getopt_sources +0 -24
  254. package/libusb/msvc/hotplugtest_sources +0 -20
  255. package/libusb/msvc/inttypes.h +0 -295
  256. package/libusb/msvc/libusb.dsw +0 -71
  257. package/libusb/msvc/libusb_2005.sln +0 -95
  258. package/libusb/msvc/libusb_2010.sln +0 -105
  259. package/libusb/msvc/libusb_2012.sln +0 -105
  260. package/libusb/msvc/libusb_dll.dsp +0 -194
  261. package/libusb/msvc/libusb_dll_2005.vcproj +0 -464
  262. package/libusb/msvc/libusb_dll_2012.vcxproj +0 -107
  263. package/libusb/msvc/libusb_dll_wince.vcproj +0 -1251
  264. package/libusb/msvc/libusb_sources +0 -43
  265. package/libusb/msvc/libusb_static.dsp +0 -174
  266. package/libusb/msvc/libusb_static_2005.vcproj +0 -390
  267. package/libusb/msvc/libusb_static_2012.vcxproj +0 -98
  268. package/libusb/msvc/libusb_static_wince.vcproj +0 -1179
  269. package/libusb/msvc/libusb_wince.sln +0 -246
  270. package/libusb/msvc/listdevs.dsp +0 -103
  271. package/libusb/msvc/listdevs_2005.vcproj +0 -360
  272. package/libusb/msvc/listdevs_sources +0 -20
  273. package/libusb/msvc/listdevs_wince.vcproj +0 -1120
  274. package/libusb/msvc/missing.c +0 -80
  275. package/libusb/msvc/stdint.h +0 -256
  276. package/libusb/msvc/stress_2005.vcproj +0 -390
  277. package/libusb/msvc/stress_2012.vcxproj +0 -87
  278. package/libusb/msvc/stress_sources +0 -21
  279. package/libusb/msvc/stress_wince.vcproj +0 -1128
  280. package/libusb/msvc/testlibusb_2012.vcxproj +0 -83
  281. package/libusb/msvc/testlibusb_sources +0 -20
  282. package/libusb/msvc/xusb.dsp +0 -102
  283. package/libusb/msvc/xusb_2005.vcproj +0 -344
  284. package/libusb/msvc/xusb_2012.vcxproj +0 -83
  285. package/libusb/msvc/xusb_sources +0 -20
  286. package/libusb/msvc/xusb_wince.vcproj +0 -1120
  287. 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 = LoadLibraryA("UsbDkHelper");
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 = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
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
- return LIBUSB_ERROR_OTHER;
187
+ goto error_free_library;
182
188
  }
183
189
 
184
- serviceHandle = OpenServiceA(managerHandle, "UsbDk", GENERIC_READ);
185
- CloseServiceHandle(managerHandle);
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
- CloseServiceHandle(serviceHandle);
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 *p, uint8_t count)
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(p->config_descriptors[i]);
236
+ usbdk_helper.ReleaseConfigurationDescriptor(priv->config_descriptors[i]);
225
237
 
226
- free(p->config_descriptors);
227
- p->config_descriptors = NULL;
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 *p, PUSB_DK_DEVICE_INFO info)
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
- p->config_descriptors = calloc(info->DeviceDescriptor.bNumConfigurations, sizeof(PUSB_CONFIGURATION_DESCRIPTOR));
238
- if (p->config_descriptors == NULL) {
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, &p->config_descriptors[i], &Length)) {
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(p, i);
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 *p = _usbdk_device_priv(dev);
271
+ struct usbdk_device_priv *priv = usbi_get_device_priv(dev);
260
272
 
261
- p->info = *info;
262
- p->active_configuration = 0;
273
+ priv->ID = info->ID;
274
+ priv->active_configuration = 0;
263
275
 
264
- return usbdk_cache_config_descriptors(ctx, p, info);
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->num_configurations = info->DeviceDescriptor.bNumConfigurations;
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 usbdk_get_device_descriptor(struct libusb_device *dev, unsigned char *buffer)
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 = _usbdk_device_priv(dev);
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
- unsigned char **buffer)
376
+ void **buffer)
375
377
  {
376
- struct usbdk_device_priv *priv = _usbdk_device_priv(dev);
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->num_configurations; index++) {
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 = (unsigned char *)priv->config_descriptors[index];
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, unsigned char *buffer, size_t len)
393
+ static int usbdk_get_active_config_descriptor(struct libusb_device *dev, void *buffer, size_t len)
392
394
  {
393
- return usbdk_get_config_descriptor(dev, _usbdk_device_priv(dev)->active_configuration,
394
- buffer, len);
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 usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev);
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
- priv->redirector_handle = usbdk_helper.StartRedirect(&priv->info.ID);
402
- if (priv->redirector_handle == INVALID_HANDLE_VALUE) {
403
- usbi_err(DEVICE_CTX(dev_handle->dev), "Redirector startup failed");
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
- priv->system_handle = usbdk_helper.GetRedirectorSystemHandle(priv->redirector_handle);
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 = _usbdk_device_priv(dev_handle->dev);
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, int *config)
438
+ static int usbdk_get_configuration(struct libusb_device_handle *dev_handle, uint8_t *config)
421
439
  {
422
- *config = _usbdk_device_priv(dev_handle->dev)->active_configuration;
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, int config)
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, int iface)
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, int iface, int altsetting)
461
+ static int usbdk_set_interface_altsetting(struct libusb_device_handle *dev_handle, uint8_t iface, uint8_t altsetting)
442
462
  {
443
- struct libusb_context *ctx = HANDLE_CTX(dev_handle);
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(ctx, "SetAltsetting failed: %s", windows_error_str(0));
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, int iface)
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 libusb_context *ctx = HANDLE_CTX(dev_handle);
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(ctx, "ResetPipe failed: %s", windows_error_str(0));
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 libusb_context *ctx = HANDLE_CTX(dev_handle);
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(ctx, "ResetDevice failed: %s", windows_error_str(0));
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* p = _usbdk_device_priv(dev);
506
+ struct usbdk_device_priv *priv = usbi_get_device_priv(dev);
490
507
 
491
- if (p->config_descriptors != NULL)
492
- usbdk_release_config_descriptors(p, p->info.DeviceDescriptor.bNumConfigurations);
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 = _usbdk_transfer_priv(itransfer);
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 = _usbdk_device_priv(transfer->dev_handle->dev);
514
- struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer);
515
- struct libusb_context *ctx = TRANSFER_CTX(transfer);
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(overlapped, (ULONG)transfer_priv->request.Result.GenResult.BytesTransferred);
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(ctx, "ControlTransfer failed: %s", windows_error_str(0));
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 = _usbdk_device_priv(transfer->dev_handle->dev);
546
- struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer);
547
- struct libusb_context *ctx = TRANSFER_CTX(transfer);
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(overlapped, (ULONG)transfer_priv->request.Result.GenResult.BytesTransferred);
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(ctx, "ReadPipe/WritePipe failed: %s", windows_error_str(0));
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 = _usbdk_device_priv(transfer->dev_handle->dev);
590
- struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer);
591
- struct libusb_context *ctx = TRANSFER_CTX(transfer);
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(ctx, "Allocation of IsochronousPacketsArray failed");
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(ctx, "Allocation of isochronousResultsArray failed");
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(overlapped, (ULONG)transfer_priv->request.Result.GenResult.BytesTransferred);
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
- events = (transfer->buffer[0] & LIBUSB_ENDPOINT_IN) ? POLLIN : POLLOUT;
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
- events = IS_XFERIN(transfer) ? POLLIN : POLLOUT;
686
- transfer_fn = usbdk_do_bulk_transfer;
687
- break;
660
+ return usbdk_do_bulk_transfer(itransfer);
688
661
  case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:
689
- events = IS_XFERIN(transfer) ? POLLIN : POLLOUT;
690
- transfer_fn = usbdk_do_iso_transfer;
691
- break;
662
+ return usbdk_do_iso_transfer(itransfer);
692
663
  default:
693
- usbi_err(TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type);
694
- return LIBUSB_ERROR_INVALID_PARAM;
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 int usbdk_abort_transfers(struct usbi_transfer *itransfer)
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 libusb_context *ctx = TRANSFER_CTX(transfer);
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
- return LIBUSB_SUCCESS;
722
- }
676
+ UNUSED(length);
723
677
 
724
- static int usbdk_cancel_transfer(struct usbi_transfer *itransfer)
725
- {
726
- struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
727
-
728
- switch (transfer->type) {
729
- case LIBUSB_TRANSFER_TYPE_CONTROL:
730
- // Control transfers cancelled by IoCancelXXX() API
731
- // No special treatment needed
732
- return LIBUSB_SUCCESS;
733
- case LIBUSB_TRANSFER_TYPE_BULK:
734
- case LIBUSB_TRANSFER_TYPE_INTERRUPT:
735
- case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:
736
- return usbdk_abort_transfers(itransfer);
737
- default:
738
- usbi_err(ITRANSFER_CTX(itransfer), "unknown endpoint type %d", transfer->type);
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
- *io_size = (DWORD)transfer_priv->request.Result.GenResult.BytesTransferred;
800
- *io_result = usbdk_translate_usbd_status((USBD_STATUS)transfer_priv->request.Result.GenResult.UsbdStatus);
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
- usbdk_cancel_transfer,
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
  };