From: Dmitry F. <dm...@da...> - 2015-07-26 10:25:09
|
Hello Chris, I see that version 1.0.20 was released recently. Does this mean you’ll proceed with UsbDk patches anytime soon? Do you need any help from us in order to have this merged? Thanks in advance, Dmitry > On May 5, 2015, at 08:29 AM, Chris Dickens <chr...@gm...> wrote: > > Hi Dmitry, > > Thanks for all your work on this. Sorry this has been a slow process--I've got a lot of other things on my plate. As you may have seen, I've just released a patch series that has been in the works for quite some time. I would like to get this merged and v1.0.20 released ASAP, then have a much quicker development cycle for v1.0.21 that will include usbdk. I'm reviewing this latest usbdk patch series now. > > Regards, > Chris > > On Mon, May 4, 2015 at 5:54 AM, Dmitry Fleytman <dm...@da... <mailto:dm...@da...>> wrote: > Hello libusb-devel, > > Following is the next version of UsbDk backend patches. > The same patches are also available at https://github.com/dmitryfleytman/libusb/tree/usbdk-backend-v3 <https://github.com/dmitryfleytman/libusb/tree/usbdk-backend-v3> > > Since Pete is not going to work on libusb in a foreseen future, > could someone please pick this series up? > > Thanks, > Dmitry > > ===================================================================================== > > Changes since v2: > > 1. UsbDk clear_halt callback implementation fixed > > Changes since v1: > > 1. Project files for Visual Studio 2013 added > 2. DDK/WDK build files updated to support builds with UsbDk backend > 3. File names changed as agreed (windows_usb.* -> windows_winusb.*) > 4. Function names in windows_nt_common.c changed as areed ("nt" dropped) > 5. UsbDk headers merged as agreed, no subfolder, one file only (windows_usbdk.h) > 6. Build tested and fixed for different MinGW versions > > Adding dynamic backend selection for UsbDk/libusb*/WinUsb configuration turned out > to be too tricky for a number of reasons, so we would like to postpone this feature > for now and return to it later along with support for attach/detach mode. > > We will also release a new usbDk version in a few days with support for persistent > hide rules feature as suggested on this list before. > > ===================================================================================== > > This series contains patches that extend Windows backend to support UsbDk. > Switch between UsbDk and WinUSB/LibusbK/Libusb0 is done at compile time > with --enable-usbdk configuration option (off by default). > > UsbDk (USB Development Kit) is a set of software components meant to provide > Windows user mode applications with direct and exclusive access to USB devices. > > Some distinctive UsbDk properties are: > > 1. UsbDk supports all types of devices and interfaces - bulk, isochronous, > composite, HID etc. > 2. Device capture process is totally dynamic, i.e. no inf files and > self-signing needed, any device can be captured. > 3. UsbDk co-exists with original device driver, when the device is not > captured original driver is loaded by the system automatically. > 4. If user mode client terminates unexpectedly for any reason system reverts > to original device driver immediately. > 5. Being USB filter driver UsbDk doesn't require WHQL-ing > as per Microsoft requirements. > > UsbDk supports all Windows OS versions staring from Windows XP, > i.e. XP/Vista/7/8/8.1/2003/2008/2008R2/2012/2012R2. > Both 32 and 64 bit architectures are supported. > > UsbDk is fully open source and distributed under Apache 2.0 license. > > UsbDk project is hosted at spice-space.org <http://spice-space.org/>, source code repository available at: > http://cgit.freedesktop.org/spice/win32/usbdk <http://cgit.freedesktop.org/spice/win32/usbdk> > > Latest source tarball is at: http://www.spice-space.org/download/windows/usbdk/spice-usbdk-win-1.0-2-sources.zip <http://www.spice-space.org/download/windows/usbdk/spice-usbdk-win-1.0-2-sources.zip> > > UsbDk releases come with precompiled and signed by Red Hat binaries: > 1. 32 bit: http://www.spice-space.org/download/windows/usbdk/UsbDk_1.0.2_x86.msi <http://www.spice-space.org/download/windows/usbdk/UsbDk_1.0.2_x86.msi> > 2. 64 bit: http://www.spice-space.org/download/windows/usbdk/UsbDk_1.0.2_x64.msi <http://www.spice-space.org/download/windows/usbdk/UsbDk_1.0.2_x64.msi> > > UsbDk documentation: > 1. Short presentation: http://www.spice-space.org/docs/usbdk/UsbDk_at_a_Glance.pdf <http://www.spice-space.org/docs/usbdk/UsbDk_at_a_Glance.pdf> > 2. SDM: http://www.spice-space.org/docs/usbdk/UsbDk_Software_Development_Manual.pdf <http://www.spice-space.org/docs/usbdk/UsbDk_Software_Development_Manual.pdf> > 3. UsbDk architecture specificatin (part of source tree): > http://cgit.freedesktop.org/spice/win32/usbdk/tree/ARCHITECTURE <http://cgit.freedesktop.org/spice/win32/usbdk/tree/ARCHITECTURE> > > UsbDk is maintained by Dmitry Fleytman (dfl...@re... <mailto:dfl...@re...>) and > Kirill Moizik (km...@re... <mailto:km...@re...>) we'll be glad to answer your questions sent > to us directly or via this mailing list. > > What do you think about this series? > We will be glad to have it accepted into libusb upstream. > > Best Regards, > Dmitry > > Dmitry Fleytman (5): > windows: Move common definitions to a separate file > windows: Rename windows_usb.h/c windows_winusb.h/c > usbdk: Introduce usbdk backend > build: Integrate usbdk backend > usbdk: Add VS2013 projects and WDK build support > > configure.ac <http://configure.ac/> | 9 + > libusb/Makefile.am | 16 +- > libusb/core.c | 6 + > libusb/libusbi.h | 1 + > libusb/os/windows_nt_common.c | 579 ++++ > libusb/os/windows_nt_common.h | 65 + > libusb/os/windows_usb.c | 4651 ------------------------------- > libusb/os/windows_usb.h | 959 ------- > libusb/os/windows_usbdk.c | 921 ++++++ > libusb/os/windows_usbdk.h | 120 + > libusb/os/windows_winusb.c | 4146 +++++++++++++++++++++++++++ > libusb/os/windows_winusb.h | 947 +++++++ > msvc/ddk_build.cmd | 9 + > msvc/libusb_2013.sln | 20 + > msvc/libusb_dll.dsp | 4 +- > msvc/libusb_dll_2005.vcproj | 4 +- > msvc/libusb_dll_2010.vcxproj | 4 +- > msvc/libusb_dll_2010.vcxproj.filters | 4 +- > msvc/libusb_dll_2012.vcxproj | 4 +- > msvc/libusb_dll_2012.vcxproj.filters | 4 +- > msvc/libusb_dll_2013.vcxproj | 7 +- > msvc/libusb_sources | 10 +- > msvc/libusb_static.dsp | 4 +- > msvc/libusb_static_2005.vcproj | 4 +- > msvc/libusb_static_2010.vcxproj | 4 +- > msvc/libusb_static_2010.vcxproj.filters | 4 +- > msvc/libusb_static_2012.vcxproj | 4 +- > msvc/libusb_static_2012.vcxproj.filters | 4 +- > msvc/libusb_static_2013.vcxproj | 6 +- > msvc/libusb_usbdk_dll_2013.vcxproj | 178 ++ > msvc/libusb_usbdk_static_2013.vcxproj | 162 ++ > 31 files changed, 7216 insertions(+), 5644 deletions(-) > create mode 100644 libusb/os/windows_nt_common.c > create mode 100644 libusb/os/windows_nt_common.h > delete mode 100644 libusb/os/windows_usb.c > delete mode 100644 libusb/os/windows_usb.h > create mode 100644 libusb/os/windows_usbdk.c > create mode 100644 libusb/os/windows_usbdk.h > create mode 100644 libusb/os/windows_winusb.c > create mode 100644 libusb/os/windows_winusb.h > create mode 100644 msvc/libusb_usbdk_dll_2013.vcxproj > create mode 100644 msvc/libusb_usbdk_static_2013.vcxproj > > -- > 2.1.0 > > > ------------------------------------------------------------------------------ > One dashboard for servers and applications across Physical-Virtual-Cloud > Widest out-of-the-box monitoring support with 50+ applications > Performance metrics, stats and reports that give you Actionable Insights > Deep dive visibility with transaction tracing using APM Insight. > http://ad.doubleclick.net/ddm/clk/290420510;117567292;y <http://ad.doubleclick.net/ddm/clk/290420510;117567292;y> > _______________________________________________ > libusb-devel mailing list > lib...@li... <mailto:lib...@li...> > https://lists.sourceforge.net/lists/listinfo/libusb-devel <https://lists.sourceforge.net/lists/listinfo/libusb-devel> > |
From: Xiaofan C. <xia...@gm...> - 2015-07-27 07:52:29
|
On Sun, Jul 26, 2015 at 5:59 PM, Dmitry Fleytman <dm...@da...> wrote: > Hello Chris, > > I see that version 1.0.20 was released recently. Does this mean you’ll > proceed with UsbDk patches anytime soon? > Do you need any help from us in order to have this merged? > > Thanks in advance, > Dmitry Where did you find the 1.0.20 release? > On May 5, 2015, at 08:29 AM, Chris Dickens <chr...@gm...> > wrote: > > Hi Dmitry, > > Thanks for all your work on this. Sorry this has been a slow process--I've > got a lot of other things on my plate. As you may have seen, I've just > released a patch series that has been in the works for quite some time. I > would like to get this merged and v1.0.20 released ASAP, then have a much > quicker development cycle for v1.0.21 that will include usbdk. I'm reviewing > this latest usbdk patch series now. > > Regards, > Chris > > -- Xiaofan |
From: Dmitry F. <dm...@da...> - 2015-07-27 08:05:23
|
> On Jul 27, 2015, at 10:52 AM, Xiaofan Chen <xia...@gm...> wrote: > > On Sun, Jul 26, 2015 at 5:59 PM, Dmitry Fleytman <dm...@da... <mailto:dm...@da...>> wrote: >> Hello Chris, >> >> I see that version 1.0.20 was released recently. Does this mean you’ll >> proceed with UsbDk patches anytime soon? >> Do you need any help from us in order to have this merged? >> >> Thanks in advance, >> Dmitry > > Where did you find the 1.0.20 release? Oops, I think I was mislead by some recent mailings on the list… Now I see it is not released yet :) > >> On May 5, 2015, at 08:29 AM, Chris Dickens <chr...@gm...> >> wrote: >> >> Hi Dmitry, >> >> Thanks for all your work on this. Sorry this has been a slow process--I've >> got a lot of other things on my plate. As you may have seen, I've just >> released a patch series that has been in the works for quite some time. I >> would like to get this merged and v1.0.20 released ASAP, then have a much >> quicker development cycle for v1.0.21 that will include usbdk. I'm reviewing >> this latest usbdk patch series now. >> >> Regards, >> Chris >> >> > > -- > Xiaofan |
From: Chris D. <chr...@gm...> - 2015-07-28 04:46:27
|
Hi Dmity, Yes, I will proceed with the UsbDk patches following the 1.0.20 release. Hopefully that will be finalized within a few weeks. Thanks for your patience! Regards, Chris On Mon, Jul 27, 2015 at 1:05 AM, Dmitry Fleytman <dm...@da...> wrote: > > On Jul 27, 2015, at 10:52 AM, Xiaofan Chen <xia...@gm...> wrote: > > On Sun, Jul 26, 2015 at 5:59 PM, Dmitry Fleytman <dm...@da...> > wrote: > > Hello Chris, > > I see that version 1.0.20 was released recently. Does this mean you’ll > proceed with UsbDk patches anytime soon? > Do you need any help from us in order to have this merged? > > Thanks in advance, > Dmitry > > > Where did you find the 1.0.20 release? > > > Oops, I think I was mislead by some recent mailings on the list… > Now I see it is not released yet :) > > > On May 5, 2015, at 08:29 AM, Chris Dickens < > chr...@gm...> > wrote: > > Hi Dmitry, > > Thanks for all your work on this. Sorry this has been a slow process--I've > got a lot of other things on my plate. As you may have seen, I've just > released a patch series that has been in the works for quite some time. I > would like to get this merged and v1.0.20 released ASAP, then have a much > quicker development cycle for v1.0.21 that will include usbdk. I'm > reviewing > this latest usbdk patch series now. > > Regards, > Chris > > > > -- > Xiaofan > > > |
From: Dmitry F. <dm...@da...> - 2015-10-28 07:08:02
|
Hello Chris, Any news regarding this? Thanks, Dmitry > On 28 Jul 2015, at 07:46 AM, Chris Dickens <chr...@gm...> wrote: > > Hi Dmity, > > Yes, I will proceed with the UsbDk patches following the 1.0.20 release. Hopefully that will be finalized within a few weeks. > > Thanks for your patience! > > Regards, > Chris > > On Mon, Jul 27, 2015 at 1:05 AM, Dmitry Fleytman <dm...@da... <mailto:dm...@da...>> wrote: > >> On Jul 27, 2015, at 10:52 AM, Xiaofan Chen <xia...@gm... <mailto:xia...@gm...>> wrote: >> >> On Sun, Jul 26, 2015 at 5:59 PM, Dmitry Fleytman <dm...@da... <mailto:dm...@da...>> wrote: >>> Hello Chris, >>> >>> I see that version 1.0.20 was released recently. Does this mean you’ll >>> proceed with UsbDk patches anytime soon? >>> Do you need any help from us in order to have this merged? >>> >>> Thanks in advance, >>> Dmitry >> >> Where did you find the 1.0.20 release? > > Oops, I think I was mislead by some recent mailings on the list… > Now I see it is not released yet :) > >> >>> On May 5, 2015, at 08:29 AM, Chris Dickens <chr...@gm... <mailto:chr...@gm...>> >>> wrote: >>> >>> Hi Dmitry, >>> >>> Thanks for all your work on this. Sorry this has been a slow process--I've >>> got a lot of other things on my plate. As you may have seen, I've just >>> released a patch series that has been in the works for quite some time. I >>> would like to get this merged and v1.0.20 released ASAP, then have a much >>> quicker development cycle for v1.0.21 that will include usbdk. I'm reviewing >>> this latest usbdk patch series now. >>> >>> Regards, >>> Chris >>> >>> >> >> -- >> Xiaofan > > |
From: Dmitry F. <dm...@da...> - 2015-11-22 08:53:20
|
Hello Chris, Ping! :) Do you need any help from me, i.e. rebase etc. to proceed? ~Dmitry. > On 28 Oct 2015, at 08:41 AM, Dmitry Fleytman <dm...@da...> wrote: > > Hello Chris, > > Any news regarding this? > > Thanks, > Dmitry > >> On 28 Jul 2015, at 07:46 AM, Chris Dickens <chr...@gm... <mailto:chr...@gm...>> wrote: >> >> Hi Dmity, >> >> Yes, I will proceed with the UsbDk patches following the 1.0.20 release. Hopefully that will be finalized within a few weeks. >> >> Thanks for your patience! >> >> Regards, >> Chris >> >> On Mon, Jul 27, 2015 at 1:05 AM, Dmitry Fleytman <dm...@da... <mailto:dm...@da...>> wrote: >> >>> On Jul 27, 2015, at 10:52 AM, Xiaofan Chen <xia...@gm... <mailto:xia...@gm...>> wrote: >>> >>> On Sun, Jul 26, 2015 at 5:59 PM, Dmitry Fleytman <dm...@da... <mailto:dm...@da...>> wrote: >>>> Hello Chris, >>>> >>>> I see that version 1.0.20 was released recently. Does this mean you’ll >>>> proceed with UsbDk patches anytime soon? >>>> Do you need any help from us in order to have this merged? >>>> >>>> Thanks in advance, >>>> Dmitry >>> >>> Where did you find the 1.0.20 release? >> >> Oops, I think I was mislead by some recent mailings on the list… >> Now I see it is not released yet :) >> >>> >>>> On May 5, 2015, at 08:29 AM, Chris Dickens <chr...@gm... <mailto:chr...@gm...>> >>>> wrote: >>>> >>>> Hi Dmitry, >>>> >>>> Thanks for all your work on this. Sorry this has been a slow process--I've >>>> got a lot of other things on my plate. As you may have seen, I've just >>>> released a patch series that has been in the works for quite some time. I >>>> would like to get this merged and v1.0.20 released ASAP, then have a much >>>> quicker development cycle for v1.0.21 that will include usbdk. I'm reviewing >>>> this latest usbdk patch series now. >>>> >>>> Regards, >>>> Chris >>>> >>>> >>> >>> -- >>> Xiaofan >> >> > |
From: Chris D. <chr...@gm...> - 2015-12-02 08:04:27
|
Hi Dmitry, I see UsbDk v1.0.8 was just released. I'm ready to get started on integrating this, but a few action items (based on the v4 branch): 1) The first commit that adds windows_nt_common.c breaks the VS builds. Please have each commit that adds or changes file names also include updates to the VS projects, libusb_sources, and affected .dsp files as they go, instead of all at the end. 2) The clock_gettime code in windows_nt_common.c is based on the previous implementation. Please update this to match the current implementation. 3) Can we rename all the win_* functions to windows_*? We don't abbreviate anywhere else, and I'd like the naming to be consistent. Similarly, I don't think we need "backend" in any of the function names (e.g. win_backend_get_fd can simply be windows_get_fd). 4) win_transfer_callback() is not used outside of windows_nt_common.c, so please make this static and remove from the header file. Thanks again for all your work on this! Regards, Chris On Sun, Nov 22, 2015 at 12:23 AM, Dmitry Fleytman <dm...@da...> wrote: > Hello Chris, > > Ping! :) > > Do you need any help from me, i.e. rebase etc. to proceed? > > ~Dmitry. > > On 28 Oct 2015, at 08:41 AM, Dmitry Fleytman <dm...@da...> wrote: > > Hello Chris, > > Any news regarding this? > > Thanks, > Dmitry > > On 28 Jul 2015, at 07:46 AM, Chris Dickens <chr...@gm...> > wrote: > > Hi Dmity, > > Yes, I will proceed with the UsbDk patches following the 1.0.20 release. > Hopefully that will be finalized within a few weeks. > > Thanks for your patience! > > Regards, > Chris > > On Mon, Jul 27, 2015 at 1:05 AM, Dmitry Fleytman <dm...@da...> wrote: >> >> >> On Jul 27, 2015, at 10:52 AM, Xiaofan Chen <xia...@gm...> wrote: >> >> On Sun, Jul 26, 2015 at 5:59 PM, Dmitry Fleytman <dm...@da...> >> wrote: >> >> Hello Chris, >> >> I see that version 1.0.20 was released recently. Does this mean you’ll >> proceed with UsbDk patches anytime soon? >> Do you need any help from us in order to have this merged? >> >> Thanks in advance, >> Dmitry >> >> >> Where did you find the 1.0.20 release? >> >> >> Oops, I think I was mislead by some recent mailings on the list… >> Now I see it is not released yet :) >> >> >> On May 5, 2015, at 08:29 AM, Chris Dickens >> <chr...@gm...> >> wrote: >> >> Hi Dmitry, >> >> Thanks for all your work on this. Sorry this has been a slow process--I've >> got a lot of other things on my plate. As you may have seen, I've just >> released a patch series that has been in the works for quite some time. I >> would like to get this merged and v1.0.20 released ASAP, then have a much >> quicker development cycle for v1.0.21 that will include usbdk. I'm >> reviewing >> this latest usbdk patch series now. >> >> Regards, >> Chris >> >> >> >> -- >> Xiaofan >> >> > > > |
From: Dmitry F. <dm...@da...> - 2015-12-02 08:09:10
|
> On 2 Dec 2015, at 10:04 AM, Chris Dickens <chr...@gm...> wrote: > > Hi Dmitry, > > I see UsbDk v1.0.8 was just released. I'm ready to get started on > integrating this, but a few action items (based on the v4 branch): > > 1) The first commit that adds windows_nt_common.c breaks the VS > builds. Please have each commit that adds or changes file names also > include updates to the VS projects, libusb_sources, and affected .dsp > files as they go, instead of all at the end. > 2) The clock_gettime code in windows_nt_common.c is based on the > previous implementation. Please update this to match the current > implementation. > 3) Can we rename all the win_* functions to windows_*? We don't > abbreviate anywhere else, and I'd like the naming to be consistent. > Similarly, I don't think we need "backend" in any of the function > names (e.g. win_backend_get_fd can simply be windows_get_fd). > 4) win_transfer_callback() is not used outside of windows_nt_common.c, > so please make this static and remove from the header file. > > Thanks again for all your work on this! Hi Chris, I’m glad we’re moving forward, thanks for your efforts. I’ll go over your comments and come up with updated patches. Regards, Dmitry > > Regards, > Chris > > On Sun, Nov 22, 2015 at 12:23 AM, Dmitry Fleytman <dm...@da...> wrote: >> Hello Chris, >> >> Ping! :) >> >> Do you need any help from me, i.e. rebase etc. to proceed? >> >> ~Dmitry. >> >> On 28 Oct 2015, at 08:41 AM, Dmitry Fleytman <dm...@da...> wrote: >> >> Hello Chris, >> >> Any news regarding this? >> >> Thanks, >> Dmitry >> >> On 28 Jul 2015, at 07:46 AM, Chris Dickens <chr...@gm...> >> wrote: >> >> Hi Dmity, >> >> Yes, I will proceed with the UsbDk patches following the 1.0.20 release. >> Hopefully that will be finalized within a few weeks. >> >> Thanks for your patience! >> >> Regards, >> Chris >> >> On Mon, Jul 27, 2015 at 1:05 AM, Dmitry Fleytman <dm...@da...> wrote: >>> >>> >>> On Jul 27, 2015, at 10:52 AM, Xiaofan Chen <xia...@gm...> wrote: >>> >>> On Sun, Jul 26, 2015 at 5:59 PM, Dmitry Fleytman <dm...@da...> >>> wrote: >>> >>> Hello Chris, >>> >>> I see that version 1.0.20 was released recently. Does this mean you’ll >>> proceed with UsbDk patches anytime soon? >>> Do you need any help from us in order to have this merged? >>> >>> Thanks in advance, >>> Dmitry >>> >>> >>> Where did you find the 1.0.20 release? >>> >>> >>> Oops, I think I was mislead by some recent mailings on the list… >>> Now I see it is not released yet :) >>> >>> >>> On May 5, 2015, at 08:29 AM, Chris Dickens >>> <chr...@gm...> >>> wrote: >>> >>> Hi Dmitry, >>> >>> Thanks for all your work on this. Sorry this has been a slow process--I've >>> got a lot of other things on my plate. As you may have seen, I've just >>> released a patch series that has been in the works for quite some time. I >>> would like to get this merged and v1.0.20 released ASAP, then have a much >>> quicker development cycle for v1.0.21 that will include usbdk. I'm >>> reviewing >>> this latest usbdk patch series now. >>> >>> Regards, >>> Chris >>> >>> >>> >>> -- >>> Xiaofan >>> >>> >> >> >> |
From: Dmitry F. <dm...@da...> - 2015-12-06 15:16:38
|
Hi Chris, I had rebased patches to the current master, and addressed all your comments. The new version of series (v5) sent to the mailing list a few minutes ago. Please let me know if you need additional help from me. Thanks for your efforts, Dmitry > On 2 Dec 2015, at 10:09 AM, Dmitry Fleytman <dm...@da...> wrote: > >> >> On 2 Dec 2015, at 10:04 AM, Chris Dickens <chr...@gm...> wrote: >> >> Hi Dmitry, >> >> I see UsbDk v1.0.8 was just released. I'm ready to get started on >> integrating this, but a few action items (based on the v4 branch): >> >> 1) The first commit that adds windows_nt_common.c breaks the VS >> builds. Please have each commit that adds or changes file names also >> include updates to the VS projects, libusb_sources, and affected .dsp >> files as they go, instead of all at the end. >> 2) The clock_gettime code in windows_nt_common.c is based on the >> previous implementation. Please update this to match the current >> implementation. >> 3) Can we rename all the win_* functions to windows_*? We don't >> abbreviate anywhere else, and I'd like the naming to be consistent. >> Similarly, I don't think we need "backend" in any of the function >> names (e.g. win_backend_get_fd can simply be windows_get_fd). >> 4) win_transfer_callback() is not used outside of windows_nt_common.c, >> so please make this static and remove from the header file. >> >> Thanks again for all your work on this! > > Hi Chris, > > I’m glad we’re moving forward, thanks for your efforts. I’ll go over your comments and come up with updated patches. > > Regards, > Dmitry > >> >> Regards, >> Chris >> >> On Sun, Nov 22, 2015 at 12:23 AM, Dmitry Fleytman <dm...@da...> wrote: >>> Hello Chris, >>> >>> Ping! :) >>> >>> Do you need any help from me, i.e. rebase etc. to proceed? >>> >>> ~Dmitry. >>> >>> On 28 Oct 2015, at 08:41 AM, Dmitry Fleytman <dm...@da...> wrote: >>> >>> Hello Chris, >>> >>> Any news regarding this? >>> >>> Thanks, >>> Dmitry >>> >>> On 28 Jul 2015, at 07:46 AM, Chris Dickens <chr...@gm...> >>> wrote: >>> >>> Hi Dmity, >>> >>> Yes, I will proceed with the UsbDk patches following the 1.0.20 release. >>> Hopefully that will be finalized within a few weeks. >>> >>> Thanks for your patience! >>> >>> Regards, >>> Chris >>> >>> On Mon, Jul 27, 2015 at 1:05 AM, Dmitry Fleytman <dm...@da...> wrote: >>>> >>>> >>>> On Jul 27, 2015, at 10:52 AM, Xiaofan Chen <xia...@gm...> wrote: >>>> >>>> On Sun, Jul 26, 2015 at 5:59 PM, Dmitry Fleytman <dm...@da...> >>>> wrote: >>>> >>>> Hello Chris, >>>> >>>> I see that version 1.0.20 was released recently. Does this mean you’ll >>>> proceed with UsbDk patches anytime soon? >>>> Do you need any help from us in order to have this merged? >>>> >>>> Thanks in advance, >>>> Dmitry >>>> >>>> >>>> Where did you find the 1.0.20 release? >>>> >>>> >>>> Oops, I think I was mislead by some recent mailings on the list… >>>> Now I see it is not released yet :) >>>> >>>> >>>> On May 5, 2015, at 08:29 AM, Chris Dickens >>>> <chr...@gm...> >>>> wrote: >>>> >>>> Hi Dmitry, >>>> >>>> Thanks for all your work on this. Sorry this has been a slow process--I've >>>> got a lot of other things on my plate. As you may have seen, I've just >>>> released a patch series that has been in the works for quite some time. I >>>> would like to get this merged and v1.0.20 released ASAP, then have a much >>>> quicker development cycle for v1.0.21 that will include usbdk. I'm >>>> reviewing >>>> this latest usbdk patch series now. >>>> >>>> Regards, >>>> Chris >>>> >>>> >>>> >>>> -- >>>> Xiaofan |
From: Dmitry F. <dm...@da...> - 2015-12-06 15:11:47
|
Hello libusb-devel, Following is the next version of UsbDk backend patches. The same patches are also available at https://github.com/dmitryfleytman/libusb/tree/usbdk-backend-v5 Thanks, Dmitry ===================================================================================== Changes since v4: 1. Rebased to the latest master 2. Patch set reorganised, some functions renamed as suggested by Chris Changes since v3: 1. Added processing of USBD errors supplied by UsbDk Changes since v2: 1. UsbDk clear_halt callback implementation fixed Changes since v1: 1. Project files for Visual Studio 2013 added 2. DDK/WDK build files updated to support builds with UsbDk backend 3. File names changed as agreed (windows_usb.* -> windows_winusb.*) 4. Function names in windows_nt_common.c changed as areed ("nt" dropped) 5. UsbDk headers merged as agreed, no subfolder, one file only (windows_usbdk.h) 6. Build tested and fixed for different MinGW versions Adding dynamic backend selection for UsbDk/libusb*/WinUsb configuration turned out to be too tricky for a number of reasons, so we would like to postpone this feature for now and return to it later along with support for attach/detach mode. We will also release a new usbDk version in a few days with support for persistent hide rules feature as suggested on this list before. ===================================================================================== This series contains patches that extend Windows backend to support UsbDk. Switch between UsbDk and WinUSB/LibusbK/Libusb0 is done at compile time with --enable-usbdk configuration option (off by default). UsbDk (USB Development Kit) is a set of software components meant to provide Windows user mode applications with direct and exclusive access to USB devices. Some distinctive UsbDk properties are: 1. UsbDk supports all types of devices and interfaces - bulk, isochronous, composite, HID etc. 2. Device capture process is totally dynamic, i.e. no inf files and self-signing needed, any device can be captured. 3. UsbDk co-exists with original device driver, when the device is not captured original driver is loaded by the system automatically. 4. If user mode client terminates unexpectedly for any reason system reverts to original device driver immediately. 5. Being USB filter driver UsbDk doesn't require WHQL-ing as per Microsoft requirements. UsbDk supports all Windows OS versions staring from Windows XP, i.e. XP/Vista/7/8/8.1/2003/2008/2008R2/2012/2012R2. Both 32 and 64 bit architectures are supported. UsbDk is fully open source and distributed under Apache 2.0 license. UsbDk project is hosted at spice-space.org, source code repository available at: http://cgit.freedesktop.org/spice/win32/usbdk Latest source tarball is at: http://www.spice-space.org/download/windows/usbdk/spice-usbdk-win-1.0-2-sources.zip UsbDk releases come with precompiled and signed by Red Hat binaries: 1. 32 bit: http://www.spice-space.org/download/windows/usbdk/UsbDk_1.0.8_x86.msi 2. 64 bit: http://www.spice-space.org/download/windows/usbdk/UsbDk_1.0.8_x64.msi UsbDk documentation: 1. Short presentation: http://www.spice-space.org/docs/usbdk/UsbDk_at_a_Glance.pdf 2. SDM: http://www.spice-space.org/docs/usbdk/UsbDk_Software_Development_Manual.pdf 3. UsbDk architecture specificatin (part of source tree): http://cgit.freedesktop.org/spice/win32/usbdk/tree/ARCHITECTURE UsbDk is maintained by Dmitry Fleytman (dm...@da...). I'll be glad to answer your questions sent to me directly or via this mailing list. What do you think about this series? We will be glad to have it accepted into libusb upstream. Best Regards, Dmitry Dmitry Fleytman (4): windows: Move common definitions to a separate file windows: Rename windows_usb.h/c windows_winusb.h/c usbdk: Introduce usbdk backend build: Integrate usbdk backend configure.ac | 9 + libusb/Makefile.am | 16 +- libusb/core.c | 6 + libusb/libusbi.h | 1 + libusb/os/windows_nt_common.c | 581 ++++ libusb/os/windows_nt_common.h | 73 + libusb/os/windows_usb.c | 4645 ------------------------------- libusb/os/windows_usb.h | 973 ------- libusb/os/windows_usbdk.c | 958 +++++++ libusb/os/windows_usbdk.h | 126 + libusb/os/windows_winusb.c | 4149 +++++++++++++++++++++++++++ libusb/os/windows_winusb.h | 947 +++++++ msvc/ddk_build.cmd | 9 + msvc/libusb_2013.sln | 20 + msvc/libusb_dll.dsp | 4 +- msvc/libusb_dll_2005.vcproj | 4 +- msvc/libusb_dll_2010.vcxproj | 4 +- msvc/libusb_dll_2010.vcxproj.filters | 4 +- msvc/libusb_dll_2012.vcxproj | 4 +- msvc/libusb_dll_2012.vcxproj.filters | 4 +- msvc/libusb_dll_2013.vcxproj | 6 +- msvc/libusb_sources | 10 +- msvc/libusb_static.dsp | 4 +- msvc/libusb_static_2005.vcproj | 4 +- msvc/libusb_static_2010.vcxproj | 4 +- msvc/libusb_static_2010.vcxproj.filters | 4 +- msvc/libusb_static_2012.vcxproj | 4 +- msvc/libusb_static_2012.vcxproj.filters | 4 +- msvc/libusb_static_2013.vcxproj | 6 +- msvc/libusb_usbdk_dll_2013.vcxproj | 178 ++ msvc/libusb_usbdk_static_2013.vcxproj | 162 ++ 31 files changed, 7271 insertions(+), 5652 deletions(-) create mode 100644 libusb/os/windows_nt_common.c create mode 100644 libusb/os/windows_nt_common.h delete mode 100644 libusb/os/windows_usb.c delete mode 100644 libusb/os/windows_usb.h create mode 100644 libusb/os/windows_usbdk.c create mode 100644 libusb/os/windows_usbdk.h create mode 100644 libusb/os/windows_winusb.c create mode 100644 libusb/os/windows_winusb.h create mode 100644 msvc/libusb_usbdk_dll_2013.vcxproj create mode 100644 msvc/libusb_usbdk_static_2013.vcxproj -- 2.4.3 |
From: Dmitry F. <dm...@da...> - 2015-12-06 15:11:51
|
From: Dmitry Fleytman <dfl...@re...> New file windows_nt_common.c introduced. Signed-off-by: Dmitry Fleytman <dfl...@re...> --- libusb/Makefile.am | 6 +- libusb/os/windows_nt_common.c | 581 ++++++++++++++++++++++++++++++++++++++++ libusb/os/windows_nt_common.h | 73 +++++ libusb/os/windows_usb.c | 546 ++----------------------------------- libusb/os/windows_usb.h | 28 +- msvc/libusb_dll_2013.vcxproj | 2 + msvc/libusb_sources | 1 + msvc/libusb_static_2013.vcxproj | 2 + 8 files changed, 687 insertions(+), 552 deletions(-) create mode 100644 libusb/os/windows_nt_common.c create mode 100644 libusb/os/windows_nt_common.h diff --git a/libusb/Makefile.am b/libusb/Makefile.am index 0cab0a0..4b7a9dc 100644 --- a/libusb/Makefile.am +++ b/libusb/Makefile.am @@ -9,7 +9,8 @@ LINUX_USBFS_SRC = os/linux_usbfs.c DARWIN_USB_SRC = os/darwin_usb.c OPENBSD_USB_SRC = os/openbsd_usb.c NETBSD_USB_SRC = os/netbsd_usb.c -WINDOWS_USB_SRC = os/poll_windows.c os/windows_usb.c libusb-1.0.rc libusb-1.0.def +COMMON_WINDOWS_SRC = os/poll_windows.c os/windows_nt_common.c libusb-1.0.rc libusb-1.0.def +WINDOWS_USB_SRC = os/windows_usb.c $(COMMON_WINDOWS_SRC) WINCE_USB_SRC = os/wince_usb.c os/wince_usb.h DIST_SUBDIRS = @@ -79,7 +80,8 @@ libusb_1_0_la_CFLAGS = $(AM_CFLAGS) libusb_1_0_la_LDFLAGS = $(LTLDFLAGS) libusb_1_0_la_SOURCES = libusbi.h core.c descriptor.c io.c strerror.c sync.c \ os/linux_usbfs.h os/darwin_usb.h os/windows_usb.h os/windows_common.h \ - hotplug.h hotplug.c $(THREADS_SRC) $(OS_SRC) \ + os/windows_nt_common.h hotplug.h hotplug.c \ + $(THREADS_SRC) $(OS_SRC) \ os/poll_posix.h os/poll_windows.h if OS_HAIKU diff --git a/libusb/os/windows_nt_common.c b/libusb/os/windows_nt_common.c new file mode 100644 index 0000000..8e82037 --- /dev/null +++ b/libusb/os/windows_nt_common.c @@ -0,0 +1,581 @@ +/* + * windows backend for libusb 1.0 + * Copyright © 2009-2012 Pete Batard <pe...@ak...> + * With contributions from Michael Plante, Orin Eman et al. + * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer + * HID Reports IOCTLs inspired from HIDAPI by Alan Ott, Signal 11 Software + * Hash table functions adapted from glibc, by Ulrich Drepper et al. + * Major code testing contribution by Xiaofan Chen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <config.h> +#include <stdio.h> +#include <inttypes.h> +#include <process.h> + + +#include "libusbi.h" +#include "windows_common.h" +#include "windows_nt_common.h" + +// Global variables +const uint64_t epoch_time = UINT64_C(116444736000000000); // 1970.01.01 00:00:000 in MS Filetime + +// Global variables for clock_gettime mechanism +uint64_t hires_ticks_to_ps; +uint64_t hires_frequency; +// Timer thread +HANDLE timer_thread = NULL; +DWORD timer_thread_id = 0; + +/* User32 dependencies */ +DLL_DECLARE_PREFIXED(WINAPI, BOOL, p, GetMessageA, (LPMSG, HWND, UINT, UINT)); +DLL_DECLARE_PREFIXED(WINAPI, BOOL, p, PeekMessageA, (LPMSG, HWND, UINT, UINT, UINT)); +DLL_DECLARE_PREFIXED(WINAPI, BOOL, p, PostThreadMessageA, (DWORD, UINT, WPARAM, LPARAM)); + +static unsigned __stdcall win_clock_gettime_threaded(void* param); + +/* +* Converts a windows error to human readable string +* uses retval as errorcode, or, if 0, use GetLastError() +*/ +#if defined(ENABLE_LOGGING) +char *windows_error_str(uint32_t retval) +{ + static char err_string[ERR_BUFFER_SIZE]; + + DWORD size; + ssize_t i; + uint32_t error_code, format_error; + + error_code = retval ? retval : GetLastError(); + + safe_sprintf(err_string, ERR_BUFFER_SIZE, "[%u] ", error_code); + + // Translate codes returned by SetupAPI. The ones we are dealing with are either + // in 0x0000xxxx or 0xE000xxxx and can be distinguished from standard error codes. + // See http://msdn.microsoft.com/en-us/library/windows/hardware/ff545011.aspx + switch (error_code & 0xE0000000) { + case 0: + error_code = HRESULT_FROM_WIN32(error_code); // Still leaves ERROR_SUCCESS unmodified + break; + case 0xE0000000: + error_code = 0x80000000 | (FACILITY_SETUPAPI << 16) | (error_code & 0x0000FFFF); + break; + default: + break; + } + + size = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, error_code, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), &err_string[safe_strlen(err_string)], + ERR_BUFFER_SIZE - (DWORD)safe_strlen(err_string), NULL); + if (size == 0) { + format_error = GetLastError(); + if (format_error) + safe_sprintf(err_string, ERR_BUFFER_SIZE, + "Windows error code %u (FormatMessage error code %u)", error_code, format_error); + else + safe_sprintf(err_string, ERR_BUFFER_SIZE, "Unknown error code %u", error_code); + } + else { + // Remove CR/LF terminators + for (i = safe_strlen(err_string) - 1; (i >= 0) && ((err_string[i] == 0x0A) || (err_string[i] == 0x0D)); i--) { + err_string[i] = 0; + } + } + return err_string; +} +#endif + +/* Hash table functions - modified From glibc 2.3.2: + [Aho,Sethi,Ullman] Compilers: Principles, Techniques and Tools, 1986 + [Knuth] The Art of Computer Programming, part 3 (6.4) */ +typedef struct htab_entry { + unsigned long used; + char* str; +} htab_entry; +htab_entry* htab_table = NULL; +usbi_mutex_t htab_write_mutex = NULL; +unsigned long htab_size, htab_filled; + +/* For the used double hash method the table size has to be a prime. To + correct the user given table size we need a prime test. This trivial + algorithm is adequate because the code is called only during init and + the number is likely to be small */ +static int isprime(unsigned long number) +{ + // no even number will be passed + unsigned int divider = 3; + + while((divider * divider < number) && (number % divider != 0)) + divider += 2; + + return (number % divider != 0); +} + +/* Before using the hash table we must allocate memory for it. + We allocate one element more as the found prime number says. + This is done for more effective indexing as explained in the + comment for the hash function. */ +int htab_create(struct libusb_context *ctx, unsigned long nel) +{ + if (htab_table != NULL) { + usbi_err(ctx, "hash table already allocated"); + } + + // Create a mutex + usbi_mutex_init(&htab_write_mutex, NULL); + + // Change nel to the first prime number not smaller as nel. + nel |= 1; + while(!isprime(nel)) + nel += 2; + + htab_size = nel; + usbi_dbg("using %d entries hash table", nel); + htab_filled = 0; + + // allocate memory and zero out. + htab_table = (htab_entry*) calloc(htab_size + 1, sizeof(htab_entry)); + if (htab_table == NULL) { + usbi_err(ctx, "could not allocate space for hash table"); + return 0; + } + + return 1; +} + +/* After using the hash table it has to be destroyed. */ +void htab_destroy(void) +{ + size_t i; + if (htab_table == NULL) { + return; + } + + for (i=0; i<htab_size; i++) { + if (htab_table[i].used) { + safe_free(htab_table[i].str); + } + } + usbi_mutex_destroy(&htab_write_mutex); + safe_free(htab_table); +} + +/* This is the search function. It uses double hashing with open addressing. + We use an trick to speed up the lookup. The table is created with one + more element available. This enables us to use the index zero special. + This index will never be used because we store the first hash index in + the field used where zero means not used. Every other value means used. + The used field can be used as a first fast comparison for equality of + the stored and the parameter value. This helps to prevent unnecessary + expensive calls of strcmp. */ +unsigned long htab_hash(char* str) +{ + unsigned long hval, hval2; + unsigned long idx; + unsigned long r = 5381; + int c; + char* sz = str; + + if (str == NULL) + return 0; + + // Compute main hash value (algorithm suggested by Nokia) + while ((c = *sz++) != 0) + r = ((r << 5) + r) + c; + if (r == 0) + ++r; + + // compute table hash: simply take the modulus + hval = r % htab_size; + if (hval == 0) + ++hval; + + // Try the first index + idx = hval; + + if (htab_table[idx].used) { + if ( (htab_table[idx].used == hval) + && (safe_strcmp(str, htab_table[idx].str) == 0) ) { + // existing hash + return idx; + } + usbi_dbg("hash collision ('%s' vs '%s')", str, htab_table[idx].str); + + // Second hash function, as suggested in [Knuth] + hval2 = 1 + hval % (htab_size - 2); + + do { + // Because size is prime this guarantees to step through all available indexes + if (idx <= hval2) { + idx = htab_size + idx - hval2; + } else { + idx -= hval2; + } + + // If we visited all entries leave the loop unsuccessfully + if (idx == hval) { + break; + } + + // If entry is found use it. + if ( (htab_table[idx].used == hval) + && (safe_strcmp(str, htab_table[idx].str) == 0) ) { + return idx; + } + } + while (htab_table[idx].used); + } + + // Not found => New entry + + // If the table is full return an error + if (htab_filled >= htab_size) { + usbi_err(NULL, "hash table is full (%d entries)", htab_size); + return 0; + } + + // Concurrent threads might be storing the same entry at the same time + // (eg. "simultaneous" enums from different threads) => use a mutex + usbi_mutex_lock(&htab_write_mutex); + // Just free any previously allocated string (which should be the same as + // new one). The possibility of concurrent threads storing a collision + // string (same hash, different string) at the same time is extremely low + safe_free(htab_table[idx].str); + htab_table[idx].used = hval; + htab_table[idx].str = (char*) malloc(safe_strlen(str)+1); + if (htab_table[idx].str == NULL) { + usbi_err(NULL, "could not duplicate string for hash table"); + usbi_mutex_unlock(&htab_write_mutex); + return 0; + } + memcpy(htab_table[idx].str, str, safe_strlen(str)+1); + ++htab_filled; + usbi_mutex_unlock(&htab_write_mutex); + + return idx; +} + +static int win_init_dlls(void) +{ + DLL_LOAD_PREFIXED(User32.dll, p, GetMessageA, TRUE); + DLL_LOAD_PREFIXED(User32.dll, p, PeekMessageA, TRUE); + DLL_LOAD_PREFIXED(User32.dll, p, PostThreadMessageA, TRUE); + return LIBUSB_SUCCESS; +} + +bool win_init_clock(struct libusb_context *ctx) +{ + DWORD_PTR affinity, dummy; + HANDLE event = NULL; + LARGE_INTEGER li_frequency; + int i; + + if (QueryPerformanceFrequency(&li_frequency)) { + // Load DLL imports + if (win_init_dlls() != LIBUSB_SUCCESS) { + usbi_err(ctx, "could not resolve DLL functions"); + return false; + } + + // The hires frequency can go as high as 4 GHz, so we'll use a conversion + // to picoseconds to compute the tv_nsecs part in clock_gettime + hires_frequency = li_frequency.QuadPart; + hires_ticks_to_ps = UINT64_C(1000000000000) / hires_frequency; + usbi_dbg("hires timer available (Frequency: %"PRIu64" Hz)", hires_frequency); + + // Because QueryPerformanceCounter might report different values when + // running on different cores, we create a separate thread for the timer + // calls, which we glue to the first available core always to prevent timing discrepancies. + if (!GetProcessAffinityMask(GetCurrentProcess(), &affinity, &dummy) || (affinity == 0)) { + usbi_err(ctx, "could not get process affinity: %s", windows_error_str(0)); + return false; + } + // The process affinity mask is a bitmask where each set bit represents a core on + // which this process is allowed to run, so we find the first set bit + for (i = 0; !(affinity & (DWORD_PTR)(1 << i)); i++); + affinity = (DWORD_PTR)(1 << i); + + usbi_dbg("timer thread will run on core #%d", i); + + event = CreateEvent(NULL, FALSE, FALSE, NULL); + if (event == NULL) { + usbi_err(ctx, "could not create event: %s", windows_error_str(0)); + return false; + } + timer_thread = (HANDLE)_beginthreadex(NULL, 0, win_clock_gettime_threaded, (void *)event, + 0, (unsigned int *)&timer_thread_id); + if (timer_thread == NULL) { + usbi_err(ctx, "unable to create timer thread - aborting"); + CloseHandle(event); + return false; + } + if (!SetThreadAffinityMask(timer_thread, affinity)) { + usbi_warn(ctx, "unable to set timer thread affinity, timer discrepancies may arise"); + } + + // Wait for timer thread to init before continuing. + if (WaitForSingleObject(event, INFINITE) != WAIT_OBJECT_0) { + usbi_err(ctx, "failed to wait for timer thread to become ready - aborting"); + CloseHandle(event); + return false; + } + + CloseHandle(event); + } else { + usbi_dbg("no hires timer available on this platform"); + hires_frequency = 0; + hires_ticks_to_ps = UINT64_C(0); + } + + return true; +} + +void win_destroy_clock() +{ + if (timer_thread) { + // actually the signal to quit the thread. + if (!pPostThreadMessageA(timer_thread_id, WM_TIMER_EXIT, 0, 0) || + (WaitForSingleObject(timer_thread, INFINITE) != WAIT_OBJECT_0)) { + usbi_dbg("could not wait for timer thread to quit"); + TerminateThread(timer_thread, 1); + // shouldn't happen, but we're destroying + // all objects it might have held anyway. + } + CloseHandle(timer_thread); + timer_thread = NULL; + timer_thread_id = 0; + } +} + +/* +* Monotonic and real time functions +*/ +static unsigned __stdcall win_clock_gettime_threaded(void* param) +{ + struct timer_request *request; + LARGE_INTEGER hires_counter; + MSG msg; + + // The following call will create this thread's message queue + // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms644946.aspx + pPeekMessageA(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE); + + // Signal windows_init() that we're ready to service requests + if (!SetEvent((HANDLE)param)) { + usbi_dbg("SetEvent failed for timer init event: %s", windows_error_str(0)); + } + param = NULL; + + // Main loop - wait for requests + while (1) { + + if (pGetMessageA(&msg, NULL, WM_TIMER_REQUEST, WM_TIMER_EXIT) == -1) { + usbi_err(NULL, "GetMessage failed for timer thread: %s", windows_error_str(0)); + return 1; + } + + switch (msg.message) { + case WM_TIMER_REQUEST: + // Requests to this thread are for hires always + // Microsoft says that this function always succeeds on XP and later + // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms644904.aspx + request = (struct timer_request *)msg.lParam; + QueryPerformanceCounter(&hires_counter); + request->tp->tv_sec = (long)(hires_counter.QuadPart / hires_frequency); + request->tp->tv_nsec = (long)(((hires_counter.QuadPart % hires_frequency) / 1000) * hires_ticks_to_ps); + if (!SetEvent(request->event)) { + usbi_err(NULL, "SetEvent failed for timer request: %s", windows_error_str(0)); + } + break; + + case WM_TIMER_EXIT: + usbi_dbg("timer thread quitting"); + return 0; + } + + } +} + +int win_clock_gettime(int clk_id, struct timespec *tp) +{ + struct timer_request request; + FILETIME filetime; + ULARGE_INTEGER rtime; + DWORD r; + switch (clk_id) { + case USBI_CLOCK_MONOTONIC: + if (timer_thread) { + request.tp = tp; + request.event = CreateEvent(NULL, FALSE, FALSE, NULL); + if (request.event == NULL) { + return LIBUSB_ERROR_NO_MEM; + } + + if (!pPostThreadMessageA(timer_thread_id, WM_TIMER_REQUEST, 0, (LPARAM)&request)) { + usbi_err(NULL, "PostThreadMessage failed for timer thread: %s", windows_error_str(0)); + CloseHandle(request.event); + return LIBUSB_ERROR_OTHER; + } + + do { + r = WaitForSingleObject(request.event, TIMER_REQUEST_RETRY_MS); + if (r == WAIT_TIMEOUT) { + usbi_dbg("could not obtain a timer value within reasonable timeframe - too much load?"); + } + else if (r == WAIT_FAILED) { + usbi_err(NULL, "WaitForSingleObject failed: %s", windows_error_str(0)); + } + } while (r == WAIT_TIMEOUT); + CloseHandle(request.event); + + if (r == WAIT_OBJECT_0) { + return LIBUSB_SUCCESS; + } else { + return LIBUSB_ERROR_OTHER; + } + } + // Fall through and return real-time if monotonic was not detected @ timer init + case USBI_CLOCK_REALTIME: + // We follow http://msdn.microsoft.com/en-us/library/ms724928%28VS.85%29.aspx + // with a predef epoch_time to have an epoch that starts at 1970.01.01 00:00 + // Note however that our resolution is bounded by the Windows system time + // functions and is at best of the order of 1 ms (or, usually, worse) + GetSystemTimeAsFileTime(&filetime); + rtime.LowPart = filetime.dwLowDateTime; + rtime.HighPart = filetime.dwHighDateTime; + rtime.QuadPart -= epoch_time; + tp->tv_sec = (long)(rtime.QuadPart / 10000000); + tp->tv_nsec = (long)((rtime.QuadPart % 10000000) * 100); + return LIBUSB_SUCCESS; + default: + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +static void win_transfer_callback(struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size) +{ + int status, istatus; + + usbi_dbg("handling I/O completion with errcode %d, size %d", io_result, io_size); + + switch (io_result) { + case NO_ERROR: + status = windows_copy_transfer_data(itransfer, io_size); + break; + case ERROR_GEN_FAILURE: + usbi_dbg("detected endpoint stall"); + status = LIBUSB_TRANSFER_STALL; + break; + case ERROR_SEM_TIMEOUT: + usbi_dbg("detected semaphore timeout"); + status = LIBUSB_TRANSFER_TIMED_OUT; + break; + case ERROR_OPERATION_ABORTED: + istatus = windows_copy_transfer_data(itransfer, io_size); + if (istatus != LIBUSB_TRANSFER_COMPLETED) { + usbi_dbg("Failed to copy partial data in aborted operation: %d", istatus); + } + if (itransfer->flags & USBI_TRANSFER_TIMED_OUT) { + usbi_dbg("detected timeout"); + status = LIBUSB_TRANSFER_TIMED_OUT; + } + else { + usbi_dbg("detected operation aborted"); + status = LIBUSB_TRANSFER_CANCELLED; + } + break; + default: + usbi_err(ITRANSFER_CTX(itransfer), "detected I/O error %d: %s", io_result, windows_error_str(io_result)); + status = LIBUSB_TRANSFER_ERROR; + break; + } + windows_clear_transfer_priv(itransfer); // Cancel polling + usbi_handle_transfer_completion(itransfer, (enum libusb_transfer_status)status); +} + +void win_handle_callback(struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + win_transfer_callback(itransfer, io_result, io_size); + break; + case LIBUSB_TRANSFER_TYPE_BULK_STREAM: + usbi_warn(ITRANSFER_CTX(itransfer), "bulk stream transfers are not yet supported on this platform"); + break; + default: + usbi_err(ITRANSFER_CTX(itransfer), "unknown endpoint type %d", transfer->type); + } +} + +int win_handle_events(struct libusb_context *ctx, struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready) +{ + POLL_NFDS_TYPE i = 0; + bool found = false; + struct usbi_transfer *transfer; + struct winfd *pollable_fd = NULL; + DWORD io_size, io_result; + + usbi_mutex_lock(&ctx->open_devs_lock); + for (i = 0; i < nfds && num_ready > 0; i++) { + + usbi_dbg("checking fd %d with revents = %04x", fds[i].fd, fds[i].revents); + + if (!fds[i].revents) { + continue; + } + + num_ready--; + + // Because a Windows OVERLAPPED is used for poll emulation, + // a pollable fd is created and stored with each transfer + usbi_mutex_lock(&ctx->flying_transfers_lock); + found = false; + list_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) { + pollable_fd = windows_get_fd(transfer); + if (pollable_fd->fd == fds[i].fd) { + found = true; + break; + } + } + usbi_mutex_unlock(&ctx->flying_transfers_lock); + + if (found) { + windows_get_overlapped_result(transfer, pollable_fd, &io_result, &io_size); + + usbi_remove_pollfd(ctx, pollable_fd->fd); + // let handle_callback free the event using the transfer wfd + // If you don't use the transfer wfd, you run a risk of trying to free a + // newly allocated wfd that took the place of the one from the transfer. + win_handle_callback(transfer, io_result, io_size); + } + else { + usbi_mutex_unlock(&ctx->open_devs_lock); + usbi_err(ctx, "could not find a matching transfer for fd %x", fds[i]); + return LIBUSB_ERROR_NOT_FOUND; + } + } + + usbi_mutex_unlock(&ctx->open_devs_lock); + return LIBUSB_SUCCESS; +} diff --git a/libusb/os/windows_nt_common.h b/libusb/os/windows_nt_common.h new file mode 100644 index 0000000..163dc9f --- /dev/null +++ b/libusb/os/windows_nt_common.h @@ -0,0 +1,73 @@ +/* + * Windows backend common header for libusb 1.0 + * + * This file brings together header code common between + * the desktop Windows backends. + * Copyright © 2012-2013 RealVNC Ltd. + * Copyright © 2009-2012 Pete Batard <pe...@ak...> + * With contributions from Michael Plante, Orin Eman et al. + * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer + * Major code testing contribution by Xiaofan Chen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#pragma once + +typedef struct USB_CONFIGURATION_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + USHORT wTotalLength; + UCHAR bNumInterfaces; + UCHAR bConfigurationValue; + UCHAR iConfiguration; + UCHAR bmAttributes; + UCHAR MaxPower; +} USB_CONFIGURATION_DESCRIPTOR, *PUSB_CONFIGURATION_DESCRIPTOR; + +typedef struct libusb_device_descriptor USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR; + +#define HTAB_SIZE 1021 + +int htab_create(struct libusb_context *ctx, unsigned long nel); +void htab_destroy(void); +unsigned long htab_hash(char* str); + +extern const uint64_t epoch_time; + +bool win_init_clock(struct libusb_context *ctx); +void win_destroy_clock(void); +int win_clock_gettime(int clk_id, struct timespec *tp); + +void windows_clear_transfer_priv(struct usbi_transfer *itransfer); +int windows_copy_transfer_data(struct usbi_transfer *itransfer, uint32_t io_size); +struct winfd *windows_get_fd(struct usbi_transfer *transfer); +void windows_get_overlapped_result(struct usbi_transfer *transfer, struct winfd *pollable_fd, DWORD *io_result, DWORD *io_size); + +void win_handle_callback(struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size); +int win_handle_events(struct libusb_context *ctx, struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready); + +#if defined(ENABLE_LOGGING) +char *windows_error_str(uint32_t retval); +#endif + +#define WM_TIMER_REQUEST (WM_USER + 1) +#define WM_TIMER_EXIT (WM_USER + 2) + +// used for monotonic clock_gettime() +struct timer_request { + struct timespec *tp; + HANDLE event; +}; diff --git a/libusb/os/windows_usb.c b/libusb/os/windows_usb.c index c92792c..f5406dc 100644 --- a/libusb/os/windows_usb.c +++ b/libusb/os/windows_usb.c @@ -45,8 +45,6 @@ // Helper prototypes static int windows_get_active_config_descriptor(struct libusb_device *dev, unsigned char *buffer, size_t len, int *host_endian); -static int windows_clock_gettime(int clk_id, struct timespec *tp); -unsigned __stdcall windows_clock_gettime_threaded(void* param); // Common calls static int common_configure_endpoints(int sub_api, struct libusb_device_handle *dev_handle, int iface); @@ -100,15 +98,11 @@ static int composite_copy_transfer_data(int sub_api, struct usbi_transfer *itran // Global variables uint64_t hires_frequency, hires_ticks_to_ps; -const uint64_t epoch_time = UINT64_C(116444736000000000); // 1970.01.01 00:00:000 in MS Filetime int windows_version = WINDOWS_UNDEFINED; static char windows_version_str[128] = "Windows Undefined"; // Concurrency static int concurrent_usage = -1; usbi_mutex_t autoclaim_lock; -// Timer thread -HANDLE timer_thread = NULL; -DWORD timer_thread_id = 0; // API globals #define CHECK_WINUSBX_AVAILABLE(sub_api) do { if (sub_api == SUB_API_NOTSET) sub_api = priv->sub_api; \ if (!WinUSBX[sub_api].initialized) return LIBUSB_ERROR_ACCESS; } while(0) @@ -139,57 +133,6 @@ static char* guid_to_string(const GUID* guid) #endif /* - * Converts a windows error to human readable string - * uses retval as errorcode, or, if 0, use GetLastError() - */ -#if defined(ENABLE_LOGGING) -static char *windows_error_str(uint32_t retval) -{ -static char err_string[ERR_BUFFER_SIZE]; - - DWORD size; - ssize_t i; - uint32_t error_code, format_error; - - error_code = retval?retval:GetLastError(); - - safe_sprintf(err_string, ERR_BUFFER_SIZE, "[%u] ", error_code); - - // Translate codes returned by SetupAPI. The ones we are dealing with are either - // in 0x0000xxxx or 0xE000xxxx and can be distinguished from standard error codes. - // See http://msdn.microsoft.com/en-us/library/windows/hardware/ff545011.aspx - switch (error_code & 0xE0000000) { - case 0: - error_code = HRESULT_FROM_WIN32(error_code); // Still leaves ERROR_SUCCESS unmodified - break; - case 0xE0000000: - error_code = 0x80000000 | (FACILITY_SETUPAPI << 16) | (error_code & 0x0000FFFF); - break; - default: - break; - } - - size = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, error_code, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), &err_string[safe_strlen(err_string)], - ERR_BUFFER_SIZE - (DWORD)safe_strlen(err_string), NULL); - if (size == 0) { - format_error = GetLastError(); - if (format_error) - safe_sprintf(err_string, ERR_BUFFER_SIZE, - "Windows error code %u (FormatMessage error code %u)", error_code, format_error); - else - safe_sprintf(err_string, ERR_BUFFER_SIZE, "Unknown error code %u", error_code); - } else { - // Remove CR/LF terminators - for (i=safe_strlen(err_string)-1; (i>=0) && ((err_string[i]==0x0A) || (err_string[i]==0x0D)); i--) { - err_string[i] = 0; - } - } - return err_string; -} -#endif - -/* * Sanitize Microsoft's paths: convert to uppercase, add prefix and fix backslashes. * Return an allocated sanitized string or NULL on error. */ @@ -253,9 +196,6 @@ static int init_dlls(void) DLL_LOAD_PREFIXED(SetupAPI.dll, p, SetupDiOpenDeviceInterfaceRegKey, TRUE); DLL_LOAD_PREFIXED(AdvAPI32.dll, p, RegQueryValueExW, TRUE); DLL_LOAD_PREFIXED(AdvAPI32.dll, p, RegCloseKey, TRUE); - DLL_LOAD_PREFIXED(User32.dll, p, GetMessageA, TRUE); - DLL_LOAD_PREFIXED(User32.dll, p, PeekMessageA, TRUE); - DLL_LOAD_PREFIXED(User32.dll, p, PostThreadMessageA, TRUE); return LIBUSB_SUCCESS; } @@ -458,176 +398,6 @@ err_exit: *dev_info = INVALID_HANDLE_VALUE; return NULL;} -/* Hash table functions - modified From glibc 2.3.2: - [Aho,Sethi,Ullman] Compilers: Principles, Techniques and Tools, 1986 - [Knuth] The Art of Computer Programming, part 3 (6.4) */ -typedef struct htab_entry { - unsigned long used; - char* str; -} htab_entry; -htab_entry* htab_table = NULL; -usbi_mutex_t htab_write_mutex = NULL; -unsigned long htab_size, htab_filled; - -/* For the used double hash method the table size has to be a prime. To - correct the user given table size we need a prime test. This trivial - algorithm is adequate because the code is called only during init and - the number is likely to be small */ -static int isprime(unsigned long number) -{ - // no even number will be passed - unsigned int divider = 3; - - while((divider * divider < number) && (number % divider != 0)) - divider += 2; - - return (number % divider != 0); -} - -/* Before using the hash table we must allocate memory for it. - We allocate one element more as the found prime number says. - This is done for more effective indexing as explained in the - comment for the hash function. */ -static int htab_create(struct libusb_context *ctx, unsigned long nel) -{ - if (htab_table != NULL) { - usbi_err(ctx, "hash table already allocated"); - } - - // Create a mutex - usbi_mutex_init(&htab_write_mutex, NULL); - - // Change nel to the first prime number not smaller as nel. - nel |= 1; - while(!isprime(nel)) - nel += 2; - - htab_size = nel; - usbi_dbg("using %d entries hash table", nel); - htab_filled = 0; - - // allocate memory and zero out. - htab_table = (htab_entry*) calloc(htab_size + 1, sizeof(htab_entry)); - if (htab_table == NULL) { - usbi_err(ctx, "could not allocate space for hash table"); - return 0; - } - - return 1; -} - -/* After using the hash table it has to be destroyed. */ -static void htab_destroy(void) -{ - size_t i; - if (htab_table == NULL) { - return; - } - - for (i=0; i<htab_size; i++) { - if (htab_table[i].used) { - safe_free(htab_table[i].str); - } - } - usbi_mutex_destroy(&htab_write_mutex); - safe_free(htab_table); -} - -/* This is the search function. It uses double hashing with open addressing. - We use an trick to speed up the lookup. The table is created with one - more element available. This enables us to use the index zero special. - This index will never be used because we store the first hash index in - the field used where zero means not used. Every other value means used. - The used field can be used as a first fast comparison for equality of - the stored and the parameter value. This helps to prevent unnecessary - expensive calls of strcmp. */ -static unsigned long htab_hash(char* str) -{ - unsigned long hval, hval2; - unsigned long idx; - unsigned long r = 5381; - int c; - char* sz = str; - - if (str == NULL) - return 0; - - // Compute main hash value (algorithm suggested by Nokia) - while ((c = *sz++) != 0) - r = ((r << 5) + r) + c; - if (r == 0) - ++r; - - // compute table hash: simply take the modulus - hval = r % htab_size; - if (hval == 0) - ++hval; - - // Try the first index - idx = hval; - - if (htab_table[idx].used) { - if ( (htab_table[idx].used == hval) - && (safe_strcmp(str, htab_table[idx].str) == 0) ) { - // existing hash - return idx; - } - usbi_dbg("hash collision ('%s' vs '%s')", str, htab_table[idx].str); - - // Second hash function, as suggested in [Knuth] - hval2 = 1 + hval % (htab_size - 2); - - do { - // Because size is prime this guarantees to step through all available indexes - if (idx <= hval2) { - idx = htab_size + idx - hval2; - } else { - idx -= hval2; - } - - // If we visited all entries leave the loop unsuccessfully - if (idx == hval) { - break; - } - - // If entry is found use it. - if ( (htab_table[idx].used == hval) - && (safe_strcmp(str, htab_table[idx].str) == 0) ) { - return idx; - } - } - while (htab_table[idx].used); - } - - // Not found => New entry - - // If the table is full return an error - if (htab_filled >= htab_size) { - usbi_err(NULL, "hash table is full (%d entries)", htab_size); - return 0; - } - - // Concurrent threads might be storing the same entry at the same time - // (eg. "simultaneous" enums from different threads) => use a mutex - usbi_mutex_lock(&htab_write_mutex); - // Just free any previously allocated string (which should be the same as - // new one). The possibility of concurrent threads storing a collision - // string (same hash, different string) at the same time is extremely low - safe_free(htab_table[idx].str); - htab_table[idx].used = hval; - htab_table[idx].str = (char*) malloc(safe_strlen(str)+1); - if (htab_table[idx].str == NULL) { - usbi_err(NULL, "could not duplicate string for hash table"); - usbi_mutex_unlock(&htab_write_mutex); - return 0; - } - memcpy(htab_table[idx].str, str, safe_strlen(str)+1); - ++htab_filled; - usbi_mutex_unlock(&htab_write_mutex); - - return idx; -} - /* * Returns the session ID of a device's nth level ancestor * If there's no device at the nth level, return 0 @@ -954,10 +724,7 @@ static void get_windows_version(void) static int windows_init(struct libusb_context *ctx) { int i, r = LIBUSB_ERROR_OTHER; - DWORD_PTR affinity, dummy; - HANDLE event = NULL; HANDLE semaphore; - LARGE_INTEGER li_frequency; char sem_name[11+1+8]; // strlen(libusb_init)+'\0'+(32-bit hex PID) sprintf(sem_name, "libusb_init%08X", (unsigned int)GetCurrentProcessId()&0xFFFFFFFF); @@ -1003,53 +770,9 @@ static int windows_init(struct libusb_context *ctx) usb_api_backend[i].init(SUB_API_NOTSET, ctx); } - if (QueryPerformanceFrequency(&li_frequency)) { - // The hires frequency can go as high as 4 GHz, so we'll use a conversion - // to picoseconds to compute the tv_nsecs part in clock_gettime - hires_frequency = li_frequency.QuadPart; - hires_ticks_to_ps = UINT64_C(1000000000000) / hires_frequency; - usbi_dbg("hires timer available (Frequency: %"PRIu64" Hz)", hires_frequency); - - // Because QueryPerformanceCounter might report different values when - // running on different cores, we create a separate thread for the timer - // calls, which we glue to the first available core always to prevent timing discrepancies. - if (!GetProcessAffinityMask(GetCurrentProcess(), &affinity, &dummy) || (affinity == 0)) { - usbi_err(ctx, "could not get process affinity: %s", windows_error_str(0)); - goto init_exit; - } - // The process affinity mask is a bitmask where each set bit represents a core on - // which this process is allowed to run, so we find the first set bit - for (i = 0; !(affinity & (DWORD_PTR)(1 << i)); i++); - affinity = (DWORD_PTR)(1 << i); - - usbi_dbg("timer thread will run on core #%d", i); - - r = LIBUSB_ERROR_NO_MEM; - event = CreateEvent(NULL, FALSE, FALSE, NULL); - if (event == NULL) { - usbi_err(ctx, "could not create event: %s", windows_error_str(0)); - goto init_exit; - } - timer_thread = (HANDLE)_beginthreadex(NULL, 0, windows_clock_gettime_threaded, (void *)event, - 0, (unsigned int *)&timer_thread_id); - if (timer_thread == NULL) { - usbi_err(ctx, "unable to create timer thread - aborting"); - goto init_exit; - } - if (!SetThreadAffinityMask(timer_thread, affinity)) { - usbi_warn(ctx, "unable to set timer thread affinity, timer discrepancies may arise"); - } - - // Wait for timer thread to init before continuing. - if (WaitForSingleObject(event, INFINITE) != WAIT_OBJECT_0) { - usbi_err(ctx, "failed to wait for timer thread to become ready - aborting"); - goto init_exit; - } - } - else { - usbi_dbg("no hires timer available on this platform"); - hires_frequency = 0; - hires_ticks_to_ps = UINT64_C(0); + r = LIBUSB_ERROR_NO_MEM; + if (!win_init_clock(ctx)){ + goto init_exit; } // Create a hash table to store session ids. Second parameter is better if prime @@ -1060,19 +783,7 @@ static int windows_init(struct libusb_context *ctx) init_exit: // Holds semaphore here. if (!concurrent_usage && r != LIBUSB_SUCCESS) { // First init failed? - if (timer_thread) { - // actually the signal to quit the thread. - if (!pPostThreadMessageA(timer_thread_id, WM_TIMER_EXIT, 0, 0) || - (WaitForSingleObject(timer_thread, INFINITE) != WAIT_OBJECT_0)) { - usbi_warn(ctx, "could not wait for timer thread to quit"); - TerminateThread(timer_thread, 1); - // shouldn't happen, but we're destroying - // all objects it might have held anyway. - } - CloseHandle(timer_thread); - timer_thread = NULL; - timer_thread_id = 0; - } + win_destroy_clock(); htab_destroy(); usbi_mutex_destroy(&autoclaim_lock); } @@ -1080,8 +791,6 @@ init_exit: // Holds semaphore here. if (r != LIBUSB_SUCCESS) --concurrent_usage; // Not expected to call libusb_exit if we failed. - if (event) - CloseHandle(event); ReleaseSemaphore(semaphore, 1, NULL); // increase count back to 1 CloseHandle(semaphore); return r; @@ -1891,18 +1600,7 @@ static void windows_exit(void) usb_api_backend[i].exit(SUB_API_NOTSET); } exit_polling(); - - if (timer_thread) { - // actually the signal to quit the thread. - if (!pPostThreadMessageA(timer_thread_id, WM_TIMER_EXIT, 0, 0) || - (WaitForSingleObject(timer_thread, INFINITE) != WAIT_OBJECT_0)) { - usbi_dbg("could not wait for timer thread to quit"); - TerminateThread(timer_thread, 1); - } - CloseHandle(timer_thread); - timer_thread = NULL; - timer_thread_id = 0; - } + win_destroy_clock(); htab_destroy(); usbi_mutex_destroy(&autoclaim_lock); } @@ -2088,7 +1786,7 @@ static void windows_destroy_device(struct libusb_device *dev) windows_device_priv_release(dev); } -static void windows_clear_transfer_priv(struct usbi_transfer *itransfer) +void windows_clear_transfer_priv(struct usbi_transfer *itransfer) { struct windows_transfer_priv *transfer_priv = (struct windows_transfer_priv*)usbi_transfer_get_os_priv(itransfer); @@ -2213,232 +1911,34 @@ static int windows_cancel_transfer(struct usbi_transfer *itransfer) } } -static void windows_transfer_callback(struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size) +int windows_copy_transfer_data(struct usbi_transfer *itransfer, uint32_t io_size) { struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - int status, istatus; - - usbi_dbg("handling I/O completion with errcode %d, size %d", io_result, io_size); - - switch(io_result) { - case NO_ERROR: - status = priv->apib->copy_transfer_data(SUB_API_NOTSET, itransfer, io_size); - break; - case ERROR_GEN_FAILURE: - usbi_dbg("detected endpoint stall"); - status = LIBUSB_TRANSFER_STALL; - break; - case ERROR_SEM_TIMEOUT: - usbi_dbg("detected semaphore timeout"); - status = LIBUSB_TRANSFER_TIMED_OUT; - break; - case ERROR_OPERATION_ABORTED: - istatus = priv->apib->copy_transfer_data(SUB_API_NOTSET, itransfer, io_size); - if (istatus != LIBUSB_TRANSFER_COMPLETED) { - usbi_dbg("Failed to copy partial data in aborted operation: %d", istatus); - } - if (itransfer->flags & USBI_TRANSFER_TIMED_OUT) { - usbi_dbg("detected timeout"); - status = LIBUSB_TRANSFER_TIMED_OUT; - } else { - usbi_dbg("detected operation aborted"); - status = LIBUSB_TRANSFER_CANCELLED; - } - break; - default: - usbi_err(ITRANSFER_CTX(itransfer), "detected I/O error %d: %s", io_result, windows_error_str(io_result)); - status = LIBUSB_TRANSFER_ERROR; - break; - } - windows_clear_transfer_priv(itransfer); // Cancel polling - usbi_handle_transfer_completion(itransfer, (enum libusb_transfer_status)status); -} - -static void windows_handle_callback (struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - - switch (transfer->type) { - case LIBUSB_TRANSFER_TYPE_CONTROL: - case LIBUSB_TRANSFER_TYPE_BULK: - case LIBUSB_TRANSFER_TYPE_INTERRUPT: - case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: - windows_transfer_callback (itransfer, io_result, io_size); - break; - case LIBUSB_TRANSFER_TYPE_BULK_STREAM: - usbi_warn(ITRANSFER_CTX(itransfer), "bulk stream transfers are not yet supported on this platform"); - break; - default: - usbi_err(ITRANSFER_CTX(itransfer), "unknown endpoint type %d", transfer->type); - } + return priv->apib->copy_transfer_data(SUB_API_NOTSET, itransfer, io_size); } -static int windows_handle_events(struct libusb_context *ctx, struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready) +struct winfd *windows_get_fd(struct usbi_transfer *transfer) { - struct windows_transfer_priv* transfer_priv = NULL; - POLL_NFDS_TYPE i = 0; - bool found; - struct usbi_transfer *transfer; - DWORD io_size, io_result; - - usbi_mutex_lock(&ctx->open_devs_lock); - for (i = 0; i < nfds && num_ready > 0; i++) { - - usbi_dbg("checking fd %d with revents = %04x", fds[i].fd, fds[i].revents); - - if (!fds[i].revents) { - continue; - } - - num_ready--; - - // Because a Windows OVERLAPPED is used for poll emulation, - // a pollable fd is created and stored with each transfer - usbi_mutex_lock(&ctx->flying_transfers_lock); - found = false; - list_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) { - transfer_priv = usbi_transfer_get_os_priv(transfer); - if (transfer_priv->pollable_fd.fd == fds[i].fd) { - found = true; - break; - } - } - usbi_mutex_unlock(&ctx->flying_transfers_lock); - - if (found) { - // Handle async requests that completed synchronously first - if (HasOverlappedIoCompletedSync(transfer_priv->pollable_fd.overlapped)) { - io_result = NO_ERROR; - io_size = (DWORD)transfer_priv->pollable_fd.overlapped->InternalHigh; - // Regular async overlapped - } else if (GetOverlappedResult(transfer_priv->pollable_fd.handle, - transfer_priv->pollable_fd.overlapped, &io_size, false)) { - io_result = NO_ERROR; - } else { - io_result = GetLastError(); - } - usbi_remove_pollfd(ctx, transfer_priv->pollable_fd.fd); - // let handle_callback free the event using the transfer wfd - // If you don't use the transfer wfd, you run a risk of trying to free a - // newly allocated wfd that took the place of the one from the transfer. - windows_handle_callback(transfer, io_result, io_size); - } else { - usbi_mutex_unlock(&ctx->open_devs_lock); - usbi_err(ctx, "could not find a matching transfer for fd %x", fds[i]); - return LIBUSB_ERROR_NOT_FOUND; - } - } - - usbi_mutex_unlock(&ctx->open_devs_lock); - return LIBUSB_SUCCESS; + struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(transfer); + return &transfer_priv->pollable_fd; } -/* - * Monotonic and real time functions - */ -unsigned __stdcall windows_clock_gettime_threaded(void* param) +void windows_get_overlapped_result(struct usbi_transfer *transfer, struct winfd *pollable_fd, DWORD *io_result, DWORD *io_size) { - struct timer_request *request; - LARGE_INTEGER hires_counter; - MSG msg; - - // The following call will create this thread's message queue - // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms644946.aspx - pPeekMessageA(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE); - - // Signal windows_init() that we're ready to service requests - if (!SetEvent((HANDLE)param)) { - usbi_dbg("SetEvent failed for timer init event: %s", windows_error_str(0)); + if (HasOverlappedIoCompletedSync(pollable_fd->overlapped)) { + *io_result = NO_ERROR; + *io_size = (DWORD)pollable_fd->overlapped->InternalHigh; + // Regular async overlapped } - param = NULL; - - // Main loop - wait for requests - while (1) { - if (pGetMessageA(&msg, NULL, WM_TIMER_REQUEST, WM_TIMER_EXIT) == -1) { - usbi_err(NULL, "GetMessage failed for timer thread: %s", windows_error_str(0)); - return 1; - } - - switch (msg.message) { - case WM_TIMER_REQUEST: - // Requests to this thread are for hires always - // Microsoft says that this function always succeeds on XP and later - // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms644904.aspx - request = (struct timer_request *)msg.lParam; - QueryPerformanceCounter(&hires_counter); - request->tp->tv_sec = (long)(hires_counter.QuadPart / hires_frequency); - request->tp->tv_nsec = (long)(((hires_counter.QuadPart % hires_frequency) / 1000) * hires_ticks_to_ps); - if (!SetEvent(request->event)) { - usbi_err(NULL, "SetEvent failed for timer request: %s", windows_error_str(0)); - } - break; - - case WM_TIMER_EXIT: - usbi_dbg("timer thread quitting"); - return 0; - } + else if (GetOverlappedResult(pollable_fd->handle, pollable_fd->overlapped, io_size, false)) { + *io_result = NO_ERROR; } -} - -static int windows_clock_gettime(int clk_id, struct timespec *tp) -{ - struct timer_request request; - FILETIME filetime; - ULARGE_INTEGER rtime; - DWORD r; - switch(clk_id) { - case USBI_CLOCK_MONOTONIC: - if (timer_thread) { - request.tp = tp; - request.event = CreateEvent(NULL, FALSE, FALSE, NULL); - if (request.event == NULL) { - return LIBUSB_ERROR_NO_MEM; - } - - if (!pPostThreadMessageA(timer_thread_id, WM_TIMER_REQUEST, 0, (LPARAM)&request)) { - usbi_err(NULL, "PostThreadMessage failed for timer thread: %s", windows_error_str(0)); - CloseHandle(request.event); - return LIBUSB_ERROR_OTHER; - } - - do { - r = WaitForSingleObject(request.event, TIMER_REQUEST_RETRY_MS); - if (r == WAIT_TIMEOUT) { - usbi_dbg("could not obtain a timer value within reasonable timeframe - too much load?"); - } - else if (r == WAIT_FAILED) { - usbi_err(NULL, "WaitForSingleObject failed: %s", windows_error_str(0)); - } - } while (r == WAIT_TIMEOUT); - CloseHandle(request.event); - - if (r == WAIT_OBJECT_0) { - return LIBUSB_SUCCESS; - } - else { - return LIBUSB_ERROR_OTHER; - } - } - // Fall through and return real-time if monotonic was not detected @ timer init - case USBI_CLOCK_REALTIME: - // We follow http://msdn.microsoft.com/en-us/library/ms724928%28VS.85%29.aspx - // with a predef epoch_time to have an epoch that starts at 1970.01.01 00:00 - // Note however that our resolution is bounded by the Windows system time - // functions and is at best of the order of 1 ms (or, usually, worse) - GetSystemTimeAsFileTime(&filetime); - rtime.LowPart = filetime.dwLowDateTime; - rtime.HighPart = filetime.dwHighDateTime; - rtime.QuadPart -= epoch_time; - tp->tv_sec = (long)(rtime.QuadPart / 10000000); - tp->tv_nsec = (long)((rtime.QuadPart % 10000000)*100); - return LIBUSB_SUCCESS; - default: - return LIBUSB_ERROR_INVALID_PARAM; + else { + *io_result = GetLastError(); } } - // NB: MSVC6 does not support named initializers. const struct usbi_os_backend windows_backend = { "Windows", @@ -2478,10 +1978,10 @@ const struct usbi_os_backend windows_backend = { windows_cancel_transfer, windows_clear_transfer_priv, - windows_handle_events, - NULL, /* handle_transfer_completion() */ + win_handle_events, + NULL, - windows_clock_gettime, + win_clock_gettime, #if defined(USBI_TIMERFD_AVAILABLE) NULL, #endif diff --git a/libusb/os/windows_usb.h b/libusb/os/windows_usb.h index 35fd2f2..3d054f8 100644 --- a/libusb/os/windows_usb.h +++ b/libusb/os/windows_usb.h @@ -23,6 +23,7 @@ #pragma once #include "windows_common.h" +#include "windows_nt_common.h" #if defined(_MSC_VER) // disable /W4 MSVC warnings that are benign @@ -64,7 +65,6 @@ #define MAX_PATH_LENGTH 128 #define MAX_KEY_LENGTH 256 #define LIST_SEPARATOR ';' -#define HTAB_SIZE 1021 // Handle code for HID interface that have been claimed ("dibs") #define INTERFACE_CLAIMED ((HANDLE)(intptr_t)0xD1B5) @@ -209,7 +209,6 @@ struct hid_device_priv { uint8_t string_index[3]; // man, prod, ser }; -typedef struct libusb_device_descriptor USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR; struct windows_device_priv { uint8_t depth; // distance to HCD uint8_t port; // port number on the hub @@ -308,15 +307,6 @@ struct driver_lookup { const char* designation; // internal designation (for debug output) }; -#define WM_TIMER_REQUEST (WM_USER + 1) -#define WM_TIMER_EXIT (WM_USER + 2) - -// used for monotonic clock_gettime() -struct timer_request { - struct timespec *tp; - HANDLE event; -}; - /* OLE32 dependency */ DLL_DECLARE_PREFIXED(WINAPI, HRESULT, p, CLSIDFromString, (LPCOLESTR, LPCLSID)); @@ -338,11 +328,6 @@ DLL_DECLARE_PREFIXED(WINAPI, HKEY, p, SetupDiOpenDeviceInterfaceRegKey, (HDEVINF DLL_DECLARE_PREFIXED(WINAPI, LONG, p, RegQueryValueExW, (HKEY, LPCWSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD)); DLL_DECLARE_PREFIXED(WINAPI, LONG, p, RegCloseKey, (HKEY)); -/* User32 dependencies */ -DLL_DECLARE_PREFIXED(WINAPI, BOOL, p, GetMessageA, (LPMSG, HWND, UINT, UINT)); -DLL_DECLARE_PREFIXED(WINAPI, BOOL, p, PeekMessageA, (LPMSG, HWND, UINT, UINT, UINT)); -DLL_DECLARE_PREFIXED(WINAPI, BOOL, p, PostThreadMessageA, (DWORD, UINT, WPARAM, LPARAM)); - /* * Windows DDK API definitions. Most of it copied from MinGW's includes */ @@ -469,17 +454,6 @@ typedef struct USB_INTERFACE_DESCRIPTOR { UCHAR iInterface; } USB_INTERFACE_DESCRIPTOR, *PUSB_INTERFACE_DESCRIPTOR; -typedef struct USB_CONFIGURATION_DESCRIPTOR { - UCHAR bLength; - UCHAR bDescriptorType; - USHORT wTotalLength; - UCHAR bNumInterfaces; - UCHAR bConfigurationValue; - UCHAR iConfiguration; - UCHAR bmAttributes; - UCHAR MaxPower; -} USB_CONFIGURATION_DESCRIPTOR, *PUSB_CONFIGURATION_DESCRIPTOR; - typedef struct USB_CONFIGURATION_DESCRIPTOR_SHORT { struct { ULONG ConnectionIndex; diff --git a/msvc/libusb_dll_2013.vcxproj b/msvc/libusb_dll_2013.vcxproj index c1b2a0a..d2ee675 100644 --- a/msvc/libusb_dll_2013.vcxproj +++ b/msvc/libusb_dll_2013.vcxproj @@ -147,6 +147,7 @@ <ClCompile Include="..\libusb\hotplug.c" /> <ClCompile Include="..\libusb\io.c" /> <ClCompile Include="..\libusb\os\poll_windows.c" /> + <ClCompile Include="..\libusb\os\windows_nt_common.c" /> <ClCompile Include="..\libusb\strerror.c" /> <ClCompile Include="..\libusb\sync.c" /> <ClCompile Include="..\libusb\os\threads_windows.c" /> @@ -154,6 +155,7 @@ </ItemGroup> <ItemGroup> <ClInclude Include="..\libusb\hotplug.h" /> + <ClInclude Include="..\libusb\os\windows_nt_common.h" /> <ClInclude Include="..\libusb\version.h" /> <ClInclude Include="..\libusb\version_nano.h" /> <ClInclude Include=".\config.h" /> diff --git a/msvc/libusb_sources b/msvc/libusb_sources index 308a666..f9718cf 100644 --- a/msvc/libusb_sources +++ b/msvc/libusb_sources @@ -35,4 +35,5 @@ SOURCES=..\core.c \ threads_windows.c \ poll_windows.c \ windows_usb.c \ + windows_nt_common.c \ ..\libusb-1.0.rc diff --git a/msvc/libusb_static_2013.vcxproj b/msvc/libusb_static_2013.vcxproj index 05b7bd8..f980ae3 100644 --- a/msvc/libusb_static_2013.vcxproj +++ b/msvc/libusb_static_2013.vcxproj @@ -137,6 +137,7 @@ <ClCompile Include="..\libusb\hotplug.c" /> <ClCompile Include="..\libusb\io.c" /> <ClCompile Include="..\libusb\os\poll_windows.c" /> + <ClCompile Include="..\libusb\os\windows_nt_common.c" /> <ClCompile Include="..\libusb\strerror.c" /> <ClCompile Include="..\libusb\sync.c" /> <ClCompile Include="..\libusb\os\threads_windows.c" /> @@ -144,6 +145,7 @@ </ItemGroup> <ItemGroup> <ClInclude Include="..\libusb\hotplug.h" /> + <ClInclude Include="..\libusb\os\windows_nt_common.h" /> <ClInclude Include="..\libusb\version.h" /> <ClInclude Include="..\libusb\version_nano.h" /> <ClInclude Include=".\config.h" /> -- 2.4.3 |
From: Dmitry F. <dm...@da...> - 2015-12-06 15:11:54
|
Signed-off-by: Pavel Gurvich <pa...@da...> Signed-off-by: Dmitry Fleytman <dfl...@re...> --- libusb/core.c | 6 + libusb/libusbi.h | 1 + libusb/os/windows_usbdk.c | 958 +++++++++++++++++++++++++++++++++++++++++++++ libusb/os/windows_usbdk.h | 126 ++++++ libusb/os/windows_winusb.c | 4 + 5 files changed, 1095 insertions(+) create mode 100644 libusb/os/windows_usbdk.c create mode 100644 libusb/os/windows_usbdk.h diff --git a/libusb/core.c b/libusb/core.c index 9c617fb..4de32ec 100644 --- a/libusb/core.c +++ b/libusb/core.c @@ -53,7 +53,13 @@ const struct usbi_os_backend * const usbi_backend = &openbsd_backend; #elif defined(OS_NETBSD) const struct usbi_os_backend * const usbi_backend = &netbsd_backend; #elif defined(OS_WINDOWS) + +#if defined(USE_USBDK) +const struct usbi_os_backend * const usbi_backend = &usbdk_backend; +#else const struct usbi_os_backend * const usbi_backend = &windows_backend; +#endif + #elif defined(OS_WINCE) const struct usbi_os_backend * const usbi_backend = &wince_backend; #elif defined(OS_HAIKU) diff --git a/libusb/libusbi.h b/libusb/libusbi.h index f1afd99..aa17d30 100644 --- a/libusb/libusbi.h +++ b/libusb/libusbi.h @@ -1103,6 +1103,7 @@ extern const struct usbi_os_backend darwin_backend; extern const struct usbi_os_backend openbsd_backend; extern const struct usbi_os_backend netbsd_backend; extern const struct usbi_os_backend windows_backend; +extern const struct usbi_os_backend usbdk_backend; extern const struct usbi_os_backend wince_backend; extern const struct usbi_os_backend haiku_usb_raw_backend; diff --git a/libusb/os/windows_usbdk.c b/libusb/os/windows_usbdk.c new file mode 100644 index 0000000..342abbe --- /dev/null +++ b/libusb/os/windows_usbdk.c @@ -0,0 +1,958 @@ +/* + * windows UsbDk backend for libusb 1.0 + * Copyright © 2014 Red Hat, Inc. + + * Authors: + * Dmitry Fleytman <dm...@da...> + * Pavel Gurvich <pa...@da...> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <config.h> + +#if defined(USE_USBDK) + +#include <stdio.h> + +#include "libusbi.h" +#include "cfgmgr32.h" +#include "windows_common.h" +#include "windows_nt_common.h" + +#define ULONG64 uint64_t +#define PVOID64 uint64_t + +typedef CONST WCHAR *PCWCHAR; +#define wcsncpy_s wcsncpy + +#include "windows_usbdk.h" + +#if !defined(STATUS_SUCCESS) +typedef LONG NTSTATUS; +#define STATUS_SUCCESS ((NTSTATUS)0x00000000L) +#endif + +#if !defined(STATUS_CANCELLED) +#define STATUS_CANCELLED ((NTSTATUS)0xC0000120L) +#endif + +#if !defined(STATUS_REQUEST_CANCELED) +#define STATUS_REQUEST_CANCELED ((NTSTATUS)0xC0000703L) +#endif + +#if !defined(USBD_SUCCESS) +typedef int32_t USBD_STATUS; +#define USBD_SUCCESS(Status) ((USBD_STATUS) (Status) >= 0) +#define USBD_PENDING(Status) ((ULONG) (Status) >> 30 == 1) +#define USBD_ERROR(Status) ((USBD_STATUS) (Status) < 0) +#define USBD_STATUS_STALL_PID ((USBD_STATUS) 0xc0000004) +#define USBD_STATUS_ENDPOINT_HALTED ((USBD_STATUS) 0xc0000030) +#define USBD_STATUS_BAD_START_FRAME ((USBD_STATUS) 0xc0000a00) +#define USBD_STATUS_TIMEOUT ((USBD_STATUS) 0xc0006000) +#define USBD_STATUS_CANCELED ((USBD_STATUS) 0xc0010000) +#endif + +static int concurrent_usage = -1; +static int init_succeeded = 0; + +struct usbdk_device_priv { + USB_DK_DEVICE_INFO info; + PUSB_CONFIGURATION_DESCRIPTOR *config_descriptors; + HANDLE redirector_handle; + uint8_t active_configuration; +}; + +struct usbdk_device_handle_priv { + //This field is to solve compilation error on VS2013: + //error C2016: C requires that a struct or union has at least one member + int dummy; +}; + +struct usbdk_transfer_priv { + USB_DK_TRANSFER_REQUEST request; + struct winfd pollable_fd; + PULONG64 IsochronousPacketsArray; + PUSB_DK_ISO_TRANSFER_RESULT IsochronousResultsArray; +}; + +static inline struct usbdk_device_priv *_usbdk_device_priv(struct libusb_device *dev) +{ + return (struct usbdk_device_priv*) dev->os_priv; +} + +static inline struct usbdk_transfer_priv *_usbdk_transfer_priv(struct usbi_transfer *itransfer) +{ + return (struct usbdk_transfer_priv*) usbi_transfer_get_os_priv(itransfer); +} + +static struct { + HMODULE module; + + USBDK_GET_DEVICES_LIST GetDevicesList; + USBDK_RELEASE_DEVICES_LIST ReleaseDevicesList; + USBDK_START_REDIRECT StartRedirect; + USBDK_STOP_REDIRECT StopRedirect; + USBDK_GET_CONFIGURATION_DESCRIPTOR GetConfigurationDescriptor; + USBDK_RELEASE_CONFIGURATION_DESCRIPTOR ReleaseConfigurationDescriptor; + USBDK_READ_PIPE ReadPipe; + USBDK_WRITE_PIPE WritePipe; + USBDK_ABORT_PIPE AbortPipe; + USBDK_RESET_PIPE ResetPipe; + USBDK_SET_ALTSETTING SetAltsetting; + USBDK_RESET_DEVICE ResetDevice; + USBDK_GET_REDIRECTOR_SYSTEM_HANDLE GetRedirectorSystemHandle; +} usbdk_helper; + +static FARPROC get_usbdk_proc_addr(struct libusb_context *ctx, LPCSTR api_name) +{ + FARPROC api_ptr = GetProcAddress(usbdk_helper.module, api_name); + if (api_ptr == NULL) { + DWORD err = GetLastError(); + usbi_err(ctx, "UsbDkHelper API %s not found, error %d", api_name, err); + } + + return api_ptr; +} + +static void unload_usbdk_helper_dll(void) +{ + FreeLibrary(usbdk_helper.module); +} + +static int load_usbdk_helper_dll(struct libusb_context *ctx) +{ + usbdk_helper.module = LoadLibraryA("UsbDkHelper"); + if (usbdk_helper.module == NULL) { + DWORD err = GetLastError(); + usbi_err(ctx, "Failed to load UsbDkHelper.dll, error %d", err); + return LIBUSB_ERROR_NOT_FOUND; + } + + usbdk_helper.GetDevicesList = (USBDK_GET_DEVICES_LIST) get_usbdk_proc_addr(ctx, "UsbDk_GetDevicesList"); + if (usbdk_helper.GetDevicesList == NULL) { + goto error_unload; + } + + usbdk_helper.ReleaseDevicesList = (USBDK_RELEASE_DEVICES_LIST) get_usbdk_proc_addr(ctx, "UsbDk_ReleaseDevicesList"); + if (usbdk_helper.ReleaseDevicesList == NULL) { + goto error_unload; + } + + usbdk_helper.StartRedirect = (USBDK_START_REDIRECT) get_usbdk_proc_addr(ctx, "UsbDk_StartRedirect"); + if (usbdk_helper.StartRedirect == NULL) { + goto error_unload; + } + + usbdk_helper.StopRedirect = (USBDK_STOP_REDIRECT) get_usbdk_proc_addr(ctx, "UsbDk_StopRedirect"); + if (usbdk_helper.StopRedirect == NULL) { + goto error_unload; + } + + usbdk_helper.GetConfigurationDescriptor = (USBDK_GET_CONFIGURATION_DESCRIPTOR) get_usbdk_proc_addr(ctx, "UsbDk_GetConfigurationDescriptor"); + if (usbdk_helper.GetConfigurationDescriptor == NULL) { + goto error_unload; + } + + usbdk_helper.ReleaseConfigurationDescriptor = (USBDK_RELEASE_CONFIGURATION_DESCRIPTOR) get_usbdk_proc_addr(ctx, "UsbDk_ReleaseConfigurationDescriptor"); + if (usbdk_helper.ReleaseConfigurationDescriptor == NULL) { + goto error_unload; + } + + usbdk_helper.ReadPipe = (USBDK_READ_PIPE) get_usbdk_proc_addr(ctx, "UsbDk_ReadPipe"); + if (usbdk_helper.ReadPipe == NULL) { + goto error_unload; + } + + usbdk_helper.WritePipe = (USBDK_WRITE_PIPE) get_usbdk_proc_addr(ctx, "UsbDk_WritePipe"); + if (usbdk_helper.WritePipe == NULL) { + goto error_unload; + } + + usbdk_helper.AbortPipe = (USBDK_ABORT_PIPE)get_usbdk_proc_addr(ctx, "UsbDk_AbortPipe"); + if (usbdk_helper.AbortPipe == NULL) { + goto error_unload; + } + + usbdk_helper.ResetPipe = (USBDK_RESET_PIPE)get_usbdk_proc_addr(ctx, "UsbDk_ResetPipe"); + if (usbdk_helper.ResetPipe == NULL) { + goto error_unload; + } + + usbdk_helper.SetAltsetting = (USBDK_SET_ALTSETTING)get_usbdk_proc_addr(ctx, "UsbDk_SetAltsetting"); + if (usbdk_helper.SetAltsetting == NULL) { + goto error_unload; + } + + usbdk_helper.ResetDevice = (USBDK_RESET_DEVICE)get_usbdk_proc_addr(ctx, "UsbDk_ResetDevice"); + if (usbdk_helper.ResetDevice == NULL) { + goto error_unload; + } + + usbdk_helper.GetRedirectorSystemHandle = (USBDK_GET_REDIRECTOR_SYSTEM_HANDLE)get_usbdk_proc_addr(ctx, "UsbDk_GetRedirectorSystemHandle"); + if (usbdk_helper.GetRedirectorSystemHandle == NULL) { + goto error_unload; + } + + return LIBUSB_SUCCESS; + +error_unload: + FreeLibrary(usbdk_helper.module); + return LIBUSB_ERROR_NOT_FOUND; +} + +static int usbdk_init(struct libusb_context *ctx) +{ + int r; + + if ((++concurrent_usage == 0) || !init_succeeded) { + r = load_usbdk_helper_dll(ctx); + if (r) { + return r; + } + + init_polling(); + + r = LIBUSB_ERROR_NO_MEM; + if (!win_init_clock(ctx)){ + goto error_roll_back; + } + + if (!htab_create(ctx, HTAB_SIZE)) { + r = LIBUSB_ERROR_NO_MEM; + goto error_roll_back; + } + + init_succeeded = 1; + } + + return LIBUSB_SUCCESS; + +error_roll_back: + htab_destroy(); + win_destroy_clock(); + unload_usbdk_helper_dll(); + return r; +} + +static int usbdk_get_session_id_for_device(struct libusb_context *ctx, + PUSB_DK_DEVICE_ID id, + unsigned long* session_id) +{ + char dev_identity[ARRAYSIZE(id->DeviceID) + ARRAYSIZE(id->InstanceID)]; + + if (sprintf(dev_identity, "%S%S", id->DeviceID, id->InstanceID) == -1) { + usbi_warn(ctx, "cannot form device identity", id->DeviceID); + return LIBUSB_ERROR_NOT_SUPPORTED; + } + + *session_id = htab_hash(dev_identity); + + return LIBUSB_SUCCESS; +} + +static void usbdk_release_config_descriptors(struct usbdk_device_priv* p, uint8_t count) +{ + uint8_t i; + for (i = 0; i < count; i++) { + usbdk_helper.ReleaseConfigurationDescriptor(p->config_descriptors[i]); + } + free(p->config_descriptors); + p->config_descriptors = NULL; +} + +static int usbdk_cache_config_descriptors(struct libusb_context *ctx, + struct usbdk_device_priv* p, + PUSB_DK_DEVICE_INFO info) +{ + uint8_t i; + USB_DK_CONFIG_DESCRIPTOR_REQUEST Request; + Request.ID = info->ID; + + p->config_descriptors = calloc(info->DeviceDescriptor.bNumConfigurations, + sizeof(PUSB_CONFIGURATION_DESCRIPTOR)); + if (p->config_descriptors == NULL) { + usbi_err(ctx, "failed to allocate configuration descriptors holder"); + return LIBUSB_ERROR_NO_MEM; + } + + for (i = 0; i < info->DeviceDescriptor.bNumConfigurations; i++) { + ULONG Length; + + Request.Index = i; + if (!usbdk_helper.GetConfigurationDescriptor(&Request, + &p->config_descriptors[i], + &Length)) { + usbi_err(ctx, "failed to retrieve configuration descriptors"); + usbdk_release_config_descriptors(p, i); + return LIBUSB_ERROR_OTHER; + } + } + + return LIBUSB_SUCCESS; +} + +static inline int usbdk_device_priv_init(struct libusb_context *ctx, libusb_device* dev, PUSB_DK_DEVICE_INFO info) +{ + struct usbdk_device_priv* p = _usbdk_device_priv(dev); + p->info = *info; + p->active_configuration = 0; + return usbdk_cache_config_descriptors(ctx, p, info); +} + +static void usbdk_device_init(libusb_device* dev, PUSB_DK_DEVICE_INFO info) +{ + dev->bus_number = (uint8_t) info->FilterID; + dev->port_number = (uint8_t) info->Port; + dev->parent_dev = NULL; + + //Addresses in libusb are 1-based + dev->device_address = (uint8_t) info->Port + 1; + + dev->num_configurations = info->DeviceDescriptor.bNumConfigurations; + dev->device_descriptor = info->DeviceDescriptor; + + switch (info->Speed) + { + case LowSpeed: + dev->speed = LIBUSB_SPEED_LOW; + break; + case FullSpeed: + dev->speed = LIBUSB_SPEED_FULL; + break; + case HighSpeed: + dev->speed = LIBUSB_SPEED_HIGH; + break; + case SuperSpeed: + dev->speed = LIBUSB_SPEED_SUPER; + break; + case NoSpeed: + default: + dev->speed = LIBUSB_SPEED_UNKNOWN; + break; + } +} + +static int usbdk_get_device_list(struct libusb_context *ctx, struct discovered_devs **_discdevs) +{ + int r = LIBUSB_SUCCESS; + ULONG i; + + struct discovered_devs *discdevs = NULL; + ULONG dev_number; + PUSB_DK_DEVICE_INFO devices; + + if(!usbdk_helper.GetDevicesList(&devices, &dev_number)) { + return LIBUSB_ERROR_OTHER; + } + + for (i = 0; i < dev_number; ++i) { + unsigned long session_id; + struct libusb_device *dev = NULL; + + if (usbdk_get_session_id_for_device(ctx, &devices[i].ID, &session_id)) { + continue; + } + + dev = usbi_get_device_by_session_id(ctx, session_id); + if (dev == NULL) { + dev = usbi_alloc_device(ctx, session_id); + if (dev == NULL) { + usbi_err(ctx, "failed to allocate a new device structure"); + continue; + } + + usbdk_device_init(dev, &devices[i]); + if (usbdk_device_priv_init(ctx, dev, &devices[i]) != LIBUSB_SUCCESS) { + libusb_unref_device(dev); + continue; + } + } + + discdevs = discovered_devs_append(*_discdevs, dev); + + libusb_unref_device(dev); + + if (!discdevs) + { + usbi_err(ctx, "cannot append new device to list"); + r = LIBUSB_ERROR_NO_MEM; + goto func_exit; + } + *_discdevs = discdevs; + } + +func_exit: + usbdk_helper.ReleaseDevicesList(devices); + return r; +} + +static void usbdk_exit(void) +{ + if ((--concurrent_usage < 0) && init_succeeded) { + htab_destroy(); + win_destroy_clock(); + exit_polling(); + unload_usbdk_helper_dll(); + init_succeeded = 0; + } +} + +static int usbdk_get_device_descriptor(struct libusb_device *dev, unsigned char *buffer, int *host_endian) +{ + struct usbdk_device_priv *priv = _usbdk_device_priv(dev); + + memcpy(buffer, &priv->info.DeviceDescriptor, DEVICE_DESC_LENGTH); + *host_endian = 0; + + return LIBUSB_SUCCESS; +} + +static int usbdk_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian) +{ + struct usbdk_device_priv *priv = _usbdk_device_priv(dev); + PUSB_CONFIGURATION_DESCRIPTOR config_header; + size_t size; + + if (config_index >= dev->num_configurations) + return LIBUSB_ERROR_INVALID_PARAM; + + config_header = (PUSB_CONFIGURATION_DESCRIPTOR) priv->config_descriptors[config_index]; + + size = min(config_header->wTotalLength, len); + memcpy(buffer, config_header, size); + *host_endian = 0; + + return (int)size; +} + +static inline int usbdk_get_active_config_descriptor(struct libusb_device *dev, unsigned char *buffer, size_t len, int *host_endian) +{ + return usbdk_get_config_descriptor(dev, _usbdk_device_priv(dev)->active_configuration, + buffer, len, host_endian); +} + +static int usbdk_open(struct libusb_device_handle *dev_handle) +{ + struct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev); + + priv->redirector_handle = usbdk_helper.StartRedirect(&priv->info.ID); + if (priv->redirector_handle == INVALID_HANDLE_VALUE) + { + usbi_err(DEVICE_CTX(dev_handle->dev), "Redirector startup failed"); + return LIBUSB_ERROR_OTHER; + } + + return LIBUSB_SUCCESS; +} + +static void usbdk_close(struct libusb_device_handle *dev_handle) +{ + struct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev); + + if (!usbdk_helper.StopRedirect(priv->redirector_handle)) + { + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + usbi_err(ctx, "Redirector shutdown failed"); + } +} + +static int usbdk_get_configuration(struct libusb_device_handle *dev_handle, int *config) +{ + *config = _usbdk_device_priv(dev_handle->dev)->active_configuration; + return LIBUSB_SUCCESS; +} + +static int usbdk_set_configuration(struct libusb_device_handle *dev_handle, int config) +{ + UNREFERENCED_PARAMETER(dev_handle); + UNREFERENCED_PARAMETER(config); + return LIBUSB_SUCCESS; +} + +static int usbdk_claim_interface(struct libusb_device_handle *dev_handle, int iface) +{ + UNREFERENCED_PARAMETER(dev_handle); + UNREFERENCED_PARAMETER(iface); + return LIBUSB_SUCCESS; +} + +static int usbdk_set_interface_altsetting(struct libusb_device_handle *dev_handle, int iface, int altsetting) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev); + + if (!usbdk_helper.SetAltsetting(priv->redirector_handle, iface, altsetting)) { + usbi_err(ctx, "SetAltsetting failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_NO_DEVICE; + } + + return LIBUSB_SUCCESS; +} + +static int usbdk_release_interface(struct libusb_device_handle *dev_handle, int iface) +{ + UNREFERENCED_PARAMETER(dev_handle); + UNREFERENCED_PARAMETER(iface); + return LIBUSB_SUCCESS; +} + +static int usbdk_clear_halt(struct libusb_device_handle *dev_handle, unsigned char endpoint) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev); + + if (!usbdk_helper.ResetPipe(priv->redirector_handle, endpoint)) { + usbi_err(ctx, "ResetPipe failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_NO_DEVICE; + } + + return LIBUSB_SUCCESS; +} + +static int usbdk_reset_device(struct libusb_device_handle *dev_handle) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev); + + if (!usbdk_helper.ResetDevice(priv->redirector_handle)) { + usbi_err(ctx, "ResetDevice failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_NO_DEVICE; + } + + return LIBUSB_SUCCESS; +} + +static int usbdk_kernel_driver_active(struct libusb_device_handle *dev_handle, int iface) +{ + UNREFERENCED_PARAMETER(dev_handle); + UNREFERENCED_PARAMETER(iface); + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +static int usbdk_attach_kernel_driver(struct libusb_device_handle *dev_handle, int iface) +{ + UNREFERENCED_PARAMETER(dev_handle); + UNREFERENCED_PARAMETER(iface); + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +static int usbdk_detach_kernel_driver(struct libusb_device_handle *dev_handle, int iface) +{ + UNREFERENCED_PARAMETER(dev_handle); + UNREFERENCED_PARAMETER(iface); + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +static void usbdk_destroy_device(struct libusb_device *dev) +{ + struct usbdk_device_priv* p = _usbdk_device_priv(dev); + + if (p->config_descriptors != NULL) + { + usbdk_release_config_descriptors(p, p->info.DeviceDescriptor.bNumConfigurations); + } +} + +void windows_clear_transfer_priv(struct usbi_transfer *itransfer) +{ + struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer); + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + usbi_free_fd(&transfer_priv->pollable_fd); + + if (transfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS){ + safe_free(transfer_priv->IsochronousPacketsArray); + safe_free(transfer_priv->IsochronousResultsArray); + } +} + +static int usbdk_do_control_transfer(struct usbi_transfer *itransfer) +{ + ULONG Length; + TransferResult transResult; + + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct usbdk_device_priv *priv = _usbdk_device_priv(transfer->dev_handle->dev); + struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + + HANDLE sysHandle = usbdk_helper.GetRedirectorSystemHandle(priv->redirector_handle); + + struct winfd wfd = usbi_create_fd(sysHandle, RW_READ, NULL, NULL); + // Always use the handle returned from usbi_create_fd (wfd.handle) + if (wfd.fd < 0) { + return LIBUSB_ERROR_NO_MEM; + } + + transfer_priv->request.Buffer = (PVOID64)(uintptr_t)transfer->buffer; + transfer_priv->request.BufferLength = transfer->length; + transfer_priv->request.TransferType = ControlTransferType; + transfer_priv->pollable_fd = INVALID_WINFD; + Length = (ULONG)transfer->length; + + if (IS_XFERIN(transfer)) { + transResult = usbdk_helper.ReadPipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped); + } + else { + transResult = usbdk_helper.WritePipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped); + } + + + switch (transResult) + { + case TransferSuccess: + wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; + wfd.overlapped->InternalHigh = (DWORD)Length; + break; + case TransferSuccessAsync: + break; + case TransferFailure: + { + usbi_err(ctx, "ControlTransfer failed: %s", windows_error_str(0)); + usbi_free_fd(&wfd); + return LIBUSB_ERROR_IO; + } + } + + // Use priv_transfer to store data needed for async polling + transfer_priv->pollable_fd = wfd; + usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, POLLIN); + return LIBUSB_SUCCESS; +} + +static int usbdk_do_bulk_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct usbdk_device_priv *priv = _usbdk_device_priv(transfer->dev_handle->dev); + struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct winfd wfd; + TransferResult transferRes; + HANDLE sysHandle; + + transfer_priv->request.Buffer = (PVOID64) (uintptr_t) transfer->buffer; + transfer_priv->request.BufferLength = transfer->length; + transfer_priv->request.EndpointAddress = transfer->endpoint; + + switch (transfer->type) + { + case LIBUSB_TRANSFER_TYPE_BULK: + transfer_priv->request.TransferType = BulkTransferType; + break; + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + transfer_priv->request.TransferType = IntertuptTransferType; + break; + default: + usbi_err(ctx, "Wrong transfer type (%d) in usbdk_do_bulk_transfer. %s", transfer->type, windows_error_str(0)); + return LIBUSB_ERROR_INVALID_PARAM; + } + + transfer_priv->pollable_fd = INVALID_WINFD; + + sysHandle = usbdk_helper.GetRedirectorSystemHandle(priv->redirector_handle); + + wfd = usbi_create_fd(sysHandle, IS_XFERIN(transfer) ? RW_READ : RW_WRITE, NULL, NULL); + // Always use the handle returned from usbi_create_fd (wfd.handle) + if (wfd.fd < 0) { + return LIBUSB_ERROR_NO_MEM; + } + + if (IS_XFERIN(transfer)) { + transferRes = usbdk_helper.ReadPipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped); + } + else { + transferRes = usbdk_helper.WritePipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped); + } + + switch (transferRes) + { + case TransferSuccess: + wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; + break; + case TransferSuccessAsync: + break; + case TransferFailure: + { + usbi_err(ctx, "ReadPipe/WritePipe failed: %s", windows_error_str(0)); + usbi_free_fd(&wfd); + return LIBUSB_ERROR_IO; + } + } + + transfer_priv->pollable_fd = wfd; + usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, (short)(IS_XFERIN(transfer) ? POLLIN : POLLOUT)); + return LIBUSB_SUCCESS; +} + +static int usbdk_do_iso_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct usbdk_device_priv *priv = _usbdk_device_priv(transfer->dev_handle->dev); + struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct winfd wfd; + TransferResult transferRes; + int i; + HANDLE sysHandle; + + transfer_priv->request.Buffer = (PVOID64)(uintptr_t)transfer->buffer; + transfer_priv->request.BufferLength = transfer->length; + transfer_priv->request.EndpointAddress = transfer->endpoint; + transfer_priv->request.TransferType = IsochronousTransferType; + transfer_priv->request.IsochronousPacketsArraySize = transfer->num_iso_packets; + transfer_priv->IsochronousPacketsArray = malloc(transfer->num_iso_packets * sizeof(ULONG64)); + transfer_priv->request.IsochronousPacketsArray = (PVOID64)(uintptr_t)transfer_priv->IsochronousPacketsArray; + if (!transfer_priv->IsochronousPacketsArray){ + usbi_err(ctx, "Allocation of IsochronousPacketsArray is failed, %s", windows_error_str(0)); + return LIBUSB_ERROR_IO; + } + + transfer_priv->IsochronousResultsArray = malloc(transfer->num_iso_packets * sizeof(USB_DK_ISO_TRANSFER_RESULT)); + transfer_priv->request.Result.IsochronousResultsArray = (PVOID64)(uintptr_t)transfer_priv->IsochronousResultsArray; + if (!transfer_priv->IsochronousResultsArray){ + usbi_err(ctx, "Allocation of isochronousResultsArray is failed, %s", windows_error_str(0)); + free(transfer_priv->IsochronousPacketsArray); + return LIBUSB_ERROR_IO; + } + + for (i = 0; i < transfer->num_iso_packets; i++){ + transfer_priv->IsochronousPacketsArray[i] = transfer->iso_packet_desc[i].length; + } + + transfer_priv->pollable_fd = INVALID_WINFD; + + sysHandle = usbdk_helper.GetRedirectorSystemHandle(priv->redirector_handle); + + wfd = usbi_create_fd(sysHandle, IS_XFERIN(transfer) ? RW_READ : RW_WRITE, NULL, NULL); + // Always use the handle returned from usbi_create_fd (wfd.handle) + if (wfd.fd < 0) { + free(transfer_priv->IsochronousPacketsArray); + free(transfer_priv->IsochronousResultsArray); + return LIBUSB_ERROR_NO_MEM; + } + + if (IS_XFERIN(transfer)) { + transferRes = usbdk_helper.ReadPipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped); + } + else { + transferRes = usbdk_helper.WritePipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped); + } + + switch (transferRes){ + case TransferSuccess: + wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; + break; + case TransferSuccessAsync: + break; + case TransferFailure: + { + usbi_err(ctx, "ReadPipe/WritePipe failed: %s", windows_error_str(0)); + usbi_free_fd(&wfd); + free(transfer_priv->IsochronousPacketsArray); + free(transfer_priv->IsochronousResultsArray); + return LIBUSB_ERROR_IO; + } + } + + transfer_priv->pollable_fd = wfd; + usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, (short)(IS_XFERIN(transfer) ? POLLIN : POLLOUT)); + + return LIBUSB_SUCCESS; +} + +static int usbdk_submit_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + return usbdk_do_control_transfer(itransfer); + + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + if (IS_XFEROUT(transfer) && transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) { + //TODO: Check whether we can support this in UsbDk + return LIBUSB_ERROR_NOT_SUPPORTED; + } else { + return usbdk_do_bulk_transfer(itransfer); + } + + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + return usbdk_do_iso_transfer(itransfer); + default: + usbi_err(TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type); + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +static int usbdk_abort_transfers(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct usbdk_device_priv *priv = _usbdk_device_priv(transfer->dev_handle->dev); + + if (!usbdk_helper.AbortPipe(priv->redirector_handle, transfer->endpoint)) { + usbi_err(ctx, "AbortPipe failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_NO_DEVICE; + } + + return LIBUSB_SUCCESS; +} + +static int usbdk_cancel_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + // Control transfers cancelled by IoCancelXXX() API + // No special treatment needed + return LIBUSB_SUCCESS; + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + return usbdk_abort_transfers(itransfer); + default: + usbi_err(ITRANSFER_CTX(itransfer), "unknown endpoint type %d", transfer->type); + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +int windows_copy_transfer_data(struct usbi_transfer *itransfer, uint32_t io_size) +{ + itransfer->transferred += io_size; + return LIBUSB_TRANSFER_COMPLETED; +} + +struct winfd *windows_get_fd(struct usbi_transfer *transfer) +{ + struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(transfer); + return &transfer_priv->pollable_fd; +} + +static DWORD usbdk_translate_usbd_status(USBD_STATUS UsbdStatus) +{ + if (USBD_SUCCESS(UsbdStatus)) + { + return NO_ERROR; + } + + switch (UsbdStatus) + { + case USBD_STATUS_STALL_PID: + case USBD_STATUS_ENDPOINT_HALTED: + case USBD_STATUS_BAD_START_FRAME: + return ERROR_GEN_FAILURE; + case USBD_STATUS_TIMEOUT: + return ERROR_SEM_TIMEOUT; + case USBD_STATUS_CANCELED: + return ERROR_OPERATION_ABORTED; + default: + return ERROR_FUNCTION_FAILED; + } +} + +void windows_get_overlapped_result(struct usbi_transfer *transfer, struct winfd *pollable_fd, DWORD *io_result, DWORD *io_size) +{ + if (HasOverlappedIoCompletedSync(pollable_fd->overlapped) || // Handle async requests that completed synchronously first + GetOverlappedResult(pollable_fd->handle, pollable_fd->overlapped, io_size, false)) { // Regular async overlapped + struct libusb_transfer *ltransfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer); + struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(transfer); + + if (ltransfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS){ + int i; + for (i = 0; i < transfer_priv->request.IsochronousPacketsArraySize; i++) { + struct libusb_iso_packet_descriptor *lib_desc = <ransfer->iso_packet_desc[i]; + + switch (transfer_priv->IsochronousResultsArray[i].TransferResult){ + case STATUS_SUCCESS: + case STATUS_CANCELLED: + case STATUS_REQUEST_CANCELED: + lib_desc->status = LIBUSB_TRANSFER_COMPLETED; // == ERROR_SUCCESS + break; + default: + lib_desc->status = LIBUSB_TRANSFER_ERROR; // ERROR_UNKNOWN_EXCEPTION; + break; + } + + lib_desc->actual_length = (unsigned int) transfer_priv->IsochronousResultsArray[i].ActualLength; + } + } + + *io_size = (DWORD) transfer_priv->request.Result.GenResult.BytesTransferred; + *io_result = usbdk_translate_usbd_status((USBD_STATUS) transfer_priv->request.Result.GenResult.UsbdStatus); + } + else { + *io_result = GetLastError(); + } +} + +static int usbdk_clock_gettime(int clk_id, struct timespec *tp) +{ + return win_clock_gettime(clk_id, tp); +} + +const struct usbi_os_backend usbdk_backend = { + "Windows", + USBI_CAP_HAS_HID_ACCESS, + usbdk_init, + usbdk_exit, + + usbdk_get_device_list, + NULL, + usbdk_open, + usbdk_close, + + usbdk_get_device_descriptor, + usbdk_get_active_config_descriptor, + usbdk_get_config_descriptor, + NULL, + + usbdk_get_configuration, + usbdk_set_configuration, + usbdk_claim_interface, + usbdk_release_interface, + + usbdk_set_interface_altsetting, + usbdk_clear_halt, + usbdk_reset_device, + + NULL, + NULL, + + usbdk_kernel_driver_active, + usbdk_detach_kernel_driver, + usbdk_attach_kernel_driver, + + usbdk_destroy_device, + + usbdk_submit_transfer, + usbdk_cancel_transfer, + windows_clear_transfer_priv, + + win_handle_events, + NULL, + + usbdk_clock_gettime, +#if defined(USBI_TIMERFD_AVAILABLE) + NULL, +#endif + sizeof(struct usbdk_device_priv), + sizeof(struct usbdk_device_handle_priv), + sizeof(struct usbdk_transfer_priv), +}; + +#endif /* USE_USBDK */ diff --git a/libusb/os/windows_usbdk.h b/libusb/os/windows_usbdk.h new file mode 100644 index 0000000..6b71735 --- /dev/null +++ b/libusb/os/windows_usbdk.h @@ -0,0 +1,126 @@ +/* +* windows UsbDk backend for libusb 1.0 +* Copyright © 2014 Red Hat, Inc. + +* Authors: +* Dmitry Fleytman <dm...@da...> +* Pavel Gurvich <pa...@da...> +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#pragma once + +typedef struct tag_USB_DK_DEVICE_ID +{ + WCHAR DeviceID[MAX_DEVICE_ID_LEN]; + WCHAR InstanceID[MAX_DEVICE_ID_LEN]; +} USB_DK_DEVICE_ID, *PUSB_DK_DEVICE_ID; + +static inline +void UsbDkFillIDStruct(USB_DK_DEVICE_ID *ID, PCWCHAR DeviceID, PCWCHAR InstanceID) +{ + wcsncpy_s(ID->DeviceID, DeviceID, MAX_DEVICE_ID_LEN); + wcsncpy_s(ID->InstanceID, InstanceID, MAX_DEVICE_ID_LEN); +} + +typedef struct tag_USB_DK_DEVICE_INFO +{ + USB_DK_DEVICE_ID ID; + ULONG64 FilterID; + ULONG64 Port; + ULONG64 Speed; + USB_DEVICE_DESCRIPTOR DeviceDescriptor; +} USB_DK_DEVICE_INFO, *PUSB_DK_DEVICE_INFO; + +typedef struct tag_USB_DK_CONFIG_DESCRIPTOR_REQUEST +{ + USB_DK_DEVICE_ID ID; + ULONG64 Index; +} USB_DK_CONFIG_DESCRIPTOR_REQUEST, *PUSB_DK_CONFIG_DESCRIPTOR_REQUEST; + +typedef struct tag_USB_DK_ISO_TRANSFER_RESULT +{ + ULONG64 ActualLength; + ULONG64 TransferResult; +} USB_DK_ISO_TRANSFER_RESULT, *PUSB_DK_ISO_TRANSFER_RESULT; + +typedef struct tag_USB_DK_GEN_TRANSFER_RESULT +{ + ULONG64 BytesTransferred; + ULONG64 UsbdStatus; // USBD_STATUS code +} USB_DK_GEN_TRANSFER_RESULT, *PUSB_DK_GEN_TRANSFER_RESULT; + +typedef struct tag_USB_DK_TRANSFER_RESULT +{ + USB_DK_GEN_TRANSFER_RESULT GenResult; + PVOID64 IsochronousResultsArray; // array of USB_DK_ISO_TRANSFER_RESULT +} USB_DK_TRANSFER_RESULT, *PUSB_DK_TRANSFER_RESULT; + +typedef struct tag_USB_DK_TRANSFER_REQUEST +{ + ULONG64 EndpointAddress; + PVOID64 Buffer; + ULONG64 BufferLength; + ULONG64 TransferType; + ULONG64 IsochronousPacketsArraySize; + PVOID64 IsochronousPacketsArray; + + USB_DK_TRANSFER_RESULT Result; +} USB_DK_TRANSFER_REQUEST, *PUSB_DK_TRANSFER_REQUEST; + +typedef enum +{ + TransferFailure = 0, + TransferSuccess, + TransferSuccessAsync +} TransferResult; + +typedef enum +{ + NoSpeed = 0, + LowSpeed, + FullSpeed, + HighSpeed, + SuperSpeed +} USB_DK_DEVICE_SPEED; + +typedef enum +{ + ControlTransferType, + BulkTransferType, + IntertuptTransferType, + IsochronousTransferType +} USB_DK_TRANSFER_TYPE; + +typedef BOOL (__cdecl *USBDK_GET_DEVICES_LIST) (PUSB_DK_DEVICE_INFO *, PULONG); +typedef void (__cdecl *USBDK_RELEASE_DEVICES_LIST) (PUSB_DK_DEVICE_INFO); + +typedef HANDLE (__cdecl *USBDK_START_REDIRECT) (PUSB_DK_DEVICE_ID); +typedef BOOL (__cdecl *USBDK_STOP_REDIRECT) (HANDLE); + +typedef BOOL (__cdecl *USBDK_GET_CONFIGURATION_DESCRIPTOR) (PUSB_DK_CONFIG_DESCRIPTOR_REQUEST Request, + PUSB_CONFIGURATION_DESCRIPTOR *Descriptor, + PULONG Length); +typedef void (__cdecl *USBDK_RELEASE_CONFIGURATION_DESCRIPTOR) (PUSB_CONFIGURATION_DESCRIPTOR Descriptor); + +typedef TransferResult (__cdecl *USBDK_WRITE_PIPE) (HANDLE DeviceHandle, PUSB_DK_TRANSFER_REQUEST Request, LPOVERLAPPED lpOverlapped); +typedef TransferResult (__cdecl *USBDK_READ_PIPE) (HANDLE DeviceHandle, PUSB_DK_TRANSFER_REQUEST Request, LPOVERLAPPED lpOverlapped); +typedef BOOL (__cdecl *USBDK_ABORT_PIPE) (HANDLE DeviceHandle, ULONG64 PipeAddress); +typedef BOOL (__cdecl *USBDK_RESET_PIPE) (HANDLE DeviceHandle, ULONG64 PipeAddress); +typedef BOOL (__cdecl *USBDK_SET_ALTSETTING) (HANDLE DeviceHandle, ULONG64 InterfaceIdx, ULONG64 AltSettingIdx); +typedef BOOL (__cdecl *USBDK_RESET_DEVICE) (HANDLE DeviceHandle); + +typedef HANDLE (__cdecl *USBDK_GET_REDIRECTOR_SYSTEM_HANDLE) (HANDLE DeviceHandle); diff --git a/libusb/os/windows_winusb.c b/libusb/os/windows_winusb.c index 27b91f8..913d49d 100644 --- a/libusb/os/windows_winusb.c +++ b/libusb/os/windows_winusb.c @@ -24,6 +24,8 @@ #include <config.h> +#if !defined(USE_USBDK) + #include <windows.h> #include <setupapi.h> #include <ctype.h> @@ -4143,3 +4145,5 @@ static int composite_copy_transfer_data(int sub_api, struct usbi_transfer *itran return priv->usb_interface[transfer_priv->interface_number].apib-> copy_transfer_data(priv->usb_interface[transfer_priv->interface_number].sub_api, itransfer, io_size); } + +#endif /* !USE_USBDK */ -- 2.4.3 |
From: Dmitry F. <dm...@da...> - 2015-12-06 15:11:55
|
From: Dmitry Fleytman <dfl...@re...> Signed-off-by: Dmitry Fleytman <dfl...@re...> --- configure.ac | 9 ++ libusb/Makefile.am | 10 +- msvc/ddk_build.cmd | 9 ++ msvc/libusb_2013.sln | 20 ++++ msvc/libusb_sources | 7 +- msvc/libusb_usbdk_dll_2013.vcxproj | 178 ++++++++++++++++++++++++++++++++++ msvc/libusb_usbdk_static_2013.vcxproj | 162 +++++++++++++++++++++++++++++++ 7 files changed, 392 insertions(+), 3 deletions(-) create mode 100644 msvc/libusb_usbdk_dll_2013.vcxproj create mode 100644 msvc/libusb_usbdk_static_2013.vcxproj diff --git a/configure.ac b/configure.ac index aeafcdc..79c7c5b 100644 --- a/configure.ac +++ b/configure.ac @@ -172,6 +172,14 @@ windows) LTLDFLAGS="${LTLDFLAGS} -avoid-version -Wl,--add-stdcall-alias" AC_DEFINE([POLL_NFDS_TYPE],[unsigned int],[type of second poll() argument]) AC_DEFINE([WINVER], 0x0501, [Oldest Windows version supported]) + + AC_ARG_ENABLE([usbdk], + [AC_HELP_STRING([--enable-usbdk], [use UsbDk Windows backend [default=no]])], + [], [enable_usbdk="no"]) + if test "x$enable_usbdk" = "xyes" ; then + AC_DEFINE(USE_USBDK, 1, [Use UsbDk Windows backend]) + fi + AC_SUBST(USE_USBDK) ;; haiku) AC_DEFINE(OS_HAIKU, 1, [Haiku backend]) @@ -193,6 +201,7 @@ AM_CONDITIONAL(OS_HAIKU, test "x$backend" = xhaiku) AM_CONDITIONAL(THREADS_POSIX, test "x$threads" = xposix) AM_CONDITIONAL(CREATE_IMPORT_LIB, test "x$create_import_lib" = "xyes") AM_CONDITIONAL(USE_UDEV, test "x$enable_udev" = xyes) +AM_CONDITIONAL(USE_USBDK, test "x$enable_usbdk" = xyes) if test "$threads" = posix; then AC_DEFINE(THREADS_POSIX, 1, [Use POSIX Threads]) fi diff --git a/libusb/Makefile.am b/libusb/Makefile.am index 7b72d2e..e6064f4 100644 --- a/libusb/Makefile.am +++ b/libusb/Makefile.am @@ -11,12 +11,13 @@ OPENBSD_USB_SRC = os/openbsd_usb.c NETBSD_USB_SRC = os/netbsd_usb.c COMMON_WINDOWS_SRC = os/poll_windows.c os/windows_nt_common.c libusb-1.0.rc libusb-1.0.def WINDOWS_USB_SRC = os/windows_winusb.c $(COMMON_WINDOWS_SRC) +WINDOWS_USBDK_SRC = os/windows_usbdk.c $(COMMON_WINDOWS_SRC) WINCE_USB_SRC = os/wince_usb.c os/wince_usb.h DIST_SUBDIRS = EXTRA_DIST = $(LINUX_USBFS_SRC) $(DARWIN_USB_SRC) $(OPENBSD_USB_SRC) \ - $(NETBSD_USB_SRC) $(WINDOWS_USB_SRC) $(WINCE_USB_SRC) \ + $(NETBSD_USB_SRC) $(WINDOWS_USB_SRC) $(WINDOWS_USBDK_SRC) $(WINCE_USB_SRC) \ $(POSIX_POLL_SRC) \ os/threads_posix.c os/threads_windows.c \ os/linux_udev.c os/linux_netlink.c @@ -56,7 +57,12 @@ SUBDIRS = os/haiku endif if OS_WINDOWS + +if USE_USBDK +OS_SRC = $(WINDOWS_USBDK_SRC) +else OS_SRC = $(WINDOWS_USB_SRC) +endif .rc.lo: $(AM_V_GEN)$(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --tag=RC --mode=compile $(RC) $(RCFLAGS) -i $< -o $@ @@ -80,7 +86,7 @@ libusb_1_0_la_CFLAGS = $(AM_CFLAGS) libusb_1_0_la_LDFLAGS = $(LTLDFLAGS) libusb_1_0_la_SOURCES = libusbi.h core.c descriptor.c io.c strerror.c sync.c \ os/linux_usbfs.h os/darwin_usb.h os/windows_winusb.h os/windows_common.h \ - os/windows_nt_common.h hotplug.h hotplug.c \ + os/windows_nt_common.h os/windows_usbdk.h hotplug.h hotplug.c \ $(THREADS_SRC) $(OS_SRC) \ os/poll_posix.h os/poll_windows.h diff --git a/msvc/ddk_build.cmd b/msvc/ddk_build.cmd index aadab50..c0b905a 100644 --- a/msvc/ddk_build.cmd +++ b/msvc/ddk_build.cmd @@ -3,20 +3,29 @@ ::# you can pass the following arguments (case insensitive): ::# - "DLL" to build a DLL instead of a static library ::# - "/MT" to build a static library compatible with MSVC's /MT option (LIBCMT vs MSVCRT) +::# - "USBDK" to build with UsbDk backend if Test%BUILD_ALT_DIR%==Test goto usage ::# process commandline parameters set TARGET=LIBRARY set STATIC_LIBC= +set WITH_USBDK= set version=1.0 set PWD=%~dp0 set BUILD_CMD=build -bcwgZ -M2 +:more_args + if "%1" == "" goto no_more_args ::# /I for case insensitive if /I Test%1==TestDLL set TARGET=DYNLINK if /I Test%1==Test/MT set STATIC_LIBC=1 +if /I Test%1==TestUSBDK set WITH_USBDK=1 + +shift +goto more_args + :no_more_args cd ..\libusb\os diff --git a/msvc/libusb_2013.sln b/msvc/libusb_2013.sln index 9d04d2c..fb05ded 100644 --- a/msvc/libusb_2013.sln +++ b/msvc/libusb_2013.sln @@ -21,6 +21,10 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "stress", "stress_2013.vcxpr EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hotplugtest", "hotplugtest_2013.vcxproj", "{99D2AC64-DC66-4422-91CE-6715C403C9E5}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libusb-usbdk-1.0 (dll)", "libusb_usbdk_dll_2013.vcxproj", "{F53A5974-2319-48EB-A67B-27933AEDF14A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libusb-usbdk-1.0 (static)", "libusb_usbdk_static_2013.vcxproj", "{0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -93,6 +97,22 @@ Global {99D2AC64-DC66-4422-91CE-6715C403C9E5}.Release|Win32.Build.0 = Release|Win32 {99D2AC64-DC66-4422-91CE-6715C403C9E5}.Release|x64.ActiveCfg = Release|x64 {99D2AC64-DC66-4422-91CE-6715C403C9E5}.Release|x64.Build.0 = Release|x64 + {F53A5974-2319-48EB-A67B-27933AEDF14A}.Debug|Win32.ActiveCfg = Debug|Win32 + {F53A5974-2319-48EB-A67B-27933AEDF14A}.Debug|Win32.Build.0 = Debug|Win32 + {F53A5974-2319-48EB-A67B-27933AEDF14A}.Debug|x64.ActiveCfg = Debug|x64 + {F53A5974-2319-48EB-A67B-27933AEDF14A}.Debug|x64.Build.0 = Debug|x64 + {F53A5974-2319-48EB-A67B-27933AEDF14A}.Release|Win32.ActiveCfg = Release|Win32 + {F53A5974-2319-48EB-A67B-27933AEDF14A}.Release|Win32.Build.0 = Release|Win32 + {F53A5974-2319-48EB-A67B-27933AEDF14A}.Release|x64.ActiveCfg = Release|x64 + {F53A5974-2319-48EB-A67B-27933AEDF14A}.Release|x64.Build.0 = Release|x64 + {0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}.Debug|Win32.ActiveCfg = Debug|Win32 + {0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}.Debug|Win32.Build.0 = Debug|Win32 + {0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}.Debug|x64.ActiveCfg = Debug|x64 + {0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}.Debug|x64.Build.0 = Debug|x64 + {0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}.Release|Win32.ActiveCfg = Release|Win32 + {0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}.Release|Win32.Build.0 = Release|Win32 + {0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}.Release|x64.ActiveCfg = Release|x64 + {0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/msvc/libusb_sources b/msvc/libusb_sources index a0387d9..591d7f6 100644 --- a/msvc/libusb_sources +++ b/msvc/libusb_sources @@ -12,8 +12,12 @@ USE_LIBCMT=1 USE_MSVCRT=1 !ENDIF +!IFDEF WITH_USBDK +BACKEND_DEFINES="/DUSE_USBDK" +!ENDIF + INCLUDES=..;..\..\msvc;$(DDK_INC_PATH) -C_DEFINES= $(C_DEFINES) $(LIBUSB_DEFINES) /DDDKBUILD +C_DEFINES= $(C_DEFINES) $(LIBUSB_DEFINES) $(BACKEND_DEFINES) /DDDKBUILD # http://jpassing.com/2009/10/21/ltcg-issues-with-the-win7amd64-environment-of-wdk-7600/ # prevents the following error when using the 64 bit static lib with Visual Studio 2010: @@ -35,5 +39,6 @@ SOURCES=..\core.c \ threads_windows.c \ poll_windows.c \ windows_winusb.c \ + windows_usbdk.c \ windows_nt_common.c \ ..\libusb-1.0.rc diff --git a/msvc/libusb_usbdk_dll_2013.vcxproj b/msvc/libusb_usbdk_dll_2013.vcxproj new file mode 100644 index 0000000..460ec7c --- /dev/null +++ b/msvc/libusb_usbdk_dll_2013.vcxproj @@ -0,0 +1,178 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectName>libusb-usbdk-1.0 (dll)</ProjectName> + <ProjectGuid>{F53A5974-2319-48EB-A67B-27933AEDF14A}</ProjectGuid> + <RootNamespace>libusbdll</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PlatformToolset>v120</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <PlatformToolset>v120</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PlatformToolset>v120</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <PlatformToolset>v120</PlatformToolset> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup> + <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\$(Platform)\$(Configuration)\dll\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\$(Platform)\$(Configuration)\dll\libusb-usbdk-1.0\</IntDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\$(Platform)\$(Configuration)\dll\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\$(Platform)\$(Configuration)\dll\libusb-usbdk-1.0\</IntDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\$(Platform)\$(Configuration)\dll\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\$(Platform)\$(Configuration)\dll\libusb-usbdk-1.0\</IntDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\$(Platform)\$(Configuration)\dll\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\$(Platform)\$(Configuration)\dll\libusb-usbdk-1.0\</IntDir> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">libusb-usbdk-1.0</TargetName> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">libusb-usbdk-1.0</TargetName> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">libusb-usbdk-1.0</TargetName> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">libusb-usbdk-1.0</TargetName> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <Optimization>Disabled</Optimization> + <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_WIN32;USE_USBDK;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> + <WarningLevel>Level4</WarningLevel> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + </ClCompile> + <Link> + <OutputFile>$(OutDir)libusb-usbdk-1.0.dll</OutputFile> + <ModuleDefinitionFile>..\libusb\libusb-1.0.def</ModuleDefinitionFile> + <EmbedManagedResourceFile>libusb-1.0.rc;%(EmbedManagedResourceFile)</EmbedManagedResourceFile> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <Midl> + <TargetEnvironment>X64</TargetEnvironment> + </Midl> + <ClCompile> + <Optimization>Disabled</Optimization> + <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_WIN32;USE_USBDK;_WIN64;_DEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> + <WarningLevel>Level4</WarningLevel> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + </ClCompile> + <Link> + <OutputFile>$(OutDir)libusb-usbdk-1.0.dll</OutputFile> + <ModuleDefinitionFile>..\libusb\libusb-1.0.def</ModuleDefinitionFile> + <EmbedManagedResourceFile>libusb-1.0.rc;%(EmbedManagedResourceFile)</EmbedManagedResourceFile> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_WIN32;USE_USBDK;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <OutputFile>$(OutDir)libusb-usbdk-1.0.dll</OutputFile> + <ModuleDefinitionFile>..\libusb\libusb-1.0.def</ModuleDefinitionFile> + <EmbedManagedResourceFile>libusb-1.0.rc;%(EmbedManagedResourceFile)</EmbedManagedResourceFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <Midl> + <TargetEnvironment>X64</TargetEnvironment> + </Midl> + <ClCompile> + <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_WIN32;USE_USBDK;_WIN64;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <OutputFile>$(OutDir)libusb-usbdk-1.0.dll</OutputFile> + <ModuleDefinitionFile>..\libusb\libusb-1.0.def</ModuleDefinitionFile> + <EmbedManagedResourceFile>libusb-1.0.rc;%(EmbedManagedResourceFile)</EmbedManagedResourceFile> + </Link> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="..\libusb\core.c" /> + <ClCompile Include="..\libusb\descriptor.c" /> + <ClCompile Include="..\libusb\hotplug.c" /> + <ClCompile Include="..\libusb\io.c" /> + <ClCompile Include="..\libusb\os\poll_windows.c" /> + <ClCompile Include="..\libusb\os\windows_nt_common.c" /> + <ClCompile Include="..\libusb\os\windows_usbdk.c" /> + <ClCompile Include="..\libusb\strerror.c" /> + <ClCompile Include="..\libusb\sync.c" /> + <ClCompile Include="..\libusb\os\threads_windows.c" /> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\libusb\hotplug.h" /> + <ClInclude Include="..\libusb\os\windows_common.h" /> + <ClInclude Include="..\libusb\os\windows_nt_common.h" /> + <ClInclude Include="..\libusb\os\windows_usbdk.h" /> + <ClInclude Include="..\libusb\version.h" /> + <ClInclude Include="..\libusb\version_nano.h" /> + <ClInclude Include=".\config.h" /> + <ClInclude Include="..\libusb\libusb.h" /> + <ClInclude Include="..\libusb\libusbi.h" /> + <ClInclude Include="..\libusb\os\poll_windows.h" /> + <ClInclude Include="..\libusb\os\threads_windows.h" /> + </ItemGroup> + <ItemGroup> + <None Include="..\libusb\libusb-1.0.def" /> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\libusb\libusb-1.0.rc" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/msvc/libusb_usbdk_static_2013.vcxproj b/msvc/libusb_usbdk_static_2013.vcxproj new file mode 100644 index 0000000..19a308c --- /dev/null +++ b/msvc/libusb_usbdk_static_2013.vcxproj @@ -0,0 +1,162 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectName>libusb-usbdk-1.0 (static)</ProjectName> + <ProjectGuid>{0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}</ProjectGuid> + <RootNamespace>libusb</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PlatformToolset>v120</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <PlatformToolset>v120</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PlatformToolset>v120</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <PlatformToolset>v120</PlatformToolset> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup> + <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\$(Platform)\$(Configuration)\lib\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\$(Platform)\$(Configuration)\lib\libusb-usbdk-1.0\</IntDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\$(Platform)\$(Configuration)\lib\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\$(Platform)\$(Configuration)\lib\libusb-usbdk-1.0\</IntDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\$(Platform)\$(Configuration)\lib\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\$(Platform)\$(Configuration)\lib\libusb-usbdk-1.0\</IntDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\$(Platform)\$(Configuration)\lib\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\$(Platform)\$(Configuration)\lib\libusb-usbdk-1.0\</IntDir> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">libusb-usbdk-1.0</TargetName> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">libusb-usbdk-1.0</TargetName> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">libusb-usbdk-1.0</TargetName> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">libusb-usbdk-1.0</TargetName> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <Optimization>Disabled</Optimization> + <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_WIN32;USE_USBDK;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <WarningLevel>Level4</WarningLevel> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + </ClCompile> + <Lib> + <OutputFile>$(OutDir)libusb-usbdk-1.0.lib</OutputFile> + </Lib> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <Midl> + <TargetEnvironment>X64</TargetEnvironment> + </Midl> + <ClCompile> + <Optimization>Disabled</Optimization> + <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_WIN32;USE_USBDK;_WIN64;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <WarningLevel>Level4</WarningLevel> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + </ClCompile> + <Lib> + <OutputFile>$(OutDir)libusb-usbdk-1.0.lib</OutputFile> + </Lib> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_WIN32;USE_USBDK;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Lib> + <OutputFile>$(OutDir)libusb-usbdk-1.0.lib</OutputFile> + </Lib> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <Midl> + <TargetEnvironment>X64</TargetEnvironment> + </Midl> + <ClCompile> + <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_WIN32;USE_USBDK;_WIN64;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Lib> + <OutputFile>$(OutDir)libusb-usbdk-1.0.lib</OutputFile> + </Lib> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="..\libusb\core.c" /> + <ClCompile Include="..\libusb\descriptor.c" /> + <ClCompile Include="..\libusb\hotplug.c" /> + <ClCompile Include="..\libusb\io.c" /> + <ClCompile Include="..\libusb\os\poll_windows.c" /> + <ClCompile Include="..\libusb\os\windows_nt_common.c" /> + <ClCompile Include="..\libusb\os\windows_usbdk.c" /> + <ClCompile Include="..\libusb\strerror.c" /> + <ClCompile Include="..\libusb\sync.c" /> + <ClCompile Include="..\libusb\os\threads_windows.c" /> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\libusb\hotplug.h" /> + <ClInclude Include="..\libusb\os\windows_nt_common.h" /> + <ClInclude Include="..\libusb\os\windows_usbdk.h" /> + <ClInclude Include="..\libusb\version.h" /> + <ClInclude Include="..\libusb\version_nano.h" /> + <ClInclude Include=".\config.h" /> + <ClInclude Include="..\libusb\libusb.h" /> + <ClInclude Include="..\libusb\libusbi.h" /> + <ClInclude Include="..\libusb\os\poll_windows.h" /> + <ClInclude Include="..\libusb\os\threads_windows.h" /> + <ClInclude Include="..\libusb\os\windows_common.h" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file -- 2.4.3 |
From: Chris D. <chr...@gm...> - 2015-12-17 09:23:38
|
Hi Dmitry, Just wanted to let you know that I am actively reviewing this latest series as time allows. I think we'll need one final revision and we'll be ready to go. I'll provide final comments in the coming days. As soon as this is integrated I would like to get the process started on a 1.0.21 release. Thanks again for your work on this! Regards, Chris On Sun, Dec 6, 2015 at 7:11 AM, Dmitry Fleytman <dm...@da...> wrote: > Hello libusb-devel, > > Following is the next version of UsbDk backend patches. > The same patches are also available at https://github.com/dmitryfleytman/libusb/tree/usbdk-backend-v5 > > Thanks, > Dmitry > > ===================================================================================== > Changes since v4: > > 1. Rebased to the latest master > 2. Patch set reorganised, some functions renamed as suggested by Chris > > Changes since v3: > > 1. Added processing of USBD errors supplied by UsbDk > > Changes since v2: > > 1. UsbDk clear_halt callback implementation fixed > > Changes since v1: > > 1. Project files for Visual Studio 2013 added > 2. DDK/WDK build files updated to support builds with UsbDk backend > 3. File names changed as agreed (windows_usb.* -> windows_winusb.*) > 4. Function names in windows_nt_common.c changed as areed ("nt" dropped) > 5. UsbDk headers merged as agreed, no subfolder, one file only (windows_usbdk.h) > 6. Build tested and fixed for different MinGW versions > > Adding dynamic backend selection for UsbDk/libusb*/WinUsb configuration turned out > to be too tricky for a number of reasons, so we would like to postpone this feature > for now and return to it later along with support for attach/detach mode. > > We will also release a new usbDk version in a few days with support for persistent > hide rules feature as suggested on this list before. > > ===================================================================================== > > This series contains patches that extend Windows backend to support UsbDk. > Switch between UsbDk and WinUSB/LibusbK/Libusb0 is done at compile time > with --enable-usbdk configuration option (off by default). > > UsbDk (USB Development Kit) is a set of software components meant to provide > Windows user mode applications with direct and exclusive access to USB devices. > > Some distinctive UsbDk properties are: > > 1. UsbDk supports all types of devices and interfaces - bulk, isochronous, > composite, HID etc. > 2. Device capture process is totally dynamic, i.e. no inf files and > self-signing needed, any device can be captured. > 3. UsbDk co-exists with original device driver, when the device is not > captured original driver is loaded by the system automatically. > 4. If user mode client terminates unexpectedly for any reason system reverts > to original device driver immediately. > 5. Being USB filter driver UsbDk doesn't require WHQL-ing > as per Microsoft requirements. > > UsbDk supports all Windows OS versions staring from Windows XP, > i.e. XP/Vista/7/8/8.1/2003/2008/2008R2/2012/2012R2. > Both 32 and 64 bit architectures are supported. > > UsbDk is fully open source and distributed under Apache 2.0 license. > > UsbDk project is hosted at spice-space.org, source code repository available at: > http://cgit.freedesktop.org/spice/win32/usbdk > > Latest source tarball is at: http://www.spice-space.org/download/windows/usbdk/spice-usbdk-win-1.0-2-sources.zip > > UsbDk releases come with precompiled and signed by Red Hat binaries: > 1. 32 bit: http://www.spice-space.org/download/windows/usbdk/UsbDk_1.0.8_x86.msi > 2. 64 bit: http://www.spice-space.org/download/windows/usbdk/UsbDk_1.0.8_x64.msi > > UsbDk documentation: > 1. Short presentation: http://www.spice-space.org/docs/usbdk/UsbDk_at_a_Glance.pdf > 2. SDM: http://www.spice-space.org/docs/usbdk/UsbDk_Software_Development_Manual.pdf > 3. UsbDk architecture specificatin (part of source tree): > http://cgit.freedesktop.org/spice/win32/usbdk/tree/ARCHITECTURE > > UsbDk is maintained by Dmitry Fleytman (dm...@da...). > I'll be glad to answer your questions sent to me directly or via this mailing list. > > What do you think about this series? > We will be glad to have it accepted into libusb upstream. > > Best Regards, > Dmitry > > Dmitry Fleytman (4): > windows: Move common definitions to a separate file > windows: Rename windows_usb.h/c windows_winusb.h/c > usbdk: Introduce usbdk backend > build: Integrate usbdk backend > > configure.ac | 9 + > libusb/Makefile.am | 16 +- > libusb/core.c | 6 + > libusb/libusbi.h | 1 + > libusb/os/windows_nt_common.c | 581 ++++ > libusb/os/windows_nt_common.h | 73 + > libusb/os/windows_usb.c | 4645 ------------------------------- > libusb/os/windows_usb.h | 973 ------- > libusb/os/windows_usbdk.c | 958 +++++++ > libusb/os/windows_usbdk.h | 126 + > libusb/os/windows_winusb.c | 4149 +++++++++++++++++++++++++++ > libusb/os/windows_winusb.h | 947 +++++++ > msvc/ddk_build.cmd | 9 + > msvc/libusb_2013.sln | 20 + > msvc/libusb_dll.dsp | 4 +- > msvc/libusb_dll_2005.vcproj | 4 +- > msvc/libusb_dll_2010.vcxproj | 4 +- > msvc/libusb_dll_2010.vcxproj.filters | 4 +- > msvc/libusb_dll_2012.vcxproj | 4 +- > msvc/libusb_dll_2012.vcxproj.filters | 4 +- > msvc/libusb_dll_2013.vcxproj | 6 +- > msvc/libusb_sources | 10 +- > msvc/libusb_static.dsp | 4 +- > msvc/libusb_static_2005.vcproj | 4 +- > msvc/libusb_static_2010.vcxproj | 4 +- > msvc/libusb_static_2010.vcxproj.filters | 4 +- > msvc/libusb_static_2012.vcxproj | 4 +- > msvc/libusb_static_2012.vcxproj.filters | 4 +- > msvc/libusb_static_2013.vcxproj | 6 +- > msvc/libusb_usbdk_dll_2013.vcxproj | 178 ++ > msvc/libusb_usbdk_static_2013.vcxproj | 162 ++ > 31 files changed, 7271 insertions(+), 5652 deletions(-) > create mode 100644 libusb/os/windows_nt_common.c > create mode 100644 libusb/os/windows_nt_common.h > delete mode 100644 libusb/os/windows_usb.c > delete mode 100644 libusb/os/windows_usb.h > create mode 100644 libusb/os/windows_usbdk.c > create mode 100644 libusb/os/windows_usbdk.h > create mode 100644 libusb/os/windows_winusb.c > create mode 100644 libusb/os/windows_winusb.h > create mode 100644 msvc/libusb_usbdk_dll_2013.vcxproj > create mode 100644 msvc/libusb_usbdk_static_2013.vcxproj > > -- > 2.4.3 > |
From: Dmitry F. <dm...@da...> - 2015-12-17 12:18:11
|
> On 17 Dec 2015, at 11:23 AM, Chris Dickens <chr...@gm...> wrote: > > Hi Dmitry, > > Just wanted to let you know that I am actively reviewing this latest > series as time allows. I think we'll need one final revision and we'll > be ready to go. I'll provide final comments in the coming days. Great news! I’m waiting for your comments. > > As soon as this is integrated I would like to get the process started > on a 1.0.21 release. Thanks again for your work on this! > Thanks for the update, Chris. > Regards, > Chris > > On Sun, Dec 6, 2015 at 7:11 AM, Dmitry Fleytman <dm...@da...> wrote: >> Hello libusb-devel, >> >> Following is the next version of UsbDk backend patches. >> The same patches are also available at https://github.com/dmitryfleytman/libusb/tree/usbdk-backend-v5 >> >> Thanks, >> Dmitry >> >> ===================================================================================== >> Changes since v4: >> >> 1. Rebased to the latest master >> 2. Patch set reorganised, some functions renamed as suggested by Chris >> >> Changes since v3: >> >> 1. Added processing of USBD errors supplied by UsbDk >> >> Changes since v2: >> >> 1. UsbDk clear_halt callback implementation fixed >> >> Changes since v1: >> >> 1. Project files for Visual Studio 2013 added >> 2. DDK/WDK build files updated to support builds with UsbDk backend >> 3. File names changed as agreed (windows_usb.* -> windows_winusb.*) >> 4. Function names in windows_nt_common.c changed as areed ("nt" dropped) >> 5. UsbDk headers merged as agreed, no subfolder, one file only (windows_usbdk.h) >> 6. Build tested and fixed for different MinGW versions >> >> Adding dynamic backend selection for UsbDk/libusb*/WinUsb configuration turned out >> to be too tricky for a number of reasons, so we would like to postpone this feature >> for now and return to it later along with support for attach/detach mode. >> >> We will also release a new usbDk version in a few days with support for persistent >> hide rules feature as suggested on this list before. >> >> ===================================================================================== >> >> This series contains patches that extend Windows backend to support UsbDk. >> Switch between UsbDk and WinUSB/LibusbK/Libusb0 is done at compile time >> with --enable-usbdk configuration option (off by default). >> >> UsbDk (USB Development Kit) is a set of software components meant to provide >> Windows user mode applications with direct and exclusive access to USB devices. >> >> Some distinctive UsbDk properties are: >> >> 1. UsbDk supports all types of devices and interfaces - bulk, isochronous, >> composite, HID etc. >> 2. Device capture process is totally dynamic, i.e. no inf files and >> self-signing needed, any device can be captured. >> 3. UsbDk co-exists with original device driver, when the device is not >> captured original driver is loaded by the system automatically. >> 4. If user mode client terminates unexpectedly for any reason system reverts >> to original device driver immediately. >> 5. Being USB filter driver UsbDk doesn't require WHQL-ing >> as per Microsoft requirements. >> >> UsbDk supports all Windows OS versions staring from Windows XP, >> i.e. XP/Vista/7/8/8.1/2003/2008/2008R2/2012/2012R2. >> Both 32 and 64 bit architectures are supported. >> >> UsbDk is fully open source and distributed under Apache 2.0 license. >> >> UsbDk project is hosted at spice-space.org, source code repository available at: >> http://cgit.freedesktop.org/spice/win32/usbdk >> >> Latest source tarball is at: http://www.spice-space.org/download/windows/usbdk/spice-usbdk-win-1.0-2-sources.zip >> >> UsbDk releases come with precompiled and signed by Red Hat binaries: >> 1. 32 bit: http://www.spice-space.org/download/windows/usbdk/UsbDk_1.0.8_x86.msi >> 2. 64 bit: http://www.spice-space.org/download/windows/usbdk/UsbDk_1.0.8_x64.msi >> >> UsbDk documentation: >> 1. Short presentation: http://www.spice-space.org/docs/usbdk/UsbDk_at_a_Glance.pdf >> 2. SDM: http://www.spice-space.org/docs/usbdk/UsbDk_Software_Development_Manual.pdf >> 3. UsbDk architecture specificatin (part of source tree): >> http://cgit.freedesktop.org/spice/win32/usbdk/tree/ARCHITECTURE >> >> UsbDk is maintained by Dmitry Fleytman (dm...@da...). >> I'll be glad to answer your questions sent to me directly or via this mailing list. >> >> What do you think about this series? >> We will be glad to have it accepted into libusb upstream. >> >> Best Regards, >> Dmitry >> >> Dmitry Fleytman (4): >> windows: Move common definitions to a separate file >> windows: Rename windows_usb.h/c windows_winusb.h/c >> usbdk: Introduce usbdk backend >> build: Integrate usbdk backend >> >> configure.ac | 9 + >> libusb/Makefile.am | 16 +- >> libusb/core.c | 6 + >> libusb/libusbi.h | 1 + >> libusb/os/windows_nt_common.c | 581 ++++ >> libusb/os/windows_nt_common.h | 73 + >> libusb/os/windows_usb.c | 4645 ------------------------------- >> libusb/os/windows_usb.h | 973 ------- >> libusb/os/windows_usbdk.c | 958 +++++++ >> libusb/os/windows_usbdk.h | 126 + >> libusb/os/windows_winusb.c | 4149 +++++++++++++++++++++++++++ >> libusb/os/windows_winusb.h | 947 +++++++ >> msvc/ddk_build.cmd | 9 + >> msvc/libusb_2013.sln | 20 + >> msvc/libusb_dll.dsp | 4 +- >> msvc/libusb_dll_2005.vcproj | 4 +- >> msvc/libusb_dll_2010.vcxproj | 4 +- >> msvc/libusb_dll_2010.vcxproj.filters | 4 +- >> msvc/libusb_dll_2012.vcxproj | 4 +- >> msvc/libusb_dll_2012.vcxproj.filters | 4 +- >> msvc/libusb_dll_2013.vcxproj | 6 +- >> msvc/libusb_sources | 10 +- >> msvc/libusb_static.dsp | 4 +- >> msvc/libusb_static_2005.vcproj | 4 +- >> msvc/libusb_static_2010.vcxproj | 4 +- >> msvc/libusb_static_2010.vcxproj.filters | 4 +- >> msvc/libusb_static_2012.vcxproj | 4 +- >> msvc/libusb_static_2012.vcxproj.filters | 4 +- >> msvc/libusb_static_2013.vcxproj | 6 +- >> msvc/libusb_usbdk_dll_2013.vcxproj | 178 ++ >> msvc/libusb_usbdk_static_2013.vcxproj | 162 ++ >> 31 files changed, 7271 insertions(+), 5652 deletions(-) >> create mode 100644 libusb/os/windows_nt_common.c >> create mode 100644 libusb/os/windows_nt_common.h >> delete mode 100644 libusb/os/windows_usb.c >> delete mode 100644 libusb/os/windows_usb.h >> create mode 100644 libusb/os/windows_usbdk.c >> create mode 100644 libusb/os/windows_usbdk.h >> create mode 100644 libusb/os/windows_winusb.c >> create mode 100644 libusb/os/windows_winusb.h >> create mode 100644 msvc/libusb_usbdk_dll_2013.vcxproj >> create mode 100644 msvc/libusb_usbdk_static_2013.vcxproj >> >> -- >> 2.4.3 >> |
From: Dmitry F. <dm...@da...> - 2016-01-14 12:49:43
|
Hi Chris, Do you have any news w.r.t. the patches? May I help you somehow? Thanks, Dmitry > On 17 Dec 2015, at 14:17 PM, Dmitry Fleytman <dm...@da...> wrote: > > >> On 17 Dec 2015, at 11:23 AM, Chris Dickens <chr...@gm...> wrote: >> >> Hi Dmitry, >> >> Just wanted to let you know that I am actively reviewing this latest >> series as time allows. I think we'll need one final revision and we'll >> be ready to go. I'll provide final comments in the coming days. > > Great news! I’m waiting for your comments. > >> >> As soon as this is integrated I would like to get the process started >> on a 1.0.21 release. Thanks again for your work on this! >> > > Thanks for the update, Chris. > >> Regards, >> Chris >> >> On Sun, Dec 6, 2015 at 7:11 AM, Dmitry Fleytman <dm...@da...> wrote: >>> Hello libusb-devel, >>> >>> Following is the next version of UsbDk backend patches. >>> The same patches are also available at https://github.com/dmitryfleytman/libusb/tree/usbdk-backend-v5 >>> >>> Thanks, >>> Dmitry >>> >>> ===================================================================================== >>> Changes since v4: >>> >>> 1. Rebased to the latest master >>> 2. Patch set reorganised, some functions renamed as suggested by Chris >>> >>> Changes since v3: >>> >>> 1. Added processing of USBD errors supplied by UsbDk >>> >>> Changes since v2: >>> >>> 1. UsbDk clear_halt callback implementation fixed >>> >>> Changes since v1: >>> >>> 1. Project files for Visual Studio 2013 added >>> 2. DDK/WDK build files updated to support builds with UsbDk backend >>> 3. File names changed as agreed (windows_usb.* -> windows_winusb.*) >>> 4. Function names in windows_nt_common.c changed as areed ("nt" dropped) >>> 5. UsbDk headers merged as agreed, no subfolder, one file only (windows_usbdk.h) >>> 6. Build tested and fixed for different MinGW versions >>> >>> Adding dynamic backend selection for UsbDk/libusb*/WinUsb configuration turned out >>> to be too tricky for a number of reasons, so we would like to postpone this feature >>> for now and return to it later along with support for attach/detach mode. >>> >>> We will also release a new usbDk version in a few days with support for persistent >>> hide rules feature as suggested on this list before. >>> >>> ===================================================================================== >>> >>> This series contains patches that extend Windows backend to support UsbDk. >>> Switch between UsbDk and WinUSB/LibusbK/Libusb0 is done at compile time >>> with --enable-usbdk configuration option (off by default). >>> >>> UsbDk (USB Development Kit) is a set of software components meant to provide >>> Windows user mode applications with direct and exclusive access to USB devices. >>> >>> Some distinctive UsbDk properties are: >>> >>> 1. UsbDk supports all types of devices and interfaces - bulk, isochronous, >>> composite, HID etc. >>> 2. Device capture process is totally dynamic, i.e. no inf files and >>> self-signing needed, any device can be captured. >>> 3. UsbDk co-exists with original device driver, when the device is not >>> captured original driver is loaded by the system automatically. >>> 4. If user mode client terminates unexpectedly for any reason system reverts >>> to original device driver immediately. >>> 5. Being USB filter driver UsbDk doesn't require WHQL-ing >>> as per Microsoft requirements. >>> >>> UsbDk supports all Windows OS versions staring from Windows XP, >>> i.e. XP/Vista/7/8/8.1/2003/2008/2008R2/2012/2012R2. >>> Both 32 and 64 bit architectures are supported. >>> >>> UsbDk is fully open source and distributed under Apache 2.0 license. >>> >>> UsbDk project is hosted at spice-space.org, source code repository available at: >>> http://cgit.freedesktop.org/spice/win32/usbdk >>> >>> Latest source tarball is at: http://www.spice-space.org/download/windows/usbdk/spice-usbdk-win-1.0-2-sources.zip >>> >>> UsbDk releases come with precompiled and signed by Red Hat binaries: >>> 1. 32 bit: http://www.spice-space.org/download/windows/usbdk/UsbDk_1.0.8_x86.msi >>> 2. 64 bit: http://www.spice-space.org/download/windows/usbdk/UsbDk_1.0.8_x64.msi >>> >>> UsbDk documentation: >>> 1. Short presentation: http://www.spice-space.org/docs/usbdk/UsbDk_at_a_Glance.pdf >>> 2. SDM: http://www.spice-space.org/docs/usbdk/UsbDk_Software_Development_Manual.pdf >>> 3. UsbDk architecture specificatin (part of source tree): >>> http://cgit.freedesktop.org/spice/win32/usbdk/tree/ARCHITECTURE >>> >>> UsbDk is maintained by Dmitry Fleytman (dm...@da...). >>> I'll be glad to answer your questions sent to me directly or via this mailing list. >>> >>> What do you think about this series? >>> We will be glad to have it accepted into libusb upstream. >>> >>> Best Regards, >>> Dmitry >>> >>> Dmitry Fleytman (4): >>> windows: Move common definitions to a separate file >>> windows: Rename windows_usb.h/c windows_winusb.h/c >>> usbdk: Introduce usbdk backend >>> build: Integrate usbdk backend >>> >>> configure.ac | 9 + >>> libusb/Makefile.am | 16 +- >>> libusb/core.c | 6 + >>> libusb/libusbi.h | 1 + >>> libusb/os/windows_nt_common.c | 581 ++++ >>> libusb/os/windows_nt_common.h | 73 + >>> libusb/os/windows_usb.c | 4645 ------------------------------- >>> libusb/os/windows_usb.h | 973 ------- >>> libusb/os/windows_usbdk.c | 958 +++++++ >>> libusb/os/windows_usbdk.h | 126 + >>> libusb/os/windows_winusb.c | 4149 +++++++++++++++++++++++++++ >>> libusb/os/windows_winusb.h | 947 +++++++ >>> msvc/ddk_build.cmd | 9 + >>> msvc/libusb_2013.sln | 20 + >>> msvc/libusb_dll.dsp | 4 +- >>> msvc/libusb_dll_2005.vcproj | 4 +- >>> msvc/libusb_dll_2010.vcxproj | 4 +- >>> msvc/libusb_dll_2010.vcxproj.filters | 4 +- >>> msvc/libusb_dll_2012.vcxproj | 4 +- >>> msvc/libusb_dll_2012.vcxproj.filters | 4 +- >>> msvc/libusb_dll_2013.vcxproj | 6 +- >>> msvc/libusb_sources | 10 +- >>> msvc/libusb_static.dsp | 4 +- >>> msvc/libusb_static_2005.vcproj | 4 +- >>> msvc/libusb_static_2010.vcxproj | 4 +- >>> msvc/libusb_static_2010.vcxproj.filters | 4 +- >>> msvc/libusb_static_2012.vcxproj | 4 +- >>> msvc/libusb_static_2012.vcxproj.filters | 4 +- >>> msvc/libusb_static_2013.vcxproj | 6 +- >>> msvc/libusb_usbdk_dll_2013.vcxproj | 178 ++ >>> msvc/libusb_usbdk_static_2013.vcxproj | 162 ++ >>> 31 files changed, 7271 insertions(+), 5652 deletions(-) >>> create mode 100644 libusb/os/windows_nt_common.c >>> create mode 100644 libusb/os/windows_nt_common.h >>> delete mode 100644 libusb/os/windows_usb.c >>> delete mode 100644 libusb/os/windows_usb.h >>> create mode 100644 libusb/os/windows_usbdk.c >>> create mode 100644 libusb/os/windows_usbdk.h >>> create mode 100644 libusb/os/windows_winusb.c >>> create mode 100644 libusb/os/windows_winusb.h >>> create mode 100644 msvc/libusb_usbdk_dll_2013.vcxproj >>> create mode 100644 msvc/libusb_usbdk_static_2013.vcxproj >>> >>> -- >>> 2.4.3 >>> > |
From: Chris D. <chr...@gm...> - 2016-01-16 07:39:52
|
Hi Dmitry, Looks like there are still a few things: 1) Since we are moving common things out, I'd prefer just a single function for init/exit (e.g. windows_common_init(ctx)/windows_common_exit(ctx)). These will initialize/tear down both the hash table and timer constructs, so we can subsequently remove the htab_init()/htab_destroy() and timer_init()/timer_destroy() declarations from the windows_nt_common.h header (and make the actual functions static). 2) The functions relating to event handling are still prefixed with "win_" instead of "windows_". Please change these. 3) The windows_nt_common.h header defines things that are not used outside of the source file. Please remove the following and place in the source file as appropriate: epoch_time, WM_TIMER_* defines, struct timer_request definition. Note that epoch_time is used in threads_windows.c through an extern declaration (not via including windows_nt_common.h) so do not make epoch_time static inside windows_nt_common.c. I'm not too crazy about how the "common" code calls in to functions defined in the backend, but I don't know that there is a good alternative... Thanks again for your efforts! Regards, Chris On Thu, Jan 14, 2016 at 4:49 AM, Dmitry Fleytman <dm...@da...> wrote: > Hi Chris, > > Do you have any news w.r.t. the patches? May I help you somehow? > > Thanks, > Dmitry > >> On 17 Dec 2015, at 14:17 PM, Dmitry Fleytman <dm...@da...> wrote: >> >> >>> On 17 Dec 2015, at 11:23 AM, Chris Dickens <chr...@gm...> wrote: >>> >>> Hi Dmitry, >>> >>> Just wanted to let you know that I am actively reviewing this latest >>> series as time allows. I think we'll need one final revision and we'll >>> be ready to go. I'll provide final comments in the coming days. >> >> Great news! I’m waiting for your comments. >> >>> >>> As soon as this is integrated I would like to get the process started >>> on a 1.0.21 release. Thanks again for your work on this! >>> >> >> Thanks for the update, Chris. >> >>> Regards, >>> Chris >>> >>> On Sun, Dec 6, 2015 at 7:11 AM, Dmitry Fleytman <dm...@da...> wrote: >>>> Hello libusb-devel, >>>> >>>> Following is the next version of UsbDk backend patches. >>>> The same patches are also available at https://github.com/dmitryfleytman/libusb/tree/usbdk-backend-v5 >>>> >>>> Thanks, >>>> Dmitry >>>> >>>> ===================================================================================== >>>> Changes since v4: >>>> >>>> 1. Rebased to the latest master >>>> 2. Patch set reorganised, some functions renamed as suggested by Chris >>>> >>>> Changes since v3: >>>> >>>> 1. Added processing of USBD errors supplied by UsbDk >>>> >>>> Changes since v2: >>>> >>>> 1. UsbDk clear_halt callback implementation fixed >>>> >>>> Changes since v1: >>>> >>>> 1. Project files for Visual Studio 2013 added >>>> 2. DDK/WDK build files updated to support builds with UsbDk backend >>>> 3. File names changed as agreed (windows_usb.* -> windows_winusb.*) >>>> 4. Function names in windows_nt_common.c changed as areed ("nt" dropped) >>>> 5. UsbDk headers merged as agreed, no subfolder, one file only (windows_usbdk.h) >>>> 6. Build tested and fixed for different MinGW versions >>>> >>>> Adding dynamic backend selection for UsbDk/libusb*/WinUsb configuration turned out >>>> to be too tricky for a number of reasons, so we would like to postpone this feature >>>> for now and return to it later along with support for attach/detach mode. >>>> >>>> We will also release a new usbDk version in a few days with support for persistent >>>> hide rules feature as suggested on this list before. >>>> >>>> ===================================================================================== >>>> >>>> This series contains patches that extend Windows backend to support UsbDk. >>>> Switch between UsbDk and WinUSB/LibusbK/Libusb0 is done at compile time >>>> with --enable-usbdk configuration option (off by default). >>>> >>>> UsbDk (USB Development Kit) is a set of software components meant to provide >>>> Windows user mode applications with direct and exclusive access to USB devices. >>>> >>>> Some distinctive UsbDk properties are: >>>> >>>> 1. UsbDk supports all types of devices and interfaces - bulk, isochronous, >>>> composite, HID etc. >>>> 2. Device capture process is totally dynamic, i.e. no inf files and >>>> self-signing needed, any device can be captured. >>>> 3. UsbDk co-exists with original device driver, when the device is not >>>> captured original driver is loaded by the system automatically. >>>> 4. If user mode client terminates unexpectedly for any reason system reverts >>>> to original device driver immediately. >>>> 5. Being USB filter driver UsbDk doesn't require WHQL-ing >>>> as per Microsoft requirements. >>>> >>>> UsbDk supports all Windows OS versions staring from Windows XP, >>>> i.e. XP/Vista/7/8/8.1/2003/2008/2008R2/2012/2012R2. >>>> Both 32 and 64 bit architectures are supported. >>>> >>>> UsbDk is fully open source and distributed under Apache 2.0 license. >>>> >>>> UsbDk project is hosted at spice-space.org, source code repository available at: >>>> http://cgit.freedesktop.org/spice/win32/usbdk >>>> >>>> Latest source tarball is at: http://www.spice-space.org/download/windows/usbdk/spice-usbdk-win-1.0-2-sources.zip >>>> >>>> UsbDk releases come with precompiled and signed by Red Hat binaries: >>>> 1. 32 bit: http://www.spice-space.org/download/windows/usbdk/UsbDk_1.0.8_x86.msi >>>> 2. 64 bit: http://www.spice-space.org/download/windows/usbdk/UsbDk_1.0.8_x64.msi >>>> >>>> UsbDk documentation: >>>> 1. Short presentation: http://www.spice-space.org/docs/usbdk/UsbDk_at_a_Glance.pdf >>>> 2. SDM: http://www.spice-space.org/docs/usbdk/UsbDk_Software_Development_Manual.pdf >>>> 3. UsbDk architecture specificatin (part of source tree): >>>> http://cgit.freedesktop.org/spice/win32/usbdk/tree/ARCHITECTURE >>>> >>>> UsbDk is maintained by Dmitry Fleytman (dm...@da...). >>>> I'll be glad to answer your questions sent to me directly or via this mailing list. >>>> >>>> What do you think about this series? >>>> We will be glad to have it accepted into libusb upstream. >>>> >>>> Best Regards, >>>> Dmitry >>>> >>>> Dmitry Fleytman (4): >>>> windows: Move common definitions to a separate file >>>> windows: Rename windows_usb.h/c windows_winusb.h/c >>>> usbdk: Introduce usbdk backend >>>> build: Integrate usbdk backend >>>> >>>> configure.ac | 9 + >>>> libusb/Makefile.am | 16 +- >>>> libusb/core.c | 6 + >>>> libusb/libusbi.h | 1 + >>>> libusb/os/windows_nt_common.c | 581 ++++ >>>> libusb/os/windows_nt_common.h | 73 + >>>> libusb/os/windows_usb.c | 4645 ------------------------------- >>>> libusb/os/windows_usb.h | 973 ------- >>>> libusb/os/windows_usbdk.c | 958 +++++++ >>>> libusb/os/windows_usbdk.h | 126 + >>>> libusb/os/windows_winusb.c | 4149 +++++++++++++++++++++++++++ >>>> libusb/os/windows_winusb.h | 947 +++++++ >>>> msvc/ddk_build.cmd | 9 + >>>> msvc/libusb_2013.sln | 20 + >>>> msvc/libusb_dll.dsp | 4 +- >>>> msvc/libusb_dll_2005.vcproj | 4 +- >>>> msvc/libusb_dll_2010.vcxproj | 4 +- >>>> msvc/libusb_dll_2010.vcxproj.filters | 4 +- >>>> msvc/libusb_dll_2012.vcxproj | 4 +- >>>> msvc/libusb_dll_2012.vcxproj.filters | 4 +- >>>> msvc/libusb_dll_2013.vcxproj | 6 +- >>>> msvc/libusb_sources | 10 +- >>>> msvc/libusb_static.dsp | 4 +- >>>> msvc/libusb_static_2005.vcproj | 4 +- >>>> msvc/libusb_static_2010.vcxproj | 4 +- >>>> msvc/libusb_static_2010.vcxproj.filters | 4 +- >>>> msvc/libusb_static_2012.vcxproj | 4 +- >>>> msvc/libusb_static_2012.vcxproj.filters | 4 +- >>>> msvc/libusb_static_2013.vcxproj | 6 +- >>>> msvc/libusb_usbdk_dll_2013.vcxproj | 178 ++ >>>> msvc/libusb_usbdk_static_2013.vcxproj | 162 ++ >>>> 31 files changed, 7271 insertions(+), 5652 deletions(-) >>>> create mode 100644 libusb/os/windows_nt_common.c >>>> create mode 100644 libusb/os/windows_nt_common.h >>>> delete mode 100644 libusb/os/windows_usb.c >>>> delete mode 100644 libusb/os/windows_usb.h >>>> create mode 100644 libusb/os/windows_usbdk.c >>>> create mode 100644 libusb/os/windows_usbdk.h >>>> create mode 100644 libusb/os/windows_winusb.c >>>> create mode 100644 libusb/os/windows_winusb.h >>>> create mode 100644 msvc/libusb_usbdk_dll_2013.vcxproj >>>> create mode 100644 msvc/libusb_usbdk_static_2013.vcxproj >>>> >>>> -- >>>> 2.4.3 >>>> >> > |
From: Dmitry F. <dm...@da...> - 2016-01-20 15:11:12
|
Hi Chris, I just changed everything according to your recommendations and sent v6 series. Please let me know if I can help you with anything else. Thanks, Dmitry > On 16 Jan 2016, at 09:39 AM, Chris Dickens <chr...@gm...> wrote: > > Hi Dmitry, > > Looks like there are still a few things: > > 1) Since we are moving common things out, I'd prefer just a single > function for init/exit (e.g. > windows_common_init(ctx)/windows_common_exit(ctx)). These will > initialize/tear down both the hash table and timer constructs, so we > can subsequently remove the htab_init()/htab_destroy() and > timer_init()/timer_destroy() declarations from the windows_nt_common.h > header (and make the actual functions static). > 2) The functions relating to event handling are still prefixed with > "win_" instead of "windows_". Please change these. > 3) The windows_nt_common.h header defines things that are not used > outside of the source file. Please remove the following and place in > the source file as appropriate: epoch_time, WM_TIMER_* defines, struct > timer_request definition. Note that epoch_time is used in > threads_windows.c through an extern declaration (not via including > windows_nt_common.h) so do not make epoch_time static inside > windows_nt_common.c. > > I'm not too crazy about how the "common" code calls in to functions > defined in the backend, but I don't know that there is a good > alternative... > > Thanks again for your efforts! > > Regards, > Chris > > On Thu, Jan 14, 2016 at 4:49 AM, Dmitry Fleytman <dm...@da...> wrote: >> Hi Chris, >> >> Do you have any news w.r.t. the patches? May I help you somehow? >> >> Thanks, >> Dmitry >> >>> On 17 Dec 2015, at 14:17 PM, Dmitry Fleytman <dm...@da...> wrote: >>> >>> >>>> On 17 Dec 2015, at 11:23 AM, Chris Dickens <chr...@gm...> wrote: >>>> >>>> Hi Dmitry, >>>> >>>> Just wanted to let you know that I am actively reviewing this latest >>>> series as time allows. I think we'll need one final revision and we'll >>>> be ready to go. I'll provide final comments in the coming days. >>> >>> Great news! I’m waiting for your comments. >>> >>>> >>>> As soon as this is integrated I would like to get the process started >>>> on a 1.0.21 release. Thanks again for your work on this! >>>> >>> >>> Thanks for the update, Chris. >>> >>>> Regards, >>>> Chris >>>> >>>> On Sun, Dec 6, 2015 at 7:11 AM, Dmitry Fleytman <dm...@da...> wrote: >>>>> Hello libusb-devel, >>>>> >>>>> Following is the next version of UsbDk backend patches. >>>>> The same patches are also available at https://github.com/dmitryfleytman/libusb/tree/usbdk-backend-v5 >>>>> >>>>> Thanks, >>>>> Dmitry >>>>> >>>>> ===================================================================================== >>>>> Changes since v4: >>>>> >>>>> 1. Rebased to the latest master >>>>> 2. Patch set reorganised, some functions renamed as suggested by Chris >>>>> >>>>> Changes since v3: >>>>> >>>>> 1. Added processing of USBD errors supplied by UsbDk >>>>> >>>>> Changes since v2: >>>>> >>>>> 1. UsbDk clear_halt callback implementation fixed >>>>> >>>>> Changes since v1: >>>>> >>>>> 1. Project files for Visual Studio 2013 added >>>>> 2. DDK/WDK build files updated to support builds with UsbDk backend >>>>> 3. File names changed as agreed (windows_usb.* -> windows_winusb.*) >>>>> 4. Function names in windows_nt_common.c changed as areed ("nt" dropped) >>>>> 5. UsbDk headers merged as agreed, no subfolder, one file only (windows_usbdk.h) >>>>> 6. Build tested and fixed for different MinGW versions >>>>> >>>>> Adding dynamic backend selection for UsbDk/libusb*/WinUsb configuration turned out >>>>> to be too tricky for a number of reasons, so we would like to postpone this feature >>>>> for now and return to it later along with support for attach/detach mode. >>>>> >>>>> We will also release a new usbDk version in a few days with support for persistent >>>>> hide rules feature as suggested on this list before. >>>>> >>>>> ===================================================================================== >>>>> >>>>> This series contains patches that extend Windows backend to support UsbDk. >>>>> Switch between UsbDk and WinUSB/LibusbK/Libusb0 is done at compile time >>>>> with --enable-usbdk configuration option (off by default). >>>>> >>>>> UsbDk (USB Development Kit) is a set of software components meant to provide >>>>> Windows user mode applications with direct and exclusive access to USB devices. >>>>> >>>>> Some distinctive UsbDk properties are: >>>>> >>>>> 1. UsbDk supports all types of devices and interfaces - bulk, isochronous, >>>>> composite, HID etc. >>>>> 2. Device capture process is totally dynamic, i.e. no inf files and >>>>> self-signing needed, any device can be captured. >>>>> 3. UsbDk co-exists with original device driver, when the device is not >>>>> captured original driver is loaded by the system automatically. >>>>> 4. If user mode client terminates unexpectedly for any reason system reverts >>>>> to original device driver immediately. >>>>> 5. Being USB filter driver UsbDk doesn't require WHQL-ing >>>>> as per Microsoft requirements. >>>>> >>>>> UsbDk supports all Windows OS versions staring from Windows XP, >>>>> i.e. XP/Vista/7/8/8.1/2003/2008/2008R2/2012/2012R2. >>>>> Both 32 and 64 bit architectures are supported. >>>>> >>>>> UsbDk is fully open source and distributed under Apache 2.0 license. >>>>> >>>>> UsbDk project is hosted at spice-space.org, source code repository available at: >>>>> http://cgit.freedesktop.org/spice/win32/usbdk >>>>> >>>>> Latest source tarball is at: http://www.spice-space.org/download/windows/usbdk/spice-usbdk-win-1.0-2-sources.zip >>>>> >>>>> UsbDk releases come with precompiled and signed by Red Hat binaries: >>>>> 1. 32 bit: http://www.spice-space.org/download/windows/usbdk/UsbDk_1.0.8_x86.msi >>>>> 2. 64 bit: http://www.spice-space.org/download/windows/usbdk/UsbDk_1.0.8_x64.msi >>>>> >>>>> UsbDk documentation: >>>>> 1. Short presentation: http://www.spice-space.org/docs/usbdk/UsbDk_at_a_Glance.pdf >>>>> 2. SDM: http://www.spice-space.org/docs/usbdk/UsbDk_Software_Development_Manual.pdf >>>>> 3. UsbDk architecture specificatin (part of source tree): >>>>> http://cgit.freedesktop.org/spice/win32/usbdk/tree/ARCHITECTURE >>>>> >>>>> UsbDk is maintained by Dmitry Fleytman (dm...@da...). >>>>> I'll be glad to answer your questions sent to me directly or via this mailing list. >>>>> >>>>> What do you think about this series? >>>>> We will be glad to have it accepted into libusb upstream. >>>>> >>>>> Best Regards, >>>>> Dmitry >>>>> >>>>> Dmitry Fleytman (4): >>>>> windows: Move common definitions to a separate file >>>>> windows: Rename windows_usb.h/c windows_winusb.h/c >>>>> usbdk: Introduce usbdk backend >>>>> build: Integrate usbdk backend >>>>> >>>>> configure.ac | 9 + >>>>> libusb/Makefile.am | 16 +- >>>>> libusb/core.c | 6 + >>>>> libusb/libusbi.h | 1 + >>>>> libusb/os/windows_nt_common.c | 581 ++++ >>>>> libusb/os/windows_nt_common.h | 73 + >>>>> libusb/os/windows_usb.c | 4645 ------------------------------- >>>>> libusb/os/windows_usb.h | 973 ------- >>>>> libusb/os/windows_usbdk.c | 958 +++++++ >>>>> libusb/os/windows_usbdk.h | 126 + >>>>> libusb/os/windows_winusb.c | 4149 +++++++++++++++++++++++++++ >>>>> libusb/os/windows_winusb.h | 947 +++++++ >>>>> msvc/ddk_build.cmd | 9 + >>>>> msvc/libusb_2013.sln | 20 + >>>>> msvc/libusb_dll.dsp | 4 +- >>>>> msvc/libusb_dll_2005.vcproj | 4 +- >>>>> msvc/libusb_dll_2010.vcxproj | 4 +- >>>>> msvc/libusb_dll_2010.vcxproj.filters | 4 +- >>>>> msvc/libusb_dll_2012.vcxproj | 4 +- >>>>> msvc/libusb_dll_2012.vcxproj.filters | 4 +- >>>>> msvc/libusb_dll_2013.vcxproj | 6 +- >>>>> msvc/libusb_sources | 10 +- >>>>> msvc/libusb_static.dsp | 4 +- >>>>> msvc/libusb_static_2005.vcproj | 4 +- >>>>> msvc/libusb_static_2010.vcxproj | 4 +- >>>>> msvc/libusb_static_2010.vcxproj.filters | 4 +- >>>>> msvc/libusb_static_2012.vcxproj | 4 +- >>>>> msvc/libusb_static_2012.vcxproj.filters | 4 +- >>>>> msvc/libusb_static_2013.vcxproj | 6 +- >>>>> msvc/libusb_usbdk_dll_2013.vcxproj | 178 ++ >>>>> msvc/libusb_usbdk_static_2013.vcxproj | 162 ++ >>>>> 31 files changed, 7271 insertions(+), 5652 deletions(-) >>>>> create mode 100644 libusb/os/windows_nt_common.c >>>>> create mode 100644 libusb/os/windows_nt_common.h >>>>> delete mode 100644 libusb/os/windows_usb.c >>>>> delete mode 100644 libusb/os/windows_usb.h >>>>> create mode 100644 libusb/os/windows_usbdk.c >>>>> create mode 100644 libusb/os/windows_usbdk.h >>>>> create mode 100644 libusb/os/windows_winusb.c >>>>> create mode 100644 libusb/os/windows_winusb.h >>>>> create mode 100644 msvc/libusb_usbdk_dll_2013.vcxproj >>>>> create mode 100644 msvc/libusb_usbdk_static_2013.vcxproj >>>>> >>>>> -- >>>>> 2.4.3 >>>>> >>> >> |
From: Dmitry F. <dm...@da...> - 2016-01-20 15:06:18
|
Hello libusb-devel, Following is the next version of UsbDk backend patches. The same patches are also available at https://github.com/dmitryfleytman/libusb/tree/usbdk-backend-v6 Thanks, Dmitry ===================================================================================== Changes since v5: 1. Rebased to the latest master 2. Patches changed as suggested by Chris Changes since v4: 1. Rebased to the latest master 2. Patch set reorganised, some functions renamed as suggested by Chris Changes since v3: 1. Added processing of USBD errors supplied by UsbDk Changes since v2: 1. UsbDk clear_halt callback implementation fixed Changes since v1: 1. Project files for Visual Studio 2013 added 2. DDK/WDK build files updated to support builds with UsbDk backend 3. File names changed as agreed (windows_usb.* -> windows_winusb.*) 4. Function names in windows_nt_common.c changed as areed ("nt" dropped) 5. UsbDk headers merged as agreed, no subfolder, one file only (windows_usbdk.h) 6. Build tested and fixed for different MinGW versions Adding dynamic backend selection for UsbDk/libusb*/WinUsb configuration turned out to be too tricky for a number of reasons, so we would like to postpone this feature for now and return to it later along with support for attach/detach mode. We will also release a new usbDk version in a few days with support for persistent hide rules feature as suggested on this list before. ===================================================================================== This series contains patches that extend Windows backend to support UsbDk. Switch between UsbDk and WinUSB/LibusbK/Libusb0 is done at compile time with --enable-usbdk configuration option (off by default). UsbDk (USB Development Kit) is a set of software components meant to provide Windows user mode applications with direct and exclusive access to USB devices. Some distinctive UsbDk properties are: 1. UsbDk supports all types of devices and interfaces - bulk, isochronous, composite, HID etc. 2. Device capture process is totally dynamic, i.e. no inf files and self-signing needed, any device can be captured. 3. UsbDk co-exists with original device driver, when the device is not captured original driver is loaded by the system automatically. 4. If user mode client terminates unexpectedly for any reason system reverts to original device driver immediately. 5. Being USB filter driver UsbDk doesn't require WHQL-ing as per Microsoft requirements. UsbDk supports all Windows OS versions staring from Windows XP, i.e. XP/Vista/7/8/8.1/2003/2008/2008R2/2012/2012R2. Both 32 and 64 bit architectures are supported. UsbDk is fully open source and distributed under Apache 2.0 license. UsbDk project is hosted at spice-space.org, source code repository available at: http://cgit.freedesktop.org/spice/win32/usbdk Latest source tarball is at: http://www.spice-space.org/download/windows/usbdk/spice-usbdk-win-1.0-2-sources.zip UsbDk releases come with precompiled and signed by Red Hat binaries: 1. 32 bit: http://www.spice-space.org/download/windows/usbdk/UsbDk_1.0.8_x86.msi 2. 64 bit: http://www.spice-space.org/download/windows/usbdk/UsbDk_1.0.8_x64.msi UsbDk documentation: 1. Short presentation: http://www.spice-space.org/docs/usbdk/UsbDk_at_a_Glance.pdf 2. SDM: http://www.spice-space.org/docs/usbdk/UsbDk_Software_Development_Manual.pdf 3. UsbDk architecture specificatin (part of source tree): http://cgit.freedesktop.org/spice/win32/usbdk/tree/ARCHITECTURE UsbDk is maintained by Dmitry Fleytman (dm...@da...). I'll be glad to answer your questions sent to me directly or via this mailing list. What do you think about this series? We will be glad to have it accepted into libusb upstream. Best Regards, Dmitry Dmitry Fleytman (4): windows: Move common definitions to a separate file windows: Rename windows_usb.h/c windows_winusb.h/c usbdk: Introduce usbdk backend build: Integrate usbdk backend configure.ac | 9 + libusb/Makefile.am | 16 +- libusb/core.c | 6 + libusb/libusbi.h | 1 + libusb/os/windows_nt_common.c | 616 ++++ libusb/os/windows_nt_common.h | 58 + libusb/os/windows_usb.c | 4645 ------------------------------- libusb/os/windows_usb.h | 973 ------- libusb/os/windows_usbdk.c | 951 +++++++ libusb/os/windows_usbdk.h | 126 + libusb/os/windows_winusb.c | 4144 +++++++++++++++++++++++++++ libusb/os/windows_winusb.h | 947 +++++++ msvc/ddk_build.cmd | 9 + msvc/libusb_2013.sln | 20 + msvc/libusb_2015.sln | 20 + msvc/libusb_dll.dsp | 4 +- msvc/libusb_dll_2005.vcproj | 4 +- msvc/libusb_dll_2010.vcxproj | 4 +- msvc/libusb_dll_2010.vcxproj.filters | 4 +- msvc/libusb_dll_2012.vcxproj | 4 +- msvc/libusb_dll_2012.vcxproj.filters | 4 +- msvc/libusb_dll_2013.vcxproj | 6 +- msvc/libusb_dll_2015.vcxproj | 6 +- msvc/libusb_sources | 10 +- msvc/libusb_static.dsp | 4 +- msvc/libusb_static_2005.vcproj | 4 +- msvc/libusb_static_2010.vcxproj | 4 +- msvc/libusb_static_2010.vcxproj.filters | 4 +- msvc/libusb_static_2012.vcxproj | 4 +- msvc/libusb_static_2012.vcxproj.filters | 4 +- msvc/libusb_static_2013.vcxproj | 6 +- msvc/libusb_static_2015.vcxproj | 6 +- msvc/libusb_usbdk_dll_2013.vcxproj | 178 ++ msvc/libusb_usbdk_dll_2015.vcxproj | 178 ++ msvc/libusb_usbdk_static_2013.vcxproj | 162 ++ msvc/libusb_usbdk_static_2015.vcxproj | 162 ++ 36 files changed, 7648 insertions(+), 5655 deletions(-) create mode 100644 libusb/os/windows_nt_common.c create mode 100644 libusb/os/windows_nt_common.h delete mode 100644 libusb/os/windows_usb.c delete mode 100644 libusb/os/windows_usb.h create mode 100644 libusb/os/windows_usbdk.c create mode 100644 libusb/os/windows_usbdk.h create mode 100644 libusb/os/windows_winusb.c create mode 100644 libusb/os/windows_winusb.h create mode 100644 msvc/libusb_usbdk_dll_2013.vcxproj create mode 100644 msvc/libusb_usbdk_dll_2015.vcxproj create mode 100644 msvc/libusb_usbdk_static_2013.vcxproj create mode 100644 msvc/libusb_usbdk_static_2015.vcxproj -- 2.4.3 |
From: Dmitry F. <dm...@da...> - 2016-01-20 15:06:21
|
From: Dmitry Fleytman <dfl...@re...> New files windows_nt_common.h/c introduced. Signed-off-by: Dmitry Fleytman <dfl...@re...> --- libusb/Makefile.am | 6 +- libusb/os/windows_nt_common.c | 616 ++++++++++++++++++++++++++++++++++++++++ libusb/os/windows_nt_common.h | 58 ++++ libusb/os/windows_usb.c | 547 ++--------------------------------- libusb/os/windows_usb.h | 28 +- msvc/libusb_dll_2013.vcxproj | 2 + msvc/libusb_dll_2015.vcxproj | 2 + msvc/libusb_sources | 1 + msvc/libusb_static_2013.vcxproj | 2 + msvc/libusb_static_2015.vcxproj | 2 + 10 files changed, 710 insertions(+), 554 deletions(-) create mode 100644 libusb/os/windows_nt_common.c create mode 100644 libusb/os/windows_nt_common.h diff --git a/libusb/Makefile.am b/libusb/Makefile.am index 0223400..bd495ce 100644 --- a/libusb/Makefile.am +++ b/libusb/Makefile.am @@ -12,7 +12,11 @@ LINUX_USBFS_SRC = os/linux_usbfs.h os/linux_usbfs.c DARWIN_USB_SRC = os/darwin_usb.h os/darwin_usb.c OPENBSD_USB_SRC = os/openbsd_usb.c NETBSD_USB_SRC = os/netbsd_usb.c -WINDOWS_USB_SRC = os/windows_common.h os/windows_usb.h os/windows_usb.c libusb-1.0.rc libusb-1.0.def +COMMON_WINDOWS_SRC = os/windows_nt_common.h \ + os/windows_nt_common.c \ + os/windows_common.h \ + libusb-1.0.rc libusb-1.0.def +WINDOWS_USB_SRC = os/windows_usb.h os/windows_usb.c $(COMMON_WINDOWS_SRC) WINCE_USB_SRC = os/wince_usb.h os/wince_usb.c HAIKU_USB_SRC = os/haiku_usb.h os/haiku_usb_backend.cpp \ os/haiku_usb_raw.h os/haiku_usb_raw.cpp os/haiku_pollfs.cpp diff --git a/libusb/os/windows_nt_common.c b/libusb/os/windows_nt_common.c new file mode 100644 index 0000000..d99e3b8 --- /dev/null +++ b/libusb/os/windows_nt_common.c @@ -0,0 +1,616 @@ +/* + * windows backend for libusb 1.0 + * Copyright © 2009-2012 Pete Batard <pe...@ak...> + * With contributions from Michael Plante, Orin Eman et al. + * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer + * HID Reports IOCTLs inspired from HIDAPI by Alan Ott, Signal 11 Software + * Hash table functions adapted from glibc, by Ulrich Drepper et al. + * Major code testing contribution by Xiaofan Chen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <config.h> +#include <stdio.h> +#include <inttypes.h> +#include <process.h> + + +#include "libusbi.h" +#include "windows_common.h" +#include "windows_nt_common.h" + +// Global variables +const uint64_t epoch_time = UINT64_C(116444736000000000); // 1970.01.01 00:00:000 in MS Filetime + +// Global variables for clock_gettime mechanism +uint64_t hires_ticks_to_ps; +uint64_t hires_frequency; + +#define WM_TIMER_REQUEST (WM_USER + 1) +#define WM_TIMER_EXIT (WM_USER + 2) + +// used for monotonic clock_gettime() +struct timer_request { + struct timespec *tp; + HANDLE event; +}; + +// Timer thread +HANDLE timer_thread = NULL; +DWORD timer_thread_id = 0; + +/* User32 dependencies */ +DLL_DECLARE_PREFIXED(WINAPI, BOOL, p, GetMessageA, (LPMSG, HWND, UINT, UINT)); +DLL_DECLARE_PREFIXED(WINAPI, BOOL, p, PeekMessageA, (LPMSG, HWND, UINT, UINT, UINT)); +DLL_DECLARE_PREFIXED(WINAPI, BOOL, p, PostThreadMessageA, (DWORD, UINT, WPARAM, LPARAM)); + +static unsigned __stdcall windows_clock_gettime_threaded(void* param); + +/* +* Converts a windows error to human readable string +* uses retval as errorcode, or, if 0, use GetLastError() +*/ +#if defined(ENABLE_LOGGING) +char *windows_error_str(uint32_t retval) +{ + static char err_string[ERR_BUFFER_SIZE]; + + DWORD size; + ssize_t i; + uint32_t error_code, format_error; + + error_code = retval ? retval : GetLastError(); + + safe_sprintf(err_string, ERR_BUFFER_SIZE, "[%u] ", error_code); + + // Translate codes returned by SetupAPI. The ones we are dealing with are either + // in 0x0000xxxx or 0xE000xxxx and can be distinguished from standard error codes. + // See http://msdn.microsoft.com/en-us/library/windows/hardware/ff545011.aspx + switch (error_code & 0xE0000000) { + case 0: + error_code = HRESULT_FROM_WIN32(error_code); // Still leaves ERROR_SUCCESS unmodified + break; + case 0xE0000000: + error_code = 0x80000000 | (FACILITY_SETUPAPI << 16) | (error_code & 0x0000FFFF); + break; + default: + break; + } + + size = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, error_code, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), &err_string[safe_strlen(err_string)], + ERR_BUFFER_SIZE - (DWORD)safe_strlen(err_string), NULL); + if (size == 0) { + format_error = GetLastError(); + if (format_error) + safe_sprintf(err_string, ERR_BUFFER_SIZE, + "Windows error code %u (FormatMessage error code %u)", error_code, format_error); + else + safe_sprintf(err_string, ERR_BUFFER_SIZE, "Unknown error code %u", error_code); + } + else { + // Remove CR/LF terminators + for (i = safe_strlen(err_string) - 1; (i >= 0) && ((err_string[i] == 0x0A) || (err_string[i] == 0x0D)); i--) { + err_string[i] = 0; + } + } + return err_string; +} +#endif + +/* Hash table functions - modified From glibc 2.3.2: + [Aho,Sethi,Ullman] Compilers: Principles, Techniques and Tools, 1986 + [Knuth] The Art of Computer Programming, part 3 (6.4) */ +typedef struct htab_entry { + unsigned long used; + char* str; +} htab_entry; +htab_entry* htab_table = NULL; +usbi_mutex_t htab_write_mutex = NULL; +unsigned long htab_size, htab_filled; + +/* For the used double hash method the table size has to be a prime. To + correct the user given table size we need a prime test. This trivial + algorithm is adequate because the code is called only during init and + the number is likely to be small */ +static int isprime(unsigned long number) +{ + // no even number will be passed + unsigned int divider = 3; + + while((divider * divider < number) && (number % divider != 0)) + divider += 2; + + return (number % divider != 0); +} + +/* Before using the hash table we must allocate memory for it. + We allocate one element more as the found prime number says. + This is done for more effective indexing as explained in the + comment for the hash function. */ +int htab_create(struct libusb_context *ctx, unsigned long nel) +{ + if (htab_table != NULL) { + usbi_err(ctx, "hash table already allocated"); + } + + // Create a mutex + usbi_mutex_init(&htab_write_mutex, NULL); + + // Change nel to the first prime number not smaller as nel. + nel |= 1; + while(!isprime(nel)) + nel += 2; + + htab_size = nel; + usbi_dbg("using %lu entries hash table", nel); + htab_filled = 0; + + // allocate memory and zero out. + htab_table = (htab_entry*) calloc(htab_size + 1, sizeof(htab_entry)); + if (htab_table == NULL) { + usbi_err(ctx, "could not allocate space for hash table"); + return 0; + } + + return 1; +} + +/* After using the hash table it has to be destroyed. */ +void htab_destroy(void) +{ + size_t i; + if (htab_table == NULL) { + return; + } + + for (i=0; i<htab_size; i++) { + if (htab_table[i].used) { + safe_free(htab_table[i].str); + } + } + usbi_mutex_destroy(&htab_write_mutex); + safe_free(htab_table); +} + +/* This is the search function. It uses double hashing with open addressing. + We use an trick to speed up the lookup. The table is created with one + more element available. This enables us to use the index zero special. + This index will never be used because we store the first hash index in + the field used where zero means not used. Every other value means used. + The used field can be used as a first fast comparison for equality of + the stored and the parameter value. This helps to prevent unnecessary + expensive calls of strcmp. */ +unsigned long htab_hash(char* str) +{ + unsigned long hval, hval2; + unsigned long idx; + unsigned long r = 5381; + int c; + char* sz = str; + + if (str == NULL) + return 0; + + // Compute main hash value (algorithm suggested by Nokia) + while ((c = *sz++) != 0) + r = ((r << 5) + r) + c; + if (r == 0) + ++r; + + // compute table hash: simply take the modulus + hval = r % htab_size; + if (hval == 0) + ++hval; + + // Try the first index + idx = hval; + + if (htab_table[idx].used) { + if ( (htab_table[idx].used == hval) + && (safe_strcmp(str, htab_table[idx].str) == 0) ) { + // existing hash + return idx; + } + usbi_dbg("hash collision ('%s' vs '%s')", str, htab_table[idx].str); + + // Second hash function, as suggested in [Knuth] + hval2 = 1 + hval % (htab_size - 2); + + do { + // Because size is prime this guarantees to step through all available indexes + if (idx <= hval2) { + idx = htab_size + idx - hval2; + } else { + idx -= hval2; + } + + // If we visited all entries leave the loop unsuccessfully + if (idx == hval) { + break; + } + + // If entry is found use it. + if ( (htab_table[idx].used == hval) + && (safe_strcmp(str, htab_table[idx].str) == 0) ) { + return idx; + } + } + while (htab_table[idx].used); + } + + // Not found => New entry + + // If the table is full return an error + if (htab_filled >= htab_size) { + usbi_err(NULL, "hash table is full (%d entries)", htab_size); + return 0; + } + + // Concurrent threads might be storing the same entry at the same time + // (eg. "simultaneous" enums from different threads) => use a mutex + usbi_mutex_lock(&htab_write_mutex); + // Just free any previously allocated string (which should be the same as + // new one). The possibility of concurrent threads storing a collision + // string (same hash, different string) at the same time is extremely low + safe_free(htab_table[idx].str); + htab_table[idx].used = hval; + htab_table[idx].str = (char*) malloc(safe_strlen(str)+1); + if (htab_table[idx].str == NULL) { + usbi_err(NULL, "could not duplicate string for hash table"); + usbi_mutex_unlock(&htab_write_mutex); + return 0; + } + memcpy(htab_table[idx].str, str, safe_strlen(str)+1); + ++htab_filled; + usbi_mutex_unlock(&htab_write_mutex); + + return idx; +} + +static int windows_init_dlls(void) +{ + DLL_LOAD_PREFIXED(User32.dll, p, GetMessageA, TRUE); + DLL_LOAD_PREFIXED(User32.dll, p, PeekMessageA, TRUE); + DLL_LOAD_PREFIXED(User32.dll, p, PostThreadMessageA, TRUE); + return LIBUSB_SUCCESS; +} + +bool windows_init_clock(struct libusb_context *ctx) +{ + DWORD_PTR affinity, dummy; + HANDLE event = NULL; + LARGE_INTEGER li_frequency; + int i; + + if (QueryPerformanceFrequency(&li_frequency)) { + // Load DLL imports + if (windows_init_dlls() != LIBUSB_SUCCESS) { + usbi_err(ctx, "could not resolve DLL functions"); + return false; + } + + // The hires frequency can go as high as 4 GHz, so we'll use a conversion + // to picoseconds to compute the tv_nsecs part in clock_gettime + hires_frequency = li_frequency.QuadPart; + hires_ticks_to_ps = UINT64_C(1000000000000) / hires_frequency; + usbi_dbg("hires timer available (Frequency: %"PRIu64" Hz)", hires_frequency); + + // Because QueryPerformanceCounter might report different values when + // running on different cores, we create a separate thread for the timer + // calls, which we glue to the first available core always to prevent timing discrepancies. + if (!GetProcessAffinityMask(GetCurrentProcess(), &affinity, &dummy) || (affinity == 0)) { + usbi_err(ctx, "could not get process affinity: %s", windows_error_str(0)); + return false; + } + // The process affinity mask is a bitmask where each set bit represents a core on + // which this process is allowed to run, so we find the first set bit + for (i = 0; !(affinity & (DWORD_PTR)(1 << i)); i++); + affinity = (DWORD_PTR)(1 << i); + + usbi_dbg("timer thread will run on core #%d", i); + + event = CreateEvent(NULL, FALSE, FALSE, NULL); + if (event == NULL) { + usbi_err(ctx, "could not create event: %s", windows_error_str(0)); + return false; + } + timer_thread = (HANDLE)_beginthreadex(NULL, 0, windows_clock_gettime_threaded, (void *)event, + 0, (unsigned int *)&timer_thread_id); + if (timer_thread == NULL) { + usbi_err(ctx, "unable to create timer thread - aborting"); + CloseHandle(event); + return false; + } + if (!SetThreadAffinityMask(timer_thread, affinity)) { + usbi_warn(ctx, "unable to set timer thread affinity, timer discrepancies may arise"); + } + + // Wait for timer thread to init before continuing. + if (WaitForSingleObject(event, INFINITE) != WAIT_OBJECT_0) { + usbi_err(ctx, "failed to wait for timer thread to become ready - aborting"); + CloseHandle(event); + return false; + } + + CloseHandle(event); + } else { + usbi_dbg("no hires timer available on this platform"); + hires_frequency = 0; + hires_ticks_to_ps = UINT64_C(0); + } + + return true; +} + +void windows_destroy_clock(void) +{ + if (timer_thread) { + // actually the signal to quit the thread. + if (!pPostThreadMessageA(timer_thread_id, WM_TIMER_EXIT, 0, 0) || + (WaitForSingleObject(timer_thread, INFINITE) != WAIT_OBJECT_0)) { + usbi_dbg("could not wait for timer thread to quit"); + TerminateThread(timer_thread, 1); + // shouldn't happen, but we're destroying + // all objects it might have held anyway. + } + CloseHandle(timer_thread); + timer_thread = NULL; + timer_thread_id = 0; + } +} + +/* +* Monotonic and real time functions +*/ +static unsigned __stdcall windows_clock_gettime_threaded(void* param) +{ + struct timer_request *request; + LARGE_INTEGER hires_counter; + MSG msg; + + // The following call will create this thread's message queue + // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms644946.aspx + pPeekMessageA(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE); + + // Signal windows_init() that we're ready to service requests + if (!SetEvent((HANDLE)param)) { + usbi_dbg("SetEvent failed for timer init event: %s", windows_error_str(0)); + } + param = NULL; + + // Main loop - wait for requests + while (1) { + + if (pGetMessageA(&msg, NULL, WM_TIMER_REQUEST, WM_TIMER_EXIT) == -1) { + usbi_err(NULL, "GetMessage failed for timer thread: %s", windows_error_str(0)); + return 1; + } + + switch (msg.message) { + case WM_TIMER_REQUEST: + // Requests to this thread are for hires always + // Microsoft says that this function always succeeds on XP and later + // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms644904.aspx + request = (struct timer_request *)msg.lParam; + QueryPerformanceCounter(&hires_counter); + request->tp->tv_sec = (long)(hires_counter.QuadPart / hires_frequency); + request->tp->tv_nsec = (long)(((hires_counter.QuadPart % hires_frequency) / 1000) * hires_ticks_to_ps); + if (!SetEvent(request->event)) { + usbi_err(NULL, "SetEvent failed for timer request: %s", windows_error_str(0)); + } + break; + + case WM_TIMER_EXIT: + usbi_dbg("timer thread quitting"); + return 0; + } + + } +} + +int windows_clock_gettime(int clk_id, struct timespec *tp) +{ + struct timer_request request; + FILETIME filetime; + ULARGE_INTEGER rtime; + DWORD r; + switch (clk_id) { + case USBI_CLOCK_MONOTONIC: + if (timer_thread) { + request.tp = tp; + request.event = CreateEvent(NULL, FALSE, FALSE, NULL); + if (request.event == NULL) { + return LIBUSB_ERROR_NO_MEM; + } + + if (!pPostThreadMessageA(timer_thread_id, WM_TIMER_REQUEST, 0, (LPARAM)&request)) { + usbi_err(NULL, "PostThreadMessage failed for timer thread: %s", windows_error_str(0)); + CloseHandle(request.event); + return LIBUSB_ERROR_OTHER; + } + + do { + r = WaitForSingleObject(request.event, TIMER_REQUEST_RETRY_MS); + if (r == WAIT_TIMEOUT) { + usbi_dbg("could not obtain a timer value within reasonable timeframe - too much load?"); + } + else if (r == WAIT_FAILED) { + usbi_err(NULL, "WaitForSingleObject failed: %s", windows_error_str(0)); + } + } while (r == WAIT_TIMEOUT); + CloseHandle(request.event); + + if (r == WAIT_OBJECT_0) { + return LIBUSB_SUCCESS; + } else { + return LIBUSB_ERROR_OTHER; + } + } + // Fall through and return real-time if monotonic was not detected @ timer init + case USBI_CLOCK_REALTIME: + // We follow http://msdn.microsoft.com/en-us/library/ms724928%28VS.85%29.aspx + // with a predef epoch_time to have an epoch that starts at 1970.01.01 00:00 + // Note however that our resolution is bounded by the Windows system time + // functions and is at best of the order of 1 ms (or, usually, worse) + GetSystemTimeAsFileTime(&filetime); + rtime.LowPart = filetime.dwLowDateTime; + rtime.HighPart = filetime.dwHighDateTime; + rtime.QuadPart -= epoch_time; + tp->tv_sec = (long)(rtime.QuadPart / 10000000); + tp->tv_nsec = (long)((rtime.QuadPart % 10000000) * 100); + return LIBUSB_SUCCESS; + default: + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +static void windows_transfer_callback(struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size) +{ + int status, istatus; + + usbi_dbg("handling I/O completion with errcode %u, size %u", io_result, io_size); + + switch (io_result) { + case NO_ERROR: + status = windows_copy_transfer_data(itransfer, io_size); + break; + case ERROR_GEN_FAILURE: + usbi_dbg("detected endpoint stall"); + status = LIBUSB_TRANSFER_STALL; + break; + case ERROR_SEM_TIMEOUT: + usbi_dbg("detected semaphore timeout"); + status = LIBUSB_TRANSFER_TIMED_OUT; + break; + case ERROR_OPERATION_ABORTED: + istatus = windows_copy_transfer_data(itransfer, io_size); + if (istatus != LIBUSB_TRANSFER_COMPLETED) { + usbi_dbg("Failed to copy partial data in aborted operation: %d", istatus); + } + if (itransfer->flags & USBI_TRANSFER_TIMED_OUT) { + usbi_dbg("detected timeout"); + status = LIBUSB_TRANSFER_TIMED_OUT; + } + else { + usbi_dbg("detected operation aborted"); + status = LIBUSB_TRANSFER_CANCELLED; + } + break; + default: + usbi_err(ITRANSFER_CTX(itransfer), "detected I/O error %u: %s", io_result, windows_error_str(io_result)); + status = LIBUSB_TRANSFER_ERROR; + break; + } + windows_clear_transfer_priv(itransfer); // Cancel polling + usbi_handle_transfer_completion(itransfer, (enum libusb_transfer_status)status); +} + +void windows_handle_callback(struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + windows_transfer_callback(itransfer, io_result, io_size); + break; + case LIBUSB_TRANSFER_TYPE_BULK_STREAM: + usbi_warn(ITRANSFER_CTX(itransfer), "bulk stream transfers are not yet supported on this platform"); + break; + default: + usbi_err(ITRANSFER_CTX(itransfer), "unknown endpoint type %d", transfer->type); + } +} + +int windows_handle_events(struct libusb_context *ctx, struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready) +{ + POLL_NFDS_TYPE i = 0; + bool found = false; + struct usbi_transfer *transfer; + struct winfd *pollable_fd = NULL; + DWORD io_size, io_result; + + usbi_mutex_lock(&ctx->open_devs_lock); + for (i = 0; i < nfds && num_ready > 0; i++) { + + usbi_dbg("checking fd %d with revents = %04x", fds[i].fd, fds[i].revents); + + if (!fds[i].revents) { + continue; + } + + num_ready--; + + // Because a Windows OVERLAPPED is used for poll emulation, + // a pollable fd is created and stored with each transfer + usbi_mutex_lock(&ctx->flying_transfers_lock); + found = false; + list_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) { + pollable_fd = windows_get_fd(transfer); + if (pollable_fd->fd == fds[i].fd) { + found = true; + break; + } + } + usbi_mutex_unlock(&ctx->flying_transfers_lock); + + if (found) { + windows_get_overlapped_result(transfer, pollable_fd, &io_result, &io_size); + + usbi_remove_pollfd(ctx, pollable_fd->fd); + // let handle_callback free the event using the transfer wfd + // If you don't use the transfer wfd, you run a risk of trying to free a + // newly allocated wfd that took the place of the one from the transfer. + windows_handle_callback(transfer, io_result, io_size); + } else { + usbi_mutex_unlock(&ctx->open_devs_lock); + usbi_err(ctx, "could not find a matching transfer for fd %d", fds[i]); + return LIBUSB_ERROR_NOT_FOUND; + } + } + + usbi_mutex_unlock(&ctx->open_devs_lock); + return LIBUSB_SUCCESS; +} + +int windows_common_init(struct libusb_context *ctx) +{ + static const unsigned long HTAB_SIZE = 1021; + + if (!windows_init_clock(ctx)){ + goto error_roll_back; + } + + if (!htab_create(ctx, HTAB_SIZE)) { + goto error_roll_back; + } + + return LIBUSB_SUCCESS; + +error_roll_back: + windows_common_exit(); + + return LIBUSB_ERROR_NO_MEM; +} + +void windows_common_exit(void) +{ + htab_destroy(); + windows_destroy_clock(); +} diff --git a/libusb/os/windows_nt_common.h b/libusb/os/windows_nt_common.h new file mode 100644 index 0000000..ac907ce --- /dev/null +++ b/libusb/os/windows_nt_common.h @@ -0,0 +1,58 @@ +/* + * Windows backend common header for libusb 1.0 + * + * This file brings together header code common between + * the desktop Windows backends. + * Copyright © 2012-2013 RealVNC Ltd. + * Copyright © 2009-2012 Pete Batard <pe...@ak...> + * With contributions from Michael Plante, Orin Eman et al. + * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer + * Major code testing contribution by Xiaofan Chen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#pragma once + +typedef struct USB_CONFIGURATION_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + USHORT wTotalLength; + UCHAR bNumInterfaces; + UCHAR bConfigurationValue; + UCHAR iConfiguration; + UCHAR bmAttributes; + UCHAR MaxPower; +} USB_CONFIGURATION_DESCRIPTOR, *PUSB_CONFIGURATION_DESCRIPTOR; + +typedef struct libusb_device_descriptor USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR; + +int windows_common_init(struct libusb_context *ctx); +void windows_common_exit(void); + +unsigned long htab_hash(char* str); +int windows_clock_gettime(int clk_id, struct timespec *tp); + +void windows_clear_transfer_priv(struct usbi_transfer *itransfer); +int windows_copy_transfer_data(struct usbi_transfer *itransfer, uint32_t io_size); +struct winfd *windows_get_fd(struct usbi_transfer *transfer); +void windows_get_overlapped_result(struct usbi_transfer *transfer, struct winfd *pollable_fd, DWORD *io_result, DWORD *io_size); + +void windows_handle_callback(struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size); +int windows_handle_events(struct libusb_context *ctx, struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready); + +#if defined(ENABLE_LOGGING) +char *windows_error_str(uint32_t retval); +#endif diff --git a/libusb/os/windows_usb.c b/libusb/os/windows_usb.c index 95fbb32..f73ad6f 100644 --- a/libusb/os/windows_usb.c +++ b/libusb/os/windows_usb.c @@ -45,8 +45,6 @@ // Helper prototypes static int windows_get_active_config_descriptor(struct libusb_device *dev, unsigned char *buffer, size_t len, int *host_endian); -static int windows_clock_gettime(int clk_id, struct timespec *tp); -unsigned __stdcall windows_clock_gettime_threaded(void* param); // Common calls static int common_configure_endpoints(int sub_api, struct libusb_device_handle *dev_handle, int iface); @@ -100,15 +98,11 @@ static int composite_copy_transfer_data(int sub_api, struct usbi_transfer *itran // Global variables uint64_t hires_frequency, hires_ticks_to_ps; -const uint64_t epoch_time = UINT64_C(116444736000000000); // 1970.01.01 00:00:000 in MS Filetime int windows_version = WINDOWS_UNDEFINED; static char windows_version_str[128] = "Windows Undefined"; // Concurrency static int concurrent_usage = -1; usbi_mutex_t autoclaim_lock; -// Timer thread -HANDLE timer_thread = NULL; -DWORD timer_thread_id = 0; // API globals #define CHECK_WINUSBX_AVAILABLE(sub_api) do { if (sub_api == SUB_API_NOTSET) sub_api = priv->sub_api; \ if (!WinUSBX[sub_api].initialized) return LIBUSB_ERROR_ACCESS; } while(0) @@ -139,57 +133,6 @@ static char* guid_to_string(const GUID* guid) #endif /* - * Converts a windows error to human readable string - * uses retval as errorcode, or, if 0, use GetLastError() - */ -#if defined(ENABLE_LOGGING) -static char *windows_error_str(uint32_t retval) -{ -static char err_string[ERR_BUFFER_SIZE]; - - DWORD size; - ssize_t i; - uint32_t error_code, format_error; - - error_code = retval?retval:GetLastError(); - - safe_sprintf(err_string, ERR_BUFFER_SIZE, "[%u] ", error_code); - - // Translate codes returned by SetupAPI. The ones we are dealing with are either - // in 0x0000xxxx or 0xE000xxxx and can be distinguished from standard error codes. - // See http://msdn.microsoft.com/en-us/library/windows/hardware/ff545011.aspx - switch (error_code & 0xE0000000) { - case 0: - error_code = HRESULT_FROM_WIN32(error_code); // Still leaves ERROR_SUCCESS unmodified - break; - case 0xE0000000: - error_code = 0x80000000 | (FACILITY_SETUPAPI << 16) | (error_code & 0x0000FFFF); - break; - default: - break; - } - - size = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, error_code, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), &err_string[safe_strlen(err_string)], - ERR_BUFFER_SIZE - (DWORD)safe_strlen(err_string), NULL); - if (size == 0) { - format_error = GetLastError(); - if (format_error) - safe_sprintf(err_string, ERR_BUFFER_SIZE, - "Windows error code %u (FormatMessage error code %u)", error_code, format_error); - else - safe_sprintf(err_string, ERR_BUFFER_SIZE, "Unknown error code %u", error_code); - } else { - // Remove CR/LF terminators - for (i=safe_strlen(err_string)-1; (i>=0) && ((err_string[i]==0x0A) || (err_string[i]==0x0D)); i--) { - err_string[i] = 0; - } - } - return err_string; -} -#endif - -/* * Sanitize Microsoft's paths: convert to uppercase, add prefix and fix backslashes. * Return an allocated sanitized string or NULL on error. */ @@ -253,9 +196,6 @@ static int init_dlls(void) DLL_LOAD_PREFIXED(SetupAPI.dll, p, SetupDiOpenDeviceInterfaceRegKey, TRUE); DLL_LOAD_PREFIXED(AdvAPI32.dll, p, RegQueryValueExW, TRUE); DLL_LOAD_PREFIXED(AdvAPI32.dll, p, RegCloseKey, TRUE); - DLL_LOAD_PREFIXED(User32.dll, p, GetMessageA, TRUE); - DLL_LOAD_PREFIXED(User32.dll, p, PeekMessageA, TRUE); - DLL_LOAD_PREFIXED(User32.dll, p, PostThreadMessageA, TRUE); return LIBUSB_SUCCESS; } @@ -458,176 +398,6 @@ err_exit: *dev_info = INVALID_HANDLE_VALUE; return NULL;} -/* Hash table functions - modified From glibc 2.3.2: - [Aho,Sethi,Ullman] Compilers: Principles, Techniques and Tools, 1986 - [Knuth] The Art of Computer Programming, part 3 (6.4) */ -typedef struct htab_entry { - unsigned long used; - char* str; -} htab_entry; -htab_entry* htab_table = NULL; -usbi_mutex_t htab_write_mutex = NULL; -unsigned long htab_size, htab_filled; - -/* For the used double hash method the table size has to be a prime. To - correct the user given table size we need a prime test. This trivial - algorithm is adequate because the code is called only during init and - the number is likely to be small */ -static int isprime(unsigned long number) -{ - // no even number will be passed - unsigned int divider = 3; - - while((divider * divider < number) && (number % divider != 0)) - divider += 2; - - return (number % divider != 0); -} - -/* Before using the hash table we must allocate memory for it. - We allocate one element more as the found prime number says. - This is done for more effective indexing as explained in the - comment for the hash function. */ -static int htab_create(struct libusb_context *ctx, unsigned long nel) -{ - if (htab_table != NULL) { - usbi_err(ctx, "hash table already allocated"); - } - - // Create a mutex - usbi_mutex_init(&htab_write_mutex, NULL); - - // Change nel to the first prime number not smaller as nel. - nel |= 1; - while(!isprime(nel)) - nel += 2; - - htab_size = nel; - usbi_dbg("using %lu entries hash table", nel); - htab_filled = 0; - - // allocate memory and zero out. - htab_table = (htab_entry*) calloc(htab_size + 1, sizeof(htab_entry)); - if (htab_table == NULL) { - usbi_err(ctx, "could not allocate space for hash table"); - return 0; - } - - return 1; -} - -/* After using the hash table it has to be destroyed. */ -static void htab_destroy(void) -{ - size_t i; - if (htab_table == NULL) { - return; - } - - for (i=0; i<htab_size; i++) { - if (htab_table[i].used) { - safe_free(htab_table[i].str); - } - } - usbi_mutex_destroy(&htab_write_mutex); - safe_free(htab_table); -} - -/* This is the search function. It uses double hashing with open addressing. - We use an trick to speed up the lookup. The table is created with one - more element available. This enables us to use the index zero special. - This index will never be used because we store the first hash index in - the field used where zero means not used. Every other value means used. - The used field can be used as a first fast comparison for equality of - the stored and the parameter value. This helps to prevent unnecessary - expensive calls of strcmp. */ -static unsigned long htab_hash(char* str) -{ - unsigned long hval, hval2; - unsigned long idx; - unsigned long r = 5381; - int c; - char* sz = str; - - if (str == NULL) - return 0; - - // Compute main hash value (algorithm suggested by Nokia) - while ((c = *sz++) != 0) - r = ((r << 5) + r) + c; - if (r == 0) - ++r; - - // compute table hash: simply take the modulus - hval = r % htab_size; - if (hval == 0) - ++hval; - - // Try the first index - idx = hval; - - if (htab_table[idx].used) { - if ( (htab_table[idx].used == hval) - && (safe_strcmp(str, htab_table[idx].str) == 0) ) { - // existing hash - return idx; - } - usbi_dbg("hash collision ('%s' vs '%s')", str, htab_table[idx].str); - - // Second hash function, as suggested in [Knuth] - hval2 = 1 + hval % (htab_size - 2); - - do { - // Because size is prime this guarantees to step through all available indexes - if (idx <= hval2) { - idx = htab_size + idx - hval2; - } else { - idx -= hval2; - } - - // If we visited all entries leave the loop unsuccessfully - if (idx == hval) { - break; - } - - // If entry is found use it. - if ( (htab_table[idx].used == hval) - && (safe_strcmp(str, htab_table[idx].str) == 0) ) { - return idx; - } - } - while (htab_table[idx].used); - } - - // Not found => New entry - - // If the table is full return an error - if (htab_filled >= htab_size) { - usbi_err(NULL, "hash table is full (%lu entries)", htab_size); - return 0; - } - - // Concurrent threads might be storing the same entry at the same time - // (eg. "simultaneous" enums from different threads) => use a mutex - usbi_mutex_lock(&htab_write_mutex); - // Just free any previously allocated string (which should be the same as - // new one). The possibility of concurrent threads storing a collision - // string (same hash, different string) at the same time is extremely low - safe_free(htab_table[idx].str); - htab_table[idx].used = hval; - htab_table[idx].str = (char*) malloc(safe_strlen(str)+1); - if (htab_table[idx].str == NULL) { - usbi_err(NULL, "could not duplicate string for hash table"); - usbi_mutex_unlock(&htab_write_mutex); - return 0; - } - memcpy(htab_table[idx].str, str, safe_strlen(str)+1); - ++htab_filled; - usbi_mutex_unlock(&htab_write_mutex); - - return idx; -} - /* * Returns the session ID of a device's nth level ancestor * If there's no device at the nth level, return 0 @@ -954,10 +724,7 @@ static void get_windows_version(void) static int windows_init(struct libusb_context *ctx) { int i, r = LIBUSB_ERROR_OTHER; - DWORD_PTR affinity, dummy; - HANDLE event = NULL; HANDLE semaphore; - LARGE_INTEGER li_frequency; char sem_name[11+1+8]; // strlen(libusb_init)+'\0'+(32-bit hex PID) sprintf(sem_name, "libusb_init%08X", (unsigned int)GetCurrentProcessId()); @@ -1003,85 +770,23 @@ static int windows_init(struct libusb_context *ctx) usb_api_backend[i].init(SUB_API_NOTSET, ctx); } - if (QueryPerformanceFrequency(&li_frequency)) { - // The hires frequency can go as high as 4 GHz, so we'll use a conversion - // to picoseconds to compute the tv_nsecs part in clock_gettime - hires_frequency = li_frequency.QuadPart; - hires_ticks_to_ps = UINT64_C(1000000000000) / hires_frequency; - usbi_dbg("hires timer available (Frequency: %"PRIu64" Hz)", hires_frequency); - - // Because QueryPerformanceCounter might report different values when - // running on different cores, we create a separate thread for the timer - // calls, which we glue to the first available core always to prevent timing discrepancies. - if (!GetProcessAffinityMask(GetCurrentProcess(), &affinity, &dummy) || (affinity == 0)) { - usbi_err(ctx, "could not get process affinity: %s", windows_error_str(0)); - goto init_exit; - } - // The process affinity mask is a bitmask where each set bit represents a core on - // which this process is allowed to run, so we find the first set bit - for (i = 0; !(affinity & (DWORD_PTR)(1 << i)); i++); - affinity = (DWORD_PTR)(1 << i); - - usbi_dbg("timer thread will run on core #%d", i); - - r = LIBUSB_ERROR_NO_MEM; - event = CreateEvent(NULL, FALSE, FALSE, NULL); - if (event == NULL) { - usbi_err(ctx, "could not create event: %s", windows_error_str(0)); - goto init_exit; - } - timer_thread = (HANDLE)_beginthreadex(NULL, 0, windows_clock_gettime_threaded, (void *)event, - 0, (unsigned int *)&timer_thread_id); - if (timer_thread == NULL) { - usbi_err(ctx, "unable to create timer thread - aborting"); - goto init_exit; - } - if (!SetThreadAffinityMask(timer_thread, affinity)) { - usbi_warn(ctx, "unable to set timer thread affinity, timer discrepancies may arise"); - } - - // Wait for timer thread to init before continuing. - if (WaitForSingleObject(event, INFINITE) != WAIT_OBJECT_0) { - usbi_err(ctx, "failed to wait for timer thread to become ready - aborting"); - goto init_exit; - } - } - else { - usbi_dbg("no hires timer available on this platform"); - hires_frequency = 0; - hires_ticks_to_ps = UINT64_C(0); + r = windows_common_init(ctx); + if (r) { + goto init_exit; } - - // Create a hash table to store session ids. Second parameter is better if prime - htab_create(ctx, HTAB_SIZE); } // At this stage, either we went through full init successfully, or didn't need to r = LIBUSB_SUCCESS; init_exit: // Holds semaphore here. if (!concurrent_usage && r != LIBUSB_SUCCESS) { // First init failed? - if (timer_thread) { - // actually the signal to quit the thread. - if (!pPostThreadMessageA(timer_thread_id, WM_TIMER_EXIT, 0, 0) || - (WaitForSingleObject(timer_thread, INFINITE) != WAIT_OBJECT_0)) { - usbi_warn(ctx, "could not wait for timer thread to quit"); - TerminateThread(timer_thread, 1); - // shouldn't happen, but we're destroying - // all objects it might have held anyway. - } - CloseHandle(timer_thread); - timer_thread = NULL; - timer_thread_id = 0; - } - htab_destroy(); + windows_common_exit(); usbi_mutex_destroy(&autoclaim_lock); } if (r != LIBUSB_SUCCESS) --concurrent_usage; // Not expected to call libusb_exit if we failed. - if (event) - CloseHandle(event); ReleaseSemaphore(semaphore, 1, NULL); // increase count back to 1 CloseHandle(semaphore); return r; @@ -1891,19 +1596,7 @@ static void windows_exit(void) usb_api_backend[i].exit(SUB_API_NOTSET); } exit_polling(); - - if (timer_thread) { - // actually the signal to quit the thread. - if (!pPostThreadMessageA(timer_thread_id, WM_TIMER_EXIT, 0, 0) || - (WaitForSingleObject(timer_thread, INFINITE) != WAIT_OBJECT_0)) { - usbi_dbg("could not wait for timer thread to quit"); - TerminateThread(timer_thread, 1); - } - CloseHandle(timer_thread); - timer_thread = NULL; - timer_thread_id = 0; - } - htab_destroy(); + windows_common_exit(); usbi_mutex_destroy(&autoclaim_lock); } @@ -2088,7 +1781,7 @@ static void windows_destroy_device(struct libusb_device *dev) windows_device_priv_release(dev); } -static void windows_clear_transfer_priv(struct usbi_transfer *itransfer) +void windows_clear_transfer_priv(struct usbi_transfer *itransfer) { struct windows_transfer_priv *transfer_priv = (struct windows_transfer_priv*)usbi_transfer_get_os_priv(itransfer); @@ -2213,232 +1906,34 @@ static int windows_cancel_transfer(struct usbi_transfer *itransfer) } } -static void windows_transfer_callback(struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size) +int windows_copy_transfer_data(struct usbi_transfer *itransfer, uint32_t io_size) { struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - int status, istatus; - - usbi_dbg("handling I/O completion with errcode %u, size %u", io_result, io_size); - - switch(io_result) { - case NO_ERROR: - status = priv->apib->copy_transfer_data(SUB_API_NOTSET, itransfer, io_size); - break; - case ERROR_GEN_FAILURE: - usbi_dbg("detected endpoint stall"); - status = LIBUSB_TRANSFER_STALL; - break; - case ERROR_SEM_TIMEOUT: - usbi_dbg("detected semaphore timeout"); - status = LIBUSB_TRANSFER_TIMED_OUT; - break; - case ERROR_OPERATION_ABORTED: - istatus = priv->apib->copy_transfer_data(SUB_API_NOTSET, itransfer, io_size); - if (istatus != LIBUSB_TRANSFER_COMPLETED) { - usbi_dbg("Failed to copy partial data in aborted operation: %d", istatus); - } - if (itransfer->flags & USBI_TRANSFER_TIMED_OUT) { - usbi_dbg("detected timeout"); - status = LIBUSB_TRANSFER_TIMED_OUT; - } else { - usbi_dbg("detected operation aborted"); - status = LIBUSB_TRANSFER_CANCELLED; - } - break; - default: - usbi_err(ITRANSFER_CTX(itransfer), "detected I/O error %u: %s", io_result, windows_error_str(io_result)); - status = LIBUSB_TRANSFER_ERROR; - break; - } - windows_clear_transfer_priv(itransfer); // Cancel polling - usbi_handle_transfer_completion(itransfer, (enum libusb_transfer_status)status); + return priv->apib->copy_transfer_data(SUB_API_NOTSET, itransfer, io_size); } -static void windows_handle_callback (struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size) +struct winfd *windows_get_fd(struct usbi_transfer *transfer) { - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - - switch (transfer->type) { - case LIBUSB_TRANSFER_TYPE_CONTROL: - case LIBUSB_TRANSFER_TYPE_BULK: - case LIBUSB_TRANSFER_TYPE_INTERRUPT: - case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: - windows_transfer_callback (itransfer, io_result, io_size); - break; - case LIBUSB_TRANSFER_TYPE_BULK_STREAM: - usbi_warn(ITRANSFER_CTX(itransfer), "bulk stream transfers are not yet supported on this platform"); - break; - default: - usbi_err(ITRANSFER_CTX(itransfer), "unknown endpoint type %d", transfer->type); - } + struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(transfer); + return &transfer_priv->pollable_fd; } -static int windows_handle_events(struct libusb_context *ctx, struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready) +void windows_get_overlapped_result(struct usbi_transfer *transfer, struct winfd *pollable_fd, DWORD *io_result, DWORD *io_size) { - struct windows_transfer_priv* transfer_priv = NULL; - POLL_NFDS_TYPE i = 0; - bool found; - struct usbi_transfer *transfer; - DWORD io_size, io_result; - - usbi_mutex_lock(&ctx->open_devs_lock); - for (i = 0; i < nfds && num_ready > 0; i++) { - - usbi_dbg("checking fd %d with revents = %04x", fds[i].fd, fds[i].revents); - - if (!fds[i].revents) { - continue; - } - - num_ready--; - - // Because a Windows OVERLAPPED is used for poll emulation, - // a pollable fd is created and stored with each transfer - usbi_mutex_lock(&ctx->flying_transfers_lock); - found = false; - list_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) { - transfer_priv = usbi_transfer_get_os_priv(transfer); - if (transfer_priv->pollable_fd.fd == fds[i].fd) { - found = true; - break; - } - } - usbi_mutex_unlock(&ctx->flying_transfers_lock); - - if (found) { - // Handle async requests that completed synchronously first - if (HasOverlappedIoCompletedSync(transfer_priv->pollable_fd.overlapped)) { - io_result = NO_ERROR; - io_size = (DWORD)transfer_priv->pollable_fd.overlapped->InternalHigh; - // Regular async overlapped - } else if (GetOverlappedResult(transfer_priv->pollable_fd.handle, - transfer_priv->pollable_fd.overlapped, &io_size, false)) { - io_result = NO_ERROR; - } else { - io_result = GetLastError(); - } - usbi_remove_pollfd(ctx, transfer_priv->pollable_fd.fd); - // let handle_callback free the event using the transfer wfd - // If you don't use the transfer wfd, you run a risk of trying to free a - // newly allocated wfd that took the place of the one from the transfer. - windows_handle_callback(transfer, io_result, io_size); - } else { - usbi_mutex_unlock(&ctx->open_devs_lock); - usbi_err(ctx, "could not find a matching transfer for fd %d", fds[i]); - return LIBUSB_ERROR_NOT_FOUND; - } - } - - usbi_mutex_unlock(&ctx->open_devs_lock); - return LIBUSB_SUCCESS; -} - -/* - * Monotonic and real time functions - */ -unsigned __stdcall windows_clock_gettime_threaded(void* param) -{ - struct timer_request *request; - LARGE_INTEGER hires_counter; - MSG msg; - - // The following call will create this thread's message queue - // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms644946.aspx - pPeekMessageA(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE); - - // Signal windows_init() that we're ready to service requests - if (!SetEvent((HANDLE)param)) { - usbi_dbg("SetEvent failed for timer init event: %s", windows_error_str(0)); + if (HasOverlappedIoCompletedSync(pollable_fd->overlapped)) { + *io_result = NO_ERROR; + *io_size = (DWORD)pollable_fd->overlapped->InternalHigh; + // Regular async overlapped } - param = NULL; - - // Main loop - wait for requests - while (1) { - if (pGetMessageA(&msg, NULL, WM_TIMER_REQUEST, WM_TIMER_EXIT) == -1) { - usbi_err(NULL, "GetMessage failed for timer thread: %s", windows_error_str(0)); - return 1; - } - - switch (msg.message) { - case WM_TIMER_REQUEST: - // Requests to this thread are for hires always - // Microsoft says that this function always succeeds on XP and later - // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms644904.aspx - request = (struct timer_request *)msg.lParam; - QueryPerformanceCounter(&hires_counter); - request->tp->tv_sec = (long)(hires_counter.QuadPart / hires_frequency); - request->tp->tv_nsec = (long)(((hires_counter.QuadPart % hires_frequency) / 1000) * hires_ticks_to_ps); - if (!SetEvent(request->event)) { - usbi_err(NULL, "SetEvent failed for timer request: %s", windows_error_str(0)); - } - break; - - case WM_TIMER_EXIT: - usbi_dbg("timer thread quitting"); - return 0; - } + else if (GetOverlappedResult(pollable_fd->handle, pollable_fd->overlapped, io_size, false)) { + *io_result = NO_ERROR; } -} - -static int windows_clock_gettime(int clk_id, struct timespec *tp) -{ - struct timer_request request; - FILETIME filetime; - ULARGE_INTEGER rtime; - DWORD r; - switch(clk_id) { - case USBI_CLOCK_MONOTONIC: - if (timer_thread) { - request.tp = tp; - request.event = CreateEvent(NULL, FALSE, FALSE, NULL); - if (request.event == NULL) { - return LIBUSB_ERROR_NO_MEM; - } - - if (!pPostThreadMessageA(timer_thread_id, WM_TIMER_REQUEST, 0, (LPARAM)&request)) { - usbi_err(NULL, "PostThreadMessage failed for timer thread: %s", windows_error_str(0)); - CloseHandle(request.event); - return LIBUSB_ERROR_OTHER; - } - - do { - r = WaitForSingleObject(request.event, TIMER_REQUEST_RETRY_MS); - if (r == WAIT_TIMEOUT) { - usbi_dbg("could not obtain a timer value within reasonable timeframe - too much load?"); - } - else if (r == WAIT_FAILED) { - usbi_err(NULL, "WaitForSingleObject failed: %s", windows_error_str(0)); - } - } while (r == WAIT_TIMEOUT); - CloseHandle(request.event); - - if (r == WAIT_OBJECT_0) { - return LIBUSB_SUCCESS; - } - else { - return LIBUSB_ERROR_OTHER; - } - } - // Fall through and return real-time if monotonic was not detected @ timer init - case USBI_CLOCK_REALTIME: - // We follow http://msdn.microsoft.com/en-us/library/ms724928%28VS.85%29.aspx - // with a predef epoch_time to have an epoch that starts at 1970.01.01 00:00 - // Note however that our resolution is bounded by the Windows system time - // functions and is at best of the order of 1 ms (or, usually, worse) - GetSystemTimeAsFileTime(&filetime); - rtime.LowPart = filetime.dwLowDateTime; - rtime.HighPart = filetime.dwHighDateTime; - rtime.QuadPart -= epoch_time; - tp->tv_sec = (long)(rtime.QuadPart / 10000000); - tp->tv_nsec = (long)((rtime.QuadPart % 10000000)*100); - return LIBUSB_SUCCESS; - default: - return LIBUSB_ERROR_INVALID_PARAM; + else { + *io_result = GetLastError(); } } - // NB: MSVC6 does not support named initializers. const struct usbi_os_backend windows_backend = { "Windows", @@ -2479,7 +1974,7 @@ const struct usbi_os_backend windows_backend = { windows_clear_transfer_priv, windows_handle_events, - NULL, /* handle_transfer_completion() */ + NULL, windows_clock_gettime, #if defined(USBI_TIMERFD_AVAILABLE) diff --git a/libusb/os/windows_usb.h b/libusb/os/windows_usb.h index edf267a..e201762 100644 --- a/libusb/os/windows_usb.h +++ b/libusb/os/windows_usb.h @@ -23,6 +23,7 @@ #pragma once #include "windows_common.h" +#include "windows_nt_common.h" #if defined(_MSC_VER) // disable /W4 MSVC warnings that are benign @@ -64,7 +65,6 @@ #define MAX_PATH_LENGTH 128 #define MAX_KEY_LENGTH 256 #define LIST_SEPARATOR ';' -#define HTAB_SIZE 1021 // Handle code for HID interface that have been claimed ("dibs") #define INTERFACE_CLAIMED ((HANDLE)(intptr_t)0xD1B5) @@ -209,7 +209,6 @@ struct hid_device_priv { uint8_t string_index[3]; // man, prod, ser }; -typedef struct libusb_device_descriptor USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR; struct windows_device_priv { uint8_t depth; // distance to HCD uint8_t port; // port number on the hub @@ -308,15 +307,6 @@ struct driver_lookup { const char* designation; // internal designation (for debug output) }; -#define WM_TIMER_REQUEST (WM_USER + 1) -#define WM_TIMER_EXIT (WM_USER + 2) - -// used for monotonic clock_gettime() -struct timer_request { - struct timespec *tp; - HANDLE event; -}; - /* OLE32 dependency */ DLL_DECLARE_PREFIXED(WINAPI, HRESULT, p, CLSIDFromString, (LPCOLESTR, LPCLSID)); @@ -338,11 +328,6 @@ DLL_DECLARE_PREFIXED(WINAPI, HKEY, p, SetupDiOpenDeviceInterfaceRegKey, (HDEVINF DLL_DECLARE_PREFIXED(WINAPI, LONG, p, RegQueryValueExW, (HKEY, LPCWSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD)); DLL_DECLARE_PREFIXED(WINAPI, LONG, p, RegCloseKey, (HKEY)); -/* User32 dependencies */ -DLL_DECLARE_PREFIXED(WINAPI, BOOL, p, GetMessageA, (LPMSG, HWND, UINT, UINT)); -DLL_DECLARE_PREFIXED(WINAPI, BOOL, p, PeekMessageA, (LPMSG, HWND, UINT, UINT, UINT)); -DLL_DECLARE_PREFIXED(WINAPI, BOOL, p, PostThreadMessageA, (DWORD, UINT, WPARAM, LPARAM)); - /* * Windows DDK API definitions. Most of it copied from MinGW's includes */ @@ -469,17 +454,6 @@ typedef struct USB_INTERFACE_DESCRIPTOR { UCHAR iInterface; } USB_INTERFACE_DESCRIPTOR, *PUSB_INTERFACE_DESCRIPTOR; -typedef struct USB_CONFIGURATION_DESCRIPTOR { - UCHAR bLength; - UCHAR bDescriptorType; - USHORT wTotalLength; - UCHAR bNumInterfaces; - UCHAR bConfigurationValue; - UCHAR iConfiguration; - UCHAR bmAttributes; - UCHAR MaxPower; -} USB_CONFIGURATION_DESCRIPTOR, *PUSB_CONFIGURATION_DESCRIPTOR; - typedef struct USB_CONFIGURATION_DESCRIPTOR_SHORT { struct { ULONG ConnectionIndex; diff --git a/msvc/libusb_dll_2013.vcxproj b/msvc/libusb_dll_2013.vcxproj index c1b2a0a..d2ee675 100644 --- a/msvc/libusb_dll_2013.vcxproj +++ b/msvc/libusb_dll_2013.vcxproj @@ -147,6 +147,7 @@ <ClCompile Include="..\libusb\hotplug.c" /> <ClCompile Include="..\libusb\io.c" /> <ClCompile Include="..\libusb\os\poll_windows.c" /> + <ClCompile Include="..\libusb\os\windows_nt_common.c" /> <ClCompile Include="..\libusb\strerror.c" /> <ClCompile Include="..\libusb\sync.c" /> <ClCompile Include="..\libusb\os\threads_windows.c" /> @@ -154,6 +155,7 @@ </ItemGroup> <ItemGroup> <ClInclude Include="..\libusb\hotplug.h" /> + <ClInclude Include="..\libusb\os\windows_nt_common.h" /> <ClInclude Include="..\libusb\version.h" /> <ClInclude Include="..\libusb\version_nano.h" /> <ClInclude Include=".\config.h" /> diff --git a/msvc/libusb_dll_2015.vcxproj b/msvc/libusb_dll_2015.vcxproj index cd560c0..85d9823 100644 --- a/msvc/libusb_dll_2015.vcxproj +++ b/msvc/libusb_dll_2015.vcxproj @@ -147,6 +147,7 @@ <ClCompile Include="..\libusb\hotplug.c" /> <ClCompile Include="..\libusb\io.c" /> <ClCompile Include="..\libusb\os\poll_windows.c" /> + <ClCompile Include="..\libusb\os\windows_nt_common.c" /> <ClCompile Include="..\libusb\strerror.c" /> <ClCompile Include="..\libusb\sync.c" /> <ClCompile Include="..\libusb\os\threads_windows.c" /> @@ -154,6 +155,7 @@ </ItemGroup> <ItemGroup> <ClInclude Include="..\libusb\hotplug.h" /> + <ClInclude Include="..\libusb\os\windows_nt_common.h" /> <ClInclude Include="..\libusb\version.h" /> <ClInclude Include="..\libusb\version_nano.h" /> <ClInclude Include=".\config.h" /> diff --git a/msvc/libusb_sources b/msvc/libusb_sources index 308a666..f9718cf 100644 --- a/msvc/libusb_sources +++ b/msvc/libusb_sources @@ -35,4 +35,5 @@ SOURCES=..\core.c \ threads_windows.c \ poll_windows.c \ windows_usb.c \ + windows_nt_common.c \ ..\libusb-1.0.rc diff --git a/msvc/libusb_static_2013.vcxproj b/msvc/libusb_static_2013.vcxproj index 05b7bd8..f980ae3 100644 --- a/msvc/libusb_static_2013.vcxproj +++ b/msvc/libusb_static_2013.vcxproj @@ -137,6 +137,7 @@ <ClCompile Include="..\libusb\hotplug.c" /> <ClCompile Include="..\libusb\io.c" /> <ClCompile Include="..\libusb\os\poll_windows.c" /> + <ClCompile Include="..\libusb\os\windows_nt_common.c" /> <ClCompile Include="..\libusb\strerror.c" /> <ClCompile Include="..\libusb\sync.c" /> <ClCompile Include="..\libusb\os\threads_windows.c" /> @@ -144,6 +145,7 @@ </ItemGroup> <ItemGroup> <ClInclude Include="..\libusb\hotplug.h" /> + <ClInclude Include="..\libusb\os\windows_nt_common.h" /> <ClInclude Include="..\libusb\version.h" /> <ClInclude Include="..\libusb\version_nano.h" /> <ClInclude Include=".\config.h" /> diff --git a/msvc/libusb_static_2015.vcxproj b/msvc/libusb_static_2015.vcxproj index 0576705..b50cdf2 100644 --- a/msvc/libusb_static_2015.vcxproj +++ b/msvc/libusb_static_2015.vcxproj @@ -141,6 +141,7 @@ <ClCompile Include="..\libusb\hotplug.c" /> <ClCompile Include="..\libusb\io.c" /> <ClCompile Include="..\libusb\os\poll_windows.c" /> + <ClCompile Include="..\libusb\os\windows_nt_common.c" /> <ClCompile Include="..\libusb\strerror.c" /> <ClCompile Include="..\libusb\sync.c" /> <ClCompile Include="..\libusb\os\threads_windows.c" /> @@ -148,6 +149,7 @@ </ItemGroup> <ItemGroup> <ClInclude Include="..\libusb\hotplug.h" /> + <ClInclude Include="..\libusb\os\windows_nt_common.h" /> <ClInclude Include="..\libusb\version.h" /> <ClInclude Include="..\libusb\version_nano.h" /> <ClInclude Include=".\config.h" /> -- 2.4.3 |
From: Dmitry F. <dm...@da...> - 2016-01-20 15:06:24
|
From: Dmitry Fleytman <dfl...@re...> Signed-off-by: Pavel Gurvich <pa...@da...> Signed-off-by: Dmitry Fleytman <dfl...@re...> --- libusb/core.c | 6 + libusb/libusbi.h | 1 + libusb/os/windows_usbdk.c | 951 +++++++++++++++++++++++++++++++++++++++++++++ libusb/os/windows_usbdk.h | 126 ++++++ libusb/os/windows_winusb.c | 4 + 5 files changed, 1088 insertions(+) create mode 100644 libusb/os/windows_usbdk.c create mode 100644 libusb/os/windows_usbdk.h diff --git a/libusb/core.c b/libusb/core.c index 067cd49..90491e6 100644 --- a/libusb/core.c +++ b/libusb/core.c @@ -53,7 +53,13 @@ const struct usbi_os_backend * const usbi_backend = &openbsd_backend; #elif defined(OS_NETBSD) const struct usbi_os_backend * const usbi_backend = &netbsd_backend; #elif defined(OS_WINDOWS) + +#if defined(USE_USBDK) +const struct usbi_os_backend * const usbi_backend = &usbdk_backend; +#else const struct usbi_os_backend * const usbi_backend = &windows_backend; +#endif + #elif defined(OS_WINCE) const struct usbi_os_backend * const usbi_backend = &wince_backend; #elif defined(OS_HAIKU) diff --git a/libusb/libusbi.h b/libusb/libusbi.h index d69d613..2d229da 100644 --- a/libusb/libusbi.h +++ b/libusb/libusbi.h @@ -1118,6 +1118,7 @@ extern const struct usbi_os_backend darwin_backend; extern const struct usbi_os_backend openbsd_backend; extern const struct usbi_os_backend netbsd_backend; extern const struct usbi_os_backend windows_backend; +extern const struct usbi_os_backend usbdk_backend; extern const struct usbi_os_backend wince_backend; extern const struct usbi_os_backend haiku_usb_raw_backend; diff --git a/libusb/os/windows_usbdk.c b/libusb/os/windows_usbdk.c new file mode 100644 index 0000000..73427eb --- /dev/null +++ b/libusb/os/windows_usbdk.c @@ -0,0 +1,951 @@ +/* + * windows UsbDk backend for libusb 1.0 + * Copyright © 2014 Red Hat, Inc. + + * Authors: + * Dmitry Fleytman <dm...@da...> + * Pavel Gurvich <pa...@da...> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <config.h> + +#if defined(USE_USBDK) + +#include <stdio.h> + +#include "libusbi.h" +#include "cfgmgr32.h" +#include "windows_common.h" +#include "windows_nt_common.h" + +#define ULONG64 uint64_t +#define PVOID64 uint64_t + +typedef CONST WCHAR *PCWCHAR; +#define wcsncpy_s wcsncpy + +#include "windows_usbdk.h" + +#if !defined(STATUS_SUCCESS) +typedef LONG NTSTATUS; +#define STATUS_SUCCESS ((NTSTATUS)0x00000000L) +#endif + +#if !defined(STATUS_CANCELLED) +#define STATUS_CANCELLED ((NTSTATUS)0xC0000120L) +#endif + +#if !defined(STATUS_REQUEST_CANCELED) +#define STATUS_REQUEST_CANCELED ((NTSTATUS)0xC0000703L) +#endif + +#if !defined(USBD_SUCCESS) +typedef int32_t USBD_STATUS; +#define USBD_SUCCESS(Status) ((USBD_STATUS) (Status) >= 0) +#define USBD_PENDING(Status) ((ULONG) (Status) >> 30 == 1) +#define USBD_ERROR(Status) ((USBD_STATUS) (Status) < 0) +#define USBD_STATUS_STALL_PID ((USBD_STATUS) 0xc0000004) +#define USBD_STATUS_ENDPOINT_HALTED ((USBD_STATUS) 0xc0000030) +#define USBD_STATUS_BAD_START_FRAME ((USBD_STATUS) 0xc0000a00) +#define USBD_STATUS_TIMEOUT ((USBD_STATUS) 0xc0006000) +#define USBD_STATUS_CANCELED ((USBD_STATUS) 0xc0010000) +#endif + +static int concurrent_usage = -1; +static int init_succeeded = 0; + +struct usbdk_device_priv { + USB_DK_DEVICE_INFO info; + PUSB_CONFIGURATION_DESCRIPTOR *config_descriptors; + HANDLE redirector_handle; + uint8_t active_configuration; +}; + +struct usbdk_device_handle_priv { + //This field is to solve compilation error on VS2013: + //error C2016: C requires that a struct or union has at least one member + int dummy; +}; + +struct usbdk_transfer_priv { + USB_DK_TRANSFER_REQUEST request; + struct winfd pollable_fd; + PULONG64 IsochronousPacketsArray; + PUSB_DK_ISO_TRANSFER_RESULT IsochronousResultsArray; +}; + +static inline struct usbdk_device_priv *_usbdk_device_priv(struct libusb_device *dev) +{ + return (struct usbdk_device_priv*) dev->os_priv; +} + +static inline struct usbdk_transfer_priv *_usbdk_transfer_priv(struct usbi_transfer *itransfer) +{ + return (struct usbdk_transfer_priv*) usbi_transfer_get_os_priv(itransfer); +} + +static struct { + HMODULE module; + + USBDK_GET_DEVICES_LIST GetDevicesList; + USBDK_RELEASE_DEVICES_LIST ReleaseDevicesList; + USBDK_START_REDIRECT StartRedirect; + USBDK_STOP_REDIRECT StopRedirect; + USBDK_GET_CONFIGURATION_DESCRIPTOR GetConfigurationDescriptor; + USBDK_RELEASE_CONFIGURATION_DESCRIPTOR ReleaseConfigurationDescriptor; + USBDK_READ_PIPE ReadPipe; + USBDK_WRITE_PIPE WritePipe; + USBDK_ABORT_PIPE AbortPipe; + USBDK_RESET_PIPE ResetPipe; + USBDK_SET_ALTSETTING SetAltsetting; + USBDK_RESET_DEVICE ResetDevice; + USBDK_GET_REDIRECTOR_SYSTEM_HANDLE GetRedirectorSystemHandle; +} usbdk_helper; + +static FARPROC get_usbdk_proc_addr(struct libusb_context *ctx, LPCSTR api_name) +{ + FARPROC api_ptr = GetProcAddress(usbdk_helper.module, api_name); + if (api_ptr == NULL) { + DWORD err = GetLastError(); + usbi_err(ctx, "UsbDkHelper API %s not found, error %d", api_name, err); + } + + return api_ptr; +} + +static void unload_usbdk_helper_dll(void) +{ + FreeLibrary(usbdk_helper.module); +} + +static int load_usbdk_helper_dll(struct libusb_context *ctx) +{ + usbdk_helper.module = LoadLibraryA("UsbDkHelper"); + if (usbdk_helper.module == NULL) { + DWORD err = GetLastError(); + usbi_err(ctx, "Failed to load UsbDkHelper.dll, error %d", err); + return LIBUSB_ERROR_NOT_FOUND; + } + + usbdk_helper.GetDevicesList = (USBDK_GET_DEVICES_LIST) get_usbdk_proc_addr(ctx, "UsbDk_GetDevicesList"); + if (usbdk_helper.GetDevicesList == NULL) { + goto error_unload; + } + + usbdk_helper.ReleaseDevicesList = (USBDK_RELEASE_DEVICES_LIST) get_usbdk_proc_addr(ctx, "UsbDk_ReleaseDevicesList"); + if (usbdk_helper.ReleaseDevicesList == NULL) { + goto error_unload; + } + + usbdk_helper.StartRedirect = (USBDK_START_REDIRECT) get_usbdk_proc_addr(ctx, "UsbDk_StartRedirect"); + if (usbdk_helper.StartRedirect == NULL) { + goto error_unload; + } + + usbdk_helper.StopRedirect = (USBDK_STOP_REDIRECT) get_usbdk_proc_addr(ctx, "UsbDk_StopRedirect"); + if (usbdk_helper.StopRedirect == NULL) { + goto error_unload; + } + + usbdk_helper.GetConfigurationDescriptor = (USBDK_GET_CONFIGURATION_DESCRIPTOR) get_usbdk_proc_addr(ctx, "UsbDk_GetConfigurationDescriptor"); + if (usbdk_helper.GetConfigurationDescriptor == NULL) { + goto error_unload; + } + + usbdk_helper.ReleaseConfigurationDescriptor = (USBDK_RELEASE_CONFIGURATION_DESCRIPTOR) get_usbdk_proc_addr(ctx, "UsbDk_ReleaseConfigurationDescriptor"); + if (usbdk_helper.ReleaseConfigurationDescriptor == NULL) { + goto error_unload; + } + + usbdk_helper.ReadPipe = (USBDK_READ_PIPE) get_usbdk_proc_addr(ctx, "UsbDk_ReadPipe"); + if (usbdk_helper.ReadPipe == NULL) { + goto error_unload; + } + + usbdk_helper.WritePipe = (USBDK_WRITE_PIPE) get_usbdk_proc_addr(ctx, "UsbDk_WritePipe"); + if (usbdk_helper.WritePipe == NULL) { + goto error_unload; + } + + usbdk_helper.AbortPipe = (USBDK_ABORT_PIPE)get_usbdk_proc_addr(ctx, "UsbDk_AbortPipe"); + if (usbdk_helper.AbortPipe == NULL) { + goto error_unload; + } + + usbdk_helper.ResetPipe = (USBDK_RESET_PIPE)get_usbdk_proc_addr(ctx, "UsbDk_ResetPipe"); + if (usbdk_helper.ResetPipe == NULL) { + goto error_unload; + } + + usbdk_helper.SetAltsetting = (USBDK_SET_ALTSETTING)get_usbdk_proc_addr(ctx, "UsbDk_SetAltsetting"); + if (usbdk_helper.SetAltsetting == NULL) { + goto error_unload; + } + + usbdk_helper.ResetDevice = (USBDK_RESET_DEVICE)get_usbdk_proc_addr(ctx, "UsbDk_ResetDevice"); + if (usbdk_helper.ResetDevice == NULL) { + goto error_unload; + } + + usbdk_helper.GetRedirectorSystemHandle = (USBDK_GET_REDIRECTOR_SYSTEM_HANDLE)get_usbdk_proc_addr(ctx, "UsbDk_GetRedirectorSystemHandle"); + if (usbdk_helper.GetRedirectorSystemHandle == NULL) { + goto error_unload; + } + + return LIBUSB_SUCCESS; + +error_unload: + FreeLibrary(usbdk_helper.module); + return LIBUSB_ERROR_NOT_FOUND; +} + +static int usbdk_init(struct libusb_context *ctx) +{ + int r; + + if ((++concurrent_usage == 0) || !init_succeeded) { + r = load_usbdk_helper_dll(ctx); + if (r) { + return r; + } + + init_polling(); + + r = windows_common_init(ctx); + if (r) { + goto error_roll_back; + } + + init_succeeded = 1; + } + + return LIBUSB_SUCCESS; + +error_roll_back: + windows_common_exit(); + unload_usbdk_helper_dll(); + return r; +} + +static int usbdk_get_session_id_for_device(struct libusb_context *ctx, + PUSB_DK_DEVICE_ID id, + unsigned long* session_id) +{ + char dev_identity[ARRAYSIZE(id->DeviceID) + ARRAYSIZE(id->InstanceID)]; + + if (sprintf(dev_identity, "%S%S", id->DeviceID, id->InstanceID) == -1) { + usbi_warn(ctx, "cannot form device identity", id->DeviceID); + return LIBUSB_ERROR_NOT_SUPPORTED; + } + + *session_id = htab_hash(dev_identity); + + return LIBUSB_SUCCESS; +} + +static void usbdk_release_config_descriptors(struct usbdk_device_priv* p, uint8_t count) +{ + uint8_t i; + for (i = 0; i < count; i++) { + usbdk_helper.ReleaseConfigurationDescriptor(p->config_descriptors[i]); + } + free(p->config_descriptors); + p->config_descriptors = NULL; +} + +static int usbdk_cache_config_descriptors(struct libusb_context *ctx, + struct usbdk_device_priv* p, + PUSB_DK_DEVICE_INFO info) +{ + uint8_t i; + USB_DK_CONFIG_DESCRIPTOR_REQUEST Request; + Request.ID = info->ID; + + p->config_descriptors = calloc(info->DeviceDescriptor.bNumConfigurations, + sizeof(PUSB_CONFIGURATION_DESCRIPTOR)); + if (p->config_descriptors == NULL) { + usbi_err(ctx, "failed to allocate configuration descriptors holder"); + return LIBUSB_ERROR_NO_MEM; + } + + for (i = 0; i < info->DeviceDescriptor.bNumConfigurations; i++) { + ULONG Length; + + Request.Index = i; + if (!usbdk_helper.GetConfigurationDescriptor(&Request, + &p->config_descriptors[i], + &Length)) { + usbi_err(ctx, "failed to retrieve configuration descriptors"); + usbdk_release_config_descriptors(p, i); + return LIBUSB_ERROR_OTHER; + } + } + + return LIBUSB_SUCCESS; +} + +static inline int usbdk_device_priv_init(struct libusb_context *ctx, libusb_device* dev, PUSB_DK_DEVICE_INFO info) +{ + struct usbdk_device_priv* p = _usbdk_device_priv(dev); + p->info = *info; + p->active_configuration = 0; + return usbdk_cache_config_descriptors(ctx, p, info); +} + +static void usbdk_device_init(libusb_device* dev, PUSB_DK_DEVICE_INFO info) +{ + dev->bus_number = (uint8_t) info->FilterID; + dev->port_number = (uint8_t) info->Port; + dev->parent_dev = NULL; + + //Addresses in libusb are 1-based + dev->device_address = (uint8_t) info->Port + 1; + + dev->num_configurations = info->DeviceDescriptor.bNumConfigurations; + dev->device_descriptor = info->DeviceDescriptor; + + switch (info->Speed) + { + case LowSpeed: + dev->speed = LIBUSB_SPEED_LOW; + break; + case FullSpeed: + dev->speed = LIBUSB_SPEED_FULL; + break; + case HighSpeed: + dev->speed = LIBUSB_SPEED_HIGH; + break; + case SuperSpeed: + dev->speed = LIBUSB_SPEED_SUPER; + break; + case NoSpeed: + default: + dev->speed = LIBUSB_SPEED_UNKNOWN; + break; + } +} + +static int usbdk_get_device_list(struct libusb_context *ctx, struct discovered_devs **_discdevs) +{ + int r = LIBUSB_SUCCESS; + ULONG i; + + struct discovered_devs *discdevs = NULL; + ULONG dev_number; + PUSB_DK_DEVICE_INFO devices; + + if(!usbdk_helper.GetDevicesList(&devices, &dev_number)) { + return LIBUSB_ERROR_OTHER; + } + + for (i = 0; i < dev_number; ++i) { + unsigned long session_id; + struct libusb_device *dev = NULL; + + if (usbdk_get_session_id_for_device(ctx, &devices[i].ID, &session_id)) { + continue; + } + + dev = usbi_get_device_by_session_id(ctx, session_id); + if (dev == NULL) { + dev = usbi_alloc_device(ctx, session_id); + if (dev == NULL) { + usbi_err(ctx, "failed to allocate a new device structure"); + continue; + } + + usbdk_device_init(dev, &devices[i]); + if (usbdk_device_priv_init(ctx, dev, &devices[i]) != LIBUSB_SUCCESS) { + libusb_unref_device(dev); + continue; + } + } + + discdevs = discovered_devs_append(*_discdevs, dev); + + libusb_unref_device(dev); + + if (!discdevs) + { + usbi_err(ctx, "cannot append new device to list"); + r = LIBUSB_ERROR_NO_MEM; + goto func_exit; + } + *_discdevs = discdevs; + } + +func_exit: + usbdk_helper.ReleaseDevicesList(devices); + return r; +} + +static void usbdk_exit(void) +{ + if ((--concurrent_usage < 0) && init_succeeded) { + windows_common_exit(); + exit_polling(); + unload_usbdk_helper_dll(); + init_succeeded = 0; + } +} + +static int usbdk_get_device_descriptor(struct libusb_device *dev, unsigned char *buffer, int *host_endian) +{ + struct usbdk_device_priv *priv = _usbdk_device_priv(dev); + + memcpy(buffer, &priv->info.DeviceDescriptor, DEVICE_DESC_LENGTH); + *host_endian = 0; + + return LIBUSB_SUCCESS; +} + +static int usbdk_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian) +{ + struct usbdk_device_priv *priv = _usbdk_device_priv(dev); + PUSB_CONFIGURATION_DESCRIPTOR config_header; + size_t size; + + if (config_index >= dev->num_configurations) + return LIBUSB_ERROR_INVALID_PARAM; + + config_header = (PUSB_CONFIGURATION_DESCRIPTOR) priv->config_descriptors[config_index]; + + size = min(config_header->wTotalLength, len); + memcpy(buffer, config_header, size); + *host_endian = 0; + + return (int)size; +} + +static inline int usbdk_get_active_config_descriptor(struct libusb_device *dev, unsigned char *buffer, size_t len, int *host_endian) +{ + return usbdk_get_config_descriptor(dev, _usbdk_device_priv(dev)->active_configuration, + buffer, len, host_endian); +} + +static int usbdk_open(struct libusb_device_handle *dev_handle) +{ + struct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev); + + priv->redirector_handle = usbdk_helper.StartRedirect(&priv->info.ID); + if (priv->redirector_handle == INVALID_HANDLE_VALUE) + { + usbi_err(DEVICE_CTX(dev_handle->dev), "Redirector startup failed"); + return LIBUSB_ERROR_OTHER; + } + + return LIBUSB_SUCCESS; +} + +static void usbdk_close(struct libusb_device_handle *dev_handle) +{ + struct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev); + + if (!usbdk_helper.StopRedirect(priv->redirector_handle)) + { + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + usbi_err(ctx, "Redirector shutdown failed"); + } +} + +static int usbdk_get_configuration(struct libusb_device_handle *dev_handle, int *config) +{ + *config = _usbdk_device_priv(dev_handle->dev)->active_configuration; + return LIBUSB_SUCCESS; +} + +static int usbdk_set_configuration(struct libusb_device_handle *dev_handle, int config) +{ + UNREFERENCED_PARAMETER(dev_handle); + UNREFERENCED_PARAMETER(config); + return LIBUSB_SUCCESS; +} + +static int usbdk_claim_interface(struct libusb_device_handle *dev_handle, int iface) +{ + UNREFERENCED_PARAMETER(dev_handle); + UNREFERENCED_PARAMETER(iface); + return LIBUSB_SUCCESS; +} + +static int usbdk_set_interface_altsetting(struct libusb_device_handle *dev_handle, int iface, int altsetting) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev); + + if (!usbdk_helper.SetAltsetting(priv->redirector_handle, iface, altsetting)) { + usbi_err(ctx, "SetAltsetting failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_NO_DEVICE; + } + + return LIBUSB_SUCCESS; +} + +static int usbdk_release_interface(struct libusb_device_handle *dev_handle, int iface) +{ + UNREFERENCED_PARAMETER(dev_handle); + UNREFERENCED_PARAMETER(iface); + return LIBUSB_SUCCESS; +} + +static int usbdk_clear_halt(struct libusb_device_handle *dev_handle, unsigned char endpoint) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev); + + if (!usbdk_helper.ResetPipe(priv->redirector_handle, endpoint)) { + usbi_err(ctx, "ResetPipe failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_NO_DEVICE; + } + + return LIBUSB_SUCCESS; +} + +static int usbdk_reset_device(struct libusb_device_handle *dev_handle) +{ + struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); + struct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev); + + if (!usbdk_helper.ResetDevice(priv->redirector_handle)) { + usbi_err(ctx, "ResetDevice failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_NO_DEVICE; + } + + return LIBUSB_SUCCESS; +} + +static int usbdk_kernel_driver_active(struct libusb_device_handle *dev_handle, int iface) +{ + UNREFERENCED_PARAMETER(dev_handle); + UNREFERENCED_PARAMETER(iface); + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +static int usbdk_attach_kernel_driver(struct libusb_device_handle *dev_handle, int iface) +{ + UNREFERENCED_PARAMETER(dev_handle); + UNREFERENCED_PARAMETER(iface); + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +static int usbdk_detach_kernel_driver(struct libusb_device_handle *dev_handle, int iface) +{ + UNREFERENCED_PARAMETER(dev_handle); + UNREFERENCED_PARAMETER(iface); + return LIBUSB_ERROR_NOT_SUPPORTED; +} + +static void usbdk_destroy_device(struct libusb_device *dev) +{ + struct usbdk_device_priv* p = _usbdk_device_priv(dev); + + if (p->config_descriptors != NULL) + { + usbdk_release_config_descriptors(p, p->info.DeviceDescriptor.bNumConfigurations); + } +} + +void windows_clear_transfer_priv(struct usbi_transfer *itransfer) +{ + struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer); + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + usbi_free_fd(&transfer_priv->pollable_fd); + + if (transfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS){ + safe_free(transfer_priv->IsochronousPacketsArray); + safe_free(transfer_priv->IsochronousResultsArray); + } +} + +static int usbdk_do_control_transfer(struct usbi_transfer *itransfer) +{ + ULONG Length; + TransferResult transResult; + + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct usbdk_device_priv *priv = _usbdk_device_priv(transfer->dev_handle->dev); + struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + + HANDLE sysHandle = usbdk_helper.GetRedirectorSystemHandle(priv->redirector_handle); + + struct winfd wfd = usbi_create_fd(sysHandle, RW_READ, NULL, NULL); + // Always use the handle returned from usbi_create_fd (wfd.handle) + if (wfd.fd < 0) { + return LIBUSB_ERROR_NO_MEM; + } + + transfer_priv->request.Buffer = (PVOID64)(uintptr_t)transfer->buffer; + transfer_priv->request.BufferLength = transfer->length; + transfer_priv->request.TransferType = ControlTransferType; + transfer_priv->pollable_fd = INVALID_WINFD; + Length = (ULONG)transfer->length; + + if (IS_XFERIN(transfer)) { + transResult = usbdk_helper.ReadPipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped); + } + else { + transResult = usbdk_helper.WritePipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped); + } + + + switch (transResult) + { + case TransferSuccess: + wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; + wfd.overlapped->InternalHigh = (DWORD)Length; + break; + case TransferSuccessAsync: + break; + case TransferFailure: + { + usbi_err(ctx, "ControlTransfer failed: %s", windows_error_str(0)); + usbi_free_fd(&wfd); + return LIBUSB_ERROR_IO; + } + } + + // Use priv_transfer to store data needed for async polling + transfer_priv->pollable_fd = wfd; + usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, POLLIN); + return LIBUSB_SUCCESS; +} + +static int usbdk_do_bulk_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct usbdk_device_priv *priv = _usbdk_device_priv(transfer->dev_handle->dev); + struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct winfd wfd; + TransferResult transferRes; + HANDLE sysHandle; + + transfer_priv->request.Buffer = (PVOID64) (uintptr_t) transfer->buffer; + transfer_priv->request.BufferLength = transfer->length; + transfer_priv->request.EndpointAddress = transfer->endpoint; + + switch (transfer->type) + { + case LIBUSB_TRANSFER_TYPE_BULK: + transfer_priv->request.TransferType = BulkTransferType; + break; + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + transfer_priv->request.TransferType = IntertuptTransferType; + break; + default: + usbi_err(ctx, "Wrong transfer type (%d) in usbdk_do_bulk_transfer. %s", transfer->type, windows_error_str(0)); + return LIBUSB_ERROR_INVALID_PARAM; + } + + transfer_priv->pollable_fd = INVALID_WINFD; + + sysHandle = usbdk_helper.GetRedirectorSystemHandle(priv->redirector_handle); + + wfd = usbi_create_fd(sysHandle, IS_XFERIN(transfer) ? RW_READ : RW_WRITE, NULL, NULL); + // Always use the handle returned from usbi_create_fd (wfd.handle) + if (wfd.fd < 0) { + return LIBUSB_ERROR_NO_MEM; + } + + if (IS_XFERIN(transfer)) { + transferRes = usbdk_helper.ReadPipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped); + } + else { + transferRes = usbdk_helper.WritePipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped); + } + + switch (transferRes) + { + case TransferSuccess: + wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; + break; + case TransferSuccessAsync: + break; + case TransferFailure: + { + usbi_err(ctx, "ReadPipe/WritePipe failed: %s", windows_error_str(0)); + usbi_free_fd(&wfd); + return LIBUSB_ERROR_IO; + } + } + + transfer_priv->pollable_fd = wfd; + usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, (short)(IS_XFERIN(transfer) ? POLLIN : POLLOUT)); + return LIBUSB_SUCCESS; +} + +static int usbdk_do_iso_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct usbdk_device_priv *priv = _usbdk_device_priv(transfer->dev_handle->dev); + struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct winfd wfd; + TransferResult transferRes; + int i; + HANDLE sysHandle; + + transfer_priv->request.Buffer = (PVOID64)(uintptr_t)transfer->buffer; + transfer_priv->request.BufferLength = transfer->length; + transfer_priv->request.EndpointAddress = transfer->endpoint; + transfer_priv->request.TransferType = IsochronousTransferType; + transfer_priv->request.IsochronousPacketsArraySize = transfer->num_iso_packets; + transfer_priv->IsochronousPacketsArray = malloc(transfer->num_iso_packets * sizeof(ULONG64)); + transfer_priv->request.IsochronousPacketsArray = (PVOID64)(uintptr_t)transfer_priv->IsochronousPacketsArray; + if (!transfer_priv->IsochronousPacketsArray){ + usbi_err(ctx, "Allocation of IsochronousPacketsArray is failed, %s", windows_error_str(0)); + return LIBUSB_ERROR_IO; + } + + transfer_priv->IsochronousResultsArray = malloc(transfer->num_iso_packets * sizeof(USB_DK_ISO_TRANSFER_RESULT)); + transfer_priv->request.Result.IsochronousResultsArray = (PVOID64)(uintptr_t)transfer_priv->IsochronousResultsArray; + if (!transfer_priv->IsochronousResultsArray){ + usbi_err(ctx, "Allocation of isochronousResultsArray is failed, %s", windows_error_str(0)); + free(transfer_priv->IsochronousPacketsArray); + return LIBUSB_ERROR_IO; + } + + for (i = 0; i < transfer->num_iso_packets; i++){ + transfer_priv->IsochronousPacketsArray[i] = transfer->iso_packet_desc[i].length; + } + + transfer_priv->pollable_fd = INVALID_WINFD; + + sysHandle = usbdk_helper.GetRedirectorSystemHandle(priv->redirector_handle); + + wfd = usbi_create_fd(sysHandle, IS_XFERIN(transfer) ? RW_READ : RW_WRITE, NULL, NULL); + // Always use the handle returned from usbi_create_fd (wfd.handle) + if (wfd.fd < 0) { + free(transfer_priv->IsochronousPacketsArray); + free(transfer_priv->IsochronousResultsArray); + return LIBUSB_ERROR_NO_MEM; + } + + if (IS_XFERIN(transfer)) { + transferRes = usbdk_helper.ReadPipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped); + } + else { + transferRes = usbdk_helper.WritePipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped); + } + + switch (transferRes){ + case TransferSuccess: + wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; + break; + case TransferSuccessAsync: + break; + case TransferFailure: + { + usbi_err(ctx, "ReadPipe/WritePipe failed: %s", windows_error_str(0)); + usbi_free_fd(&wfd); + free(transfer_priv->IsochronousPacketsArray); + free(transfer_priv->IsochronousResultsArray); + return LIBUSB_ERROR_IO; + } + } + + transfer_priv->pollable_fd = wfd; + usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, (short)(IS_XFERIN(transfer) ? POLLIN : POLLOUT)); + + return LIBUSB_SUCCESS; +} + +static int usbdk_submit_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + return usbdk_do_control_transfer(itransfer); + + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + if (IS_XFEROUT(transfer) && transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) { + //TODO: Check whether we can support this in UsbDk + return LIBUSB_ERROR_NOT_SUPPORTED; + } else { + return usbdk_do_bulk_transfer(itransfer); + } + + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + return usbdk_do_iso_transfer(itransfer); + default: + usbi_err(TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type); + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +static int usbdk_abort_transfers(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); + struct usbdk_device_priv *priv = _usbdk_device_priv(transfer->dev_handle->dev); + + if (!usbdk_helper.AbortPipe(priv->redirector_handle, transfer->endpoint)) { + usbi_err(ctx, "AbortPipe failed: %s", windows_error_str(0)); + return LIBUSB_ERROR_NO_DEVICE; + } + + return LIBUSB_SUCCESS; +} + +static int usbdk_cancel_transfer(struct usbi_transfer *itransfer) +{ + struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + + switch (transfer->type) { + case LIBUSB_TRANSFER_TYPE_CONTROL: + // Control transfers cancelled by IoCancelXXX() API + // No special treatment needed + return LIBUSB_SUCCESS; + case LIBUSB_TRANSFER_TYPE_BULK: + case LIBUSB_TRANSFER_TYPE_INTERRUPT: + case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: + return usbdk_abort_transfers(itransfer); + default: + usbi_err(ITRANSFER_CTX(itransfer), "unknown endpoint type %d", transfer->type); + return LIBUSB_ERROR_INVALID_PARAM; + } +} + +int windows_copy_transfer_data(struct usbi_transfer *itransfer, uint32_t io_size) +{ + itransfer->transferred += io_size; + return LIBUSB_TRANSFER_COMPLETED; +} + +struct winfd *windows_get_fd(struct usbi_transfer *transfer) +{ + struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(transfer); + return &transfer_priv->pollable_fd; +} + +static DWORD usbdk_translate_usbd_status(USBD_STATUS UsbdStatus) +{ + if (USBD_SUCCESS(UsbdStatus)) + { + return NO_ERROR; + } + + switch (UsbdStatus) + { + case USBD_STATUS_STALL_PID: + case USBD_STATUS_ENDPOINT_HALTED: + case USBD_STATUS_BAD_START_FRAME: + return ERROR_GEN_FAILURE; + case USBD_STATUS_TIMEOUT: + return ERROR_SEM_TIMEOUT; + case USBD_STATUS_CANCELED: + return ERROR_OPERATION_ABORTED; + default: + return ERROR_FUNCTION_FAILED; + } +} + +void windows_get_overlapped_result(struct usbi_transfer *transfer, struct winfd *pollable_fd, DWORD *io_result, DWORD *io_size) +{ + if (HasOverlappedIoCompletedSync(pollable_fd->overlapped) || // Handle async requests that completed synchronously first + GetOverlappedResult(pollable_fd->handle, pollable_fd->overlapped, io_size, false)) { // Regular async overlapped + struct libusb_transfer *ltransfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer); + struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(transfer); + + if (ltransfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS){ + int i; + for (i = 0; i < transfer_priv->request.IsochronousPacketsArraySize; i++) { + struct libusb_iso_packet_descriptor *lib_desc = <ransfer->iso_packet_desc[i]; + + switch (transfer_priv->IsochronousResultsArray[i].TransferResult){ + case STATUS_SUCCESS: + case STATUS_CANCELLED: + case STATUS_REQUEST_CANCELED: + lib_desc->status = LIBUSB_TRANSFER_COMPLETED; // == ERROR_SUCCESS + break; + default: + lib_desc->status = LIBUSB_TRANSFER_ERROR; // ERROR_UNKNOWN_EXCEPTION; + break; + } + + lib_desc->actual_length = (unsigned int) transfer_priv->IsochronousResultsArray[i].ActualLength; + } + } + + *io_size = (DWORD) transfer_priv->request.Result.GenResult.BytesTransferred; + *io_result = usbdk_translate_usbd_status((USBD_STATUS) transfer_priv->request.Result.GenResult.UsbdStatus); + } + else { + *io_result = GetLastError(); + } +} + +static int usbdk_clock_gettime(int clk_id, struct timespec *tp) +{ + return windows_clock_gettime(clk_id, tp); +} + +const struct usbi_os_backend usbdk_backend = { + "Windows", + USBI_CAP_HAS_HID_ACCESS, + usbdk_init, + usbdk_exit, + + usbdk_get_device_list, + NULL, + usbdk_open, + usbdk_close, + + usbdk_get_device_descriptor, + usbdk_get_active_config_descriptor, + usbdk_get_config_descriptor, + NULL, + + usbdk_get_configuration, + usbdk_set_configuration, + usbdk_claim_interface, + usbdk_release_interface, + + usbdk_set_interface_altsetting, + usbdk_clear_halt, + usbdk_reset_device, + + NULL, + NULL, + + usbdk_kernel_driver_active, + usbdk_detach_kernel_driver, + usbdk_attach_kernel_driver, + + usbdk_destroy_device, + + usbdk_submit_transfer, + usbdk_cancel_transfer, + windows_clear_transfer_priv, + + windows_handle_events, + NULL, + + usbdk_clock_gettime, +#if defined(USBI_TIMERFD_AVAILABLE) + NULL, +#endif + sizeof(struct usbdk_device_priv), + sizeof(struct usbdk_device_handle_priv), + sizeof(struct usbdk_transfer_priv), +}; + +#endif /* USE_USBDK */ diff --git a/libusb/os/windows_usbdk.h b/libusb/os/windows_usbdk.h new file mode 100644 index 0000000..6b71735 --- /dev/null +++ b/libusb/os/windows_usbdk.h @@ -0,0 +1,126 @@ +/* +* windows UsbDk backend for libusb 1.0 +* Copyright © 2014 Red Hat, Inc. + +* Authors: +* Dmitry Fleytman <dm...@da...> +* Pavel Gurvich <pa...@da...> +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#pragma once + +typedef struct tag_USB_DK_DEVICE_ID +{ + WCHAR DeviceID[MAX_DEVICE_ID_LEN]; + WCHAR InstanceID[MAX_DEVICE_ID_LEN]; +} USB_DK_DEVICE_ID, *PUSB_DK_DEVICE_ID; + +static inline +void UsbDkFillIDStruct(USB_DK_DEVICE_ID *ID, PCWCHAR DeviceID, PCWCHAR InstanceID) +{ + wcsncpy_s(ID->DeviceID, DeviceID, MAX_DEVICE_ID_LEN); + wcsncpy_s(ID->InstanceID, InstanceID, MAX_DEVICE_ID_LEN); +} + +typedef struct tag_USB_DK_DEVICE_INFO +{ + USB_DK_DEVICE_ID ID; + ULONG64 FilterID; + ULONG64 Port; + ULONG64 Speed; + USB_DEVICE_DESCRIPTOR DeviceDescriptor; +} USB_DK_DEVICE_INFO, *PUSB_DK_DEVICE_INFO; + +typedef struct tag_USB_DK_CONFIG_DESCRIPTOR_REQUEST +{ + USB_DK_DEVICE_ID ID; + ULONG64 Index; +} USB_DK_CONFIG_DESCRIPTOR_REQUEST, *PUSB_DK_CONFIG_DESCRIPTOR_REQUEST; + +typedef struct tag_USB_DK_ISO_TRANSFER_RESULT +{ + ULONG64 ActualLength; + ULONG64 TransferResult; +} USB_DK_ISO_TRANSFER_RESULT, *PUSB_DK_ISO_TRANSFER_RESULT; + +typedef struct tag_USB_DK_GEN_TRANSFER_RESULT +{ + ULONG64 BytesTransferred; + ULONG64 UsbdStatus; // USBD_STATUS code +} USB_DK_GEN_TRANSFER_RESULT, *PUSB_DK_GEN_TRANSFER_RESULT; + +typedef struct tag_USB_DK_TRANSFER_RESULT +{ + USB_DK_GEN_TRANSFER_RESULT GenResult; + PVOID64 IsochronousResultsArray; // array of USB_DK_ISO_TRANSFER_RESULT +} USB_DK_TRANSFER_RESULT, *PUSB_DK_TRANSFER_RESULT; + +typedef struct tag_USB_DK_TRANSFER_REQUEST +{ + ULONG64 EndpointAddress; + PVOID64 Buffer; + ULONG64 BufferLength; + ULONG64 TransferType; + ULONG64 IsochronousPacketsArraySize; + PVOID64 IsochronousPacketsArray; + + USB_DK_TRANSFER_RESULT Result; +} USB_DK_TRANSFER_REQUEST, *PUSB_DK_TRANSFER_REQUEST; + +typedef enum +{ + TransferFailure = 0, + TransferSuccess, + TransferSuccessAsync +} TransferResult; + +typedef enum +{ + NoSpeed = 0, + LowSpeed, + FullSpeed, + HighSpeed, + SuperSpeed +} USB_DK_DEVICE_SPEED; + +typedef enum +{ + ControlTransferType, + BulkTransferType, + IntertuptTransferType, + IsochronousTransferType +} USB_DK_TRANSFER_TYPE; + +typedef BOOL (__cdecl *USBDK_GET_DEVICES_LIST) (PUSB_DK_DEVICE_INFO *, PULONG); +typedef void (__cdecl *USBDK_RELEASE_DEVICES_LIST) (PUSB_DK_DEVICE_INFO); + +typedef HANDLE (__cdecl *USBDK_START_REDIRECT) (PUSB_DK_DEVICE_ID); +typedef BOOL (__cdecl *USBDK_STOP_REDIRECT) (HANDLE); + +typedef BOOL (__cdecl *USBDK_GET_CONFIGURATION_DESCRIPTOR) (PUSB_DK_CONFIG_DESCRIPTOR_REQUEST Request, + PUSB_CONFIGURATION_DESCRIPTOR *Descriptor, + PULONG Length); +typedef void (__cdecl *USBDK_RELEASE_CONFIGURATION_DESCRIPTOR) (PUSB_CONFIGURATION_DESCRIPTOR Descriptor); + +typedef TransferResult (__cdecl *USBDK_WRITE_PIPE) (HANDLE DeviceHandle, PUSB_DK_TRANSFER_REQUEST Request, LPOVERLAPPED lpOverlapped); +typedef TransferResult (__cdecl *USBDK_READ_PIPE) (HANDLE DeviceHandle, PUSB_DK_TRANSFER_REQUEST Request, LPOVERLAPPED lpOverlapped); +typedef BOOL (__cdecl *USBDK_ABORT_PIPE) (HANDLE DeviceHandle, ULONG64 PipeAddress); +typedef BOOL (__cdecl *USBDK_RESET_PIPE) (HANDLE DeviceHandle, ULONG64 PipeAddress); +typedef BOOL (__cdecl *USBDK_SET_ALTSETTING) (HANDLE DeviceHandle, ULONG64 InterfaceIdx, ULONG64 AltSettingIdx); +typedef BOOL (__cdecl *USBDK_RESET_DEVICE) (HANDLE DeviceHandle); + +typedef HANDLE (__cdecl *USBDK_GET_REDIRECTOR_SYSTEM_HANDLE) (HANDLE DeviceHandle); diff --git a/libusb/os/windows_winusb.c b/libusb/os/windows_winusb.c index 34ce461..ef40096 100644 --- a/libusb/os/windows_winusb.c +++ b/libusb/os/windows_winusb.c @@ -24,6 +24,8 @@ #include <config.h> +#if !defined(USE_USBDK) + #include <windows.h> #include <setupapi.h> #include <ctype.h> @@ -4138,3 +4140,5 @@ static int composite_copy_transfer_data(int sub_api, struct usbi_transfer *itran return priv->usb_interface[transfer_priv->interface_number].apib-> copy_transfer_data(priv->usb_interface[transfer_priv->interface_number].sub_api, itransfer, io_size); } + +#endif /* !USE_USBDK */ -- 2.4.3 |
From: Dmitry F. <dm...@da...> - 2016-01-20 15:06:26
|
From: Dmitry Fleytman <dfl...@re...> Signed-off-by: Dmitry Fleytman <dfl...@re...> --- configure.ac | 9 ++ libusb/Makefile.am | 10 +- msvc/ddk_build.cmd | 9 ++ msvc/libusb_2013.sln | 20 ++++ msvc/libusb_2015.sln | 20 ++++ msvc/libusb_sources | 7 +- msvc/libusb_usbdk_dll_2013.vcxproj | 178 ++++++++++++++++++++++++++++++++++ msvc/libusb_usbdk_dll_2015.vcxproj | 178 ++++++++++++++++++++++++++++++++++ msvc/libusb_usbdk_static_2013.vcxproj | 162 +++++++++++++++++++++++++++++++ msvc/libusb_usbdk_static_2015.vcxproj | 162 +++++++++++++++++++++++++++++++ 10 files changed, 752 insertions(+), 3 deletions(-) create mode 100644 msvc/libusb_usbdk_dll_2013.vcxproj create mode 100644 msvc/libusb_usbdk_dll_2015.vcxproj create mode 100644 msvc/libusb_usbdk_static_2013.vcxproj create mode 100644 msvc/libusb_usbdk_static_2015.vcxproj diff --git a/configure.ac b/configure.ac index 244cd41..ec71e62 100644 --- a/configure.ac +++ b/configure.ac @@ -172,6 +172,14 @@ windows) LTLDFLAGS="${LTLDFLAGS} -avoid-version -Wl,--add-stdcall-alias" AC_DEFINE([POLL_NFDS_TYPE],[unsigned int],[type of second poll() argument]) AC_DEFINE([WINVER], 0x0501, [Oldest Windows version supported]) + + AC_ARG_ENABLE([usbdk], + [AC_HELP_STRING([--enable-usbdk], [use UsbDk Windows backend [default=no]])], + [], [enable_usbdk="no"]) + if test "x$enable_usbdk" = "xyes" ; then + AC_DEFINE(USE_USBDK, 1, [Use UsbDk Windows backend]) + fi + AC_SUBST(USE_USBDK) ;; haiku) AC_DEFINE(OS_HAIKU, 1, [Haiku backend]) @@ -193,6 +201,7 @@ AM_CONDITIONAL(OS_HAIKU, test "x$backend" = xhaiku) AM_CONDITIONAL(THREADS_POSIX, test "x$threads" = xposix) AM_CONDITIONAL(CREATE_IMPORT_LIB, test "x$create_import_lib" = "xyes") AM_CONDITIONAL(USE_UDEV, test "x$enable_udev" = xyes) +AM_CONDITIONAL(USE_USBDK, test "x$enable_usbdk" = xyes) if test "$threads" = posix; then AC_DEFINE(THREADS_POSIX, 1, [Use POSIX Threads]) fi diff --git a/libusb/Makefile.am b/libusb/Makefile.am index 4990ada..971c5b2 100644 --- a/libusb/Makefile.am +++ b/libusb/Makefile.am @@ -17,6 +17,7 @@ COMMON_WINDOWS_SRC = os/windows_nt_common.h \ os/windows_common.h \ libusb-1.0.rc libusb-1.0.def WINDOWS_USB_SRC = os/windows_winusb.h os/windows_winusb.c $(COMMON_WINDOWS_SRC) +WINDOWS_USBDK_SRC = os/windows_usbdk.h os/windows_usbdk.c $(COMMON_WINDOWS_SRC) WINCE_USB_SRC = os/wince_usb.h os/wince_usb.c HAIKU_USB_SRC = os/haiku_usb.h os/haiku_usb_backend.cpp \ os/haiku_usb_raw.h os/haiku_usb_raw.cpp os/haiku_pollfs.cpp @@ -25,8 +26,8 @@ EXTRA_DIST = $(POSIX_POLL_SRC) $(POSIX_THREADS_SRC) \ $(WINDOWS_POLL_SRC) $(WINDOWS_THREADS_SRC) \ $(LINUX_USBFS_SRC) $(DARWIN_USB_SRC) \ $(OPENBSD_USB_SRC) $(NETBSD_USB_SRC) \ - $(WINDOWS_USB_SRC) $(WINCE_USB_SRC) \ - $(HAIKU_USB_SRC) \ + $(WINDOWS_USB_SRC) $(WINDOWS_USBDK_SRC) \ + $(WINCE_USB_SRC) $(HAIKU_USB_SRC) \ os/linux_udev.c os/linux_netlink.c if OS_LINUX @@ -59,7 +60,12 @@ libusb_1_0_la_LIBADD = libusb_haiku.la endif if OS_WINDOWS + +if USE_USBDK +OS_SRC = $(WINDOWS_USBDK_SRC) +else OS_SRC = $(WINDOWS_USB_SRC) +endif .rc.lo: $(AM_V_GEN)$(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --tag=RC --mode=compile $(RC) $(RCFLAGS) -i $< -o $@ diff --git a/msvc/ddk_build.cmd b/msvc/ddk_build.cmd index aadab50..c0b905a 100644 --- a/msvc/ddk_build.cmd +++ b/msvc/ddk_build.cmd @@ -3,20 +3,29 @@ ::# you can pass the following arguments (case insensitive): ::# - "DLL" to build a DLL instead of a static library ::# - "/MT" to build a static library compatible with MSVC's /MT option (LIBCMT vs MSVCRT) +::# - "USBDK" to build with UsbDk backend if Test%BUILD_ALT_DIR%==Test goto usage ::# process commandline parameters set TARGET=LIBRARY set STATIC_LIBC= +set WITH_USBDK= set version=1.0 set PWD=%~dp0 set BUILD_CMD=build -bcwgZ -M2 +:more_args + if "%1" == "" goto no_more_args ::# /I for case insensitive if /I Test%1==TestDLL set TARGET=DYNLINK if /I Test%1==Test/MT set STATIC_LIBC=1 +if /I Test%1==TestUSBDK set WITH_USBDK=1 + +shift +goto more_args + :no_more_args cd ..\libusb\os diff --git a/msvc/libusb_2013.sln b/msvc/libusb_2013.sln index 9d04d2c..fb05ded 100644 --- a/msvc/libusb_2013.sln +++ b/msvc/libusb_2013.sln @@ -21,6 +21,10 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "stress", "stress_2013.vcxpr EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hotplugtest", "hotplugtest_2013.vcxproj", "{99D2AC64-DC66-4422-91CE-6715C403C9E5}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libusb-usbdk-1.0 (dll)", "libusb_usbdk_dll_2013.vcxproj", "{F53A5974-2319-48EB-A67B-27933AEDF14A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libusb-usbdk-1.0 (static)", "libusb_usbdk_static_2013.vcxproj", "{0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -93,6 +97,22 @@ Global {99D2AC64-DC66-4422-91CE-6715C403C9E5}.Release|Win32.Build.0 = Release|Win32 {99D2AC64-DC66-4422-91CE-6715C403C9E5}.Release|x64.ActiveCfg = Release|x64 {99D2AC64-DC66-4422-91CE-6715C403C9E5}.Release|x64.Build.0 = Release|x64 + {F53A5974-2319-48EB-A67B-27933AEDF14A}.Debug|Win32.ActiveCfg = Debug|Win32 + {F53A5974-2319-48EB-A67B-27933AEDF14A}.Debug|Win32.Build.0 = Debug|Win32 + {F53A5974-2319-48EB-A67B-27933AEDF14A}.Debug|x64.ActiveCfg = Debug|x64 + {F53A5974-2319-48EB-A67B-27933AEDF14A}.Debug|x64.Build.0 = Debug|x64 + {F53A5974-2319-48EB-A67B-27933AEDF14A}.Release|Win32.ActiveCfg = Release|Win32 + {F53A5974-2319-48EB-A67B-27933AEDF14A}.Release|Win32.Build.0 = Release|Win32 + {F53A5974-2319-48EB-A67B-27933AEDF14A}.Release|x64.ActiveCfg = Release|x64 + {F53A5974-2319-48EB-A67B-27933AEDF14A}.Release|x64.Build.0 = Release|x64 + {0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}.Debug|Win32.ActiveCfg = Debug|Win32 + {0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}.Debug|Win32.Build.0 = Debug|Win32 + {0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}.Debug|x64.ActiveCfg = Debug|x64 + {0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}.Debug|x64.Build.0 = Debug|x64 + {0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}.Release|Win32.ActiveCfg = Release|Win32 + {0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}.Release|Win32.Build.0 = Release|Win32 + {0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}.Release|x64.ActiveCfg = Release|x64 + {0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/msvc/libusb_2015.sln b/msvc/libusb_2015.sln index da6706f..c6bd0ef 100644 --- a/msvc/libusb_2015.sln +++ b/msvc/libusb_2015.sln @@ -21,6 +21,10 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "stress", "stress_2015.vcxpr EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hotplugtest", "hotplugtest_2015.vcxproj", "{99D2AC64-DC66-4422-91CE-6715C403C9E5}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libusb-usbdk-1.0 (dll)", "libusb_usbdk_dll_2015.vcxproj", "{F53A5974-2319-48EB-A67B-27933AEDF14A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libusb-usbdk-1.0 (static)", "libusb_usbdk_static_2015.vcxproj", "{0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -93,6 +97,22 @@ Global {99D2AC64-DC66-4422-91CE-6715C403C9E5}.Release|Win32.Build.0 = Release|Win32 {99D2AC64-DC66-4422-91CE-6715C403C9E5}.Release|x64.ActiveCfg = Release|x64 {99D2AC64-DC66-4422-91CE-6715C403C9E5}.Release|x64.Build.0 = Release|x64 + {F53A5974-2319-48EB-A67B-27933AEDF14A}.Debug|Win32.ActiveCfg = Debug|Win32 + {F53A5974-2319-48EB-A67B-27933AEDF14A}.Debug|Win32.Build.0 = Debug|Win32 + {F53A5974-2319-48EB-A67B-27933AEDF14A}.Debug|x64.ActiveCfg = Debug|x64 + {F53A5974-2319-48EB-A67B-27933AEDF14A}.Debug|x64.Build.0 = Debug|x64 + {F53A5974-2319-48EB-A67B-27933AEDF14A}.Release|Win32.ActiveCfg = Release|Win32 + {F53A5974-2319-48EB-A67B-27933AEDF14A}.Release|Win32.Build.0 = Release|Win32 + {F53A5974-2319-48EB-A67B-27933AEDF14A}.Release|x64.ActiveCfg = Release|x64 + {F53A5974-2319-48EB-A67B-27933AEDF14A}.Release|x64.Build.0 = Release|x64 + {0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}.Debug|Win32.ActiveCfg = Debug|Win32 + {0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}.Debug|Win32.Build.0 = Debug|Win32 + {0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}.Debug|x64.ActiveCfg = Debug|x64 + {0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}.Debug|x64.Build.0 = Debug|x64 + {0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}.Release|Win32.ActiveCfg = Release|Win32 + {0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}.Release|Win32.Build.0 = Release|Win32 + {0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}.Release|x64.ActiveCfg = Release|x64 + {0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/msvc/libusb_sources b/msvc/libusb_sources index a0387d9..591d7f6 100644 --- a/msvc/libusb_sources +++ b/msvc/libusb_sources @@ -12,8 +12,12 @@ USE_LIBCMT=1 USE_MSVCRT=1 !ENDIF +!IFDEF WITH_USBDK +BACKEND_DEFINES="/DUSE_USBDK" +!ENDIF + INCLUDES=..;..\..\msvc;$(DDK_INC_PATH) -C_DEFINES= $(C_DEFINES) $(LIBUSB_DEFINES) /DDDKBUILD +C_DEFINES= $(C_DEFINES) $(LIBUSB_DEFINES) $(BACKEND_DEFINES) /DDDKBUILD # http://jpassing.com/2009/10/21/ltcg-issues-with-the-win7amd64-environment-of-wdk-7600/ # prevents the following error when using the 64 bit static lib with Visual Studio 2010: @@ -35,5 +39,6 @@ SOURCES=..\core.c \ threads_windows.c \ poll_windows.c \ windows_winusb.c \ + windows_usbdk.c \ windows_nt_common.c \ ..\libusb-1.0.rc diff --git a/msvc/libusb_usbdk_dll_2013.vcxproj b/msvc/libusb_usbdk_dll_2013.vcxproj new file mode 100644 index 0000000..460ec7c --- /dev/null +++ b/msvc/libusb_usbdk_dll_2013.vcxproj @@ -0,0 +1,178 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectName>libusb-usbdk-1.0 (dll)</ProjectName> + <ProjectGuid>{F53A5974-2319-48EB-A67B-27933AEDF14A}</ProjectGuid> + <RootNamespace>libusbdll</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PlatformToolset>v120</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <PlatformToolset>v120</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PlatformToolset>v120</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <PlatformToolset>v120</PlatformToolset> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup> + <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\$(Platform)\$(Configuration)\dll\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\$(Platform)\$(Configuration)\dll\libusb-usbdk-1.0\</IntDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\$(Platform)\$(Configuration)\dll\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\$(Platform)\$(Configuration)\dll\libusb-usbdk-1.0\</IntDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\$(Platform)\$(Configuration)\dll\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\$(Platform)\$(Configuration)\dll\libusb-usbdk-1.0\</IntDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\$(Platform)\$(Configuration)\dll\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\$(Platform)\$(Configuration)\dll\libusb-usbdk-1.0\</IntDir> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">libusb-usbdk-1.0</TargetName> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">libusb-usbdk-1.0</TargetName> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">libusb-usbdk-1.0</TargetName> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">libusb-usbdk-1.0</TargetName> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <Optimization>Disabled</Optimization> + <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_WIN32;USE_USBDK;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> + <WarningLevel>Level4</WarningLevel> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + </ClCompile> + <Link> + <OutputFile>$(OutDir)libusb-usbdk-1.0.dll</OutputFile> + <ModuleDefinitionFile>..\libusb\libusb-1.0.def</ModuleDefinitionFile> + <EmbedManagedResourceFile>libusb-1.0.rc;%(EmbedManagedResourceFile)</EmbedManagedResourceFile> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <Midl> + <TargetEnvironment>X64</TargetEnvironment> + </Midl> + <ClCompile> + <Optimization>Disabled</Optimization> + <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_WIN32;USE_USBDK;_WIN64;_DEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> + <WarningLevel>Level4</WarningLevel> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + </ClCompile> + <Link> + <OutputFile>$(OutDir)libusb-usbdk-1.0.dll</OutputFile> + <ModuleDefinitionFile>..\libusb\libusb-1.0.def</ModuleDefinitionFile> + <EmbedManagedResourceFile>libusb-1.0.rc;%(EmbedManagedResourceFile)</EmbedManagedResourceFile> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_WIN32;USE_USBDK;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <OutputFile>$(OutDir)libusb-usbdk-1.0.dll</OutputFile> + <ModuleDefinitionFile>..\libusb\libusb-1.0.def</ModuleDefinitionFile> + <EmbedManagedResourceFile>libusb-1.0.rc;%(EmbedManagedResourceFile)</EmbedManagedResourceFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <Midl> + <TargetEnvironment>X64</TargetEnvironment> + </Midl> + <ClCompile> + <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_WIN32;USE_USBDK;_WIN64;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <OutputFile>$(OutDir)libusb-usbdk-1.0.dll</OutputFile> + <ModuleDefinitionFile>..\libusb\libusb-1.0.def</ModuleDefinitionFile> + <EmbedManagedResourceFile>libusb-1.0.rc;%(EmbedManagedResourceFile)</EmbedManagedResourceFile> + </Link> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="..\libusb\core.c" /> + <ClCompile Include="..\libusb\descriptor.c" /> + <ClCompile Include="..\libusb\hotplug.c" /> + <ClCompile Include="..\libusb\io.c" /> + <ClCompile Include="..\libusb\os\poll_windows.c" /> + <ClCompile Include="..\libusb\os\windows_nt_common.c" /> + <ClCompile Include="..\libusb\os\windows_usbdk.c" /> + <ClCompile Include="..\libusb\strerror.c" /> + <ClCompile Include="..\libusb\sync.c" /> + <ClCompile Include="..\libusb\os\threads_windows.c" /> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\libusb\hotplug.h" /> + <ClInclude Include="..\libusb\os\windows_common.h" /> + <ClInclude Include="..\libusb\os\windows_nt_common.h" /> + <ClInclude Include="..\libusb\os\windows_usbdk.h" /> + <ClInclude Include="..\libusb\version.h" /> + <ClInclude Include="..\libusb\version_nano.h" /> + <ClInclude Include=".\config.h" /> + <ClInclude Include="..\libusb\libusb.h" /> + <ClInclude Include="..\libusb\libusbi.h" /> + <ClInclude Include="..\libusb\os\poll_windows.h" /> + <ClInclude Include="..\libusb\os\threads_windows.h" /> + </ItemGroup> + <ItemGroup> + <None Include="..\libusb\libusb-1.0.def" /> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\libusb\libusb-1.0.rc" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/msvc/libusb_usbdk_dll_2015.vcxproj b/msvc/libusb_usbdk_dll_2015.vcxproj new file mode 100644 index 0000000..448392b --- /dev/null +++ b/msvc/libusb_usbdk_dll_2015.vcxproj @@ -0,0 +1,178 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectName>libusb-usbdk-1.0 (dll)</ProjectName> + <ProjectGuid>{F53A5974-2319-48EB-A67B-27933AEDF14A}</ProjectGuid> + <RootNamespace>libusbdll</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PlatformToolset>v140</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <PlatformToolset>v140</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PlatformToolset>v140</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <PlatformToolset>v140</PlatformToolset> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup> + <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\$(Platform)\$(Configuration)\dll\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\$(Platform)\$(Configuration)\dll\libusb-usbdk-1.0\</IntDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\$(Platform)\$(Configuration)\dll\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\$(Platform)\$(Configuration)\dll\libusb-usbdk-1.0\</IntDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\$(Platform)\$(Configuration)\dll\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\$(Platform)\$(Configuration)\dll\libusb-usbdk-1.0\</IntDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\$(Platform)\$(Configuration)\dll\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\$(Platform)\$(Configuration)\dll\libusb-usbdk-1.0\</IntDir> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">libusb-usbdk-1.0</TargetName> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">libusb-usbdk-1.0</TargetName> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">libusb-usbdk-1.0</TargetName> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">libusb-usbdk-1.0</TargetName> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <Optimization>Disabled</Optimization> + <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_WIN32;USE_USBDK;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> + <WarningLevel>Level4</WarningLevel> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + </ClCompile> + <Link> + <OutputFile>$(OutDir)libusb-usbdk-1.0.dll</OutputFile> + <ModuleDefinitionFile>..\libusb\libusb-1.0.def</ModuleDefinitionFile> + <EmbedManagedResourceFile>libusb-1.0.rc;%(EmbedManagedResourceFile)</EmbedManagedResourceFile> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <Midl> + <TargetEnvironment>X64</TargetEnvironment> + </Midl> + <ClCompile> + <Optimization>Disabled</Optimization> + <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_WIN32;USE_USBDK;_WIN64;_DEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> + <WarningLevel>Level4</WarningLevel> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + </ClCompile> + <Link> + <OutputFile>$(OutDir)libusb-usbdk-1.0.dll</OutputFile> + <ModuleDefinitionFile>..\libusb\libusb-1.0.def</ModuleDefinitionFile> + <EmbedManagedResourceFile>libusb-1.0.rc;%(EmbedManagedResourceFile)</EmbedManagedResourceFile> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_WIN32;USE_USBDK;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <OutputFile>$(OutDir)libusb-usbdk-1.0.dll</OutputFile> + <ModuleDefinitionFile>..\libusb\libusb-1.0.def</ModuleDefinitionFile> + <EmbedManagedResourceFile>libusb-1.0.rc;%(EmbedManagedResourceFile)</EmbedManagedResourceFile> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <Midl> + <TargetEnvironment>X64</TargetEnvironment> + </Midl> + <ClCompile> + <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_WIN32;USE_USBDK;_WIN64;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Link> + <OutputFile>$(OutDir)libusb-usbdk-1.0.dll</OutputFile> + <ModuleDefinitionFile>..\libusb\libusb-1.0.def</ModuleDefinitionFile> + <EmbedManagedResourceFile>libusb-1.0.rc;%(EmbedManagedResourceFile)</EmbedManagedResourceFile> + </Link> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="..\libusb\core.c" /> + <ClCompile Include="..\libusb\descriptor.c" /> + <ClCompile Include="..\libusb\hotplug.c" /> + <ClCompile Include="..\libusb\io.c" /> + <ClCompile Include="..\libusb\os\poll_windows.c" /> + <ClCompile Include="..\libusb\os\windows_nt_common.c" /> + <ClCompile Include="..\libusb\os\windows_usbdk.c" /> + <ClCompile Include="..\libusb\strerror.c" /> + <ClCompile Include="..\libusb\sync.c" /> + <ClCompile Include="..\libusb\os\threads_windows.c" /> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\libusb\hotplug.h" /> + <ClInclude Include="..\libusb\os\windows_common.h" /> + <ClInclude Include="..\libusb\os\windows_nt_common.h" /> + <ClInclude Include="..\libusb\os\windows_usbdk.h" /> + <ClInclude Include="..\libusb\version.h" /> + <ClInclude Include="..\libusb\version_nano.h" /> + <ClInclude Include=".\config.h" /> + <ClInclude Include="..\libusb\libusb.h" /> + <ClInclude Include="..\libusb\libusbi.h" /> + <ClInclude Include="..\libusb\os\poll_windows.h" /> + <ClInclude Include="..\libusb\os\threads_windows.h" /> + </ItemGroup> + <ItemGroup> + <None Include="..\libusb\libusb-1.0.def" /> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\libusb\libusb-1.0.rc" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/msvc/libusb_usbdk_static_2013.vcxproj b/msvc/libusb_usbdk_static_2013.vcxproj new file mode 100644 index 0000000..19a308c --- /dev/null +++ b/msvc/libusb_usbdk_static_2013.vcxproj @@ -0,0 +1,162 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectName>libusb-usbdk-1.0 (static)</ProjectName> + <ProjectGuid>{0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}</ProjectGuid> + <RootNamespace>libusb</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PlatformToolset>v120</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <PlatformToolset>v120</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PlatformToolset>v120</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <PlatformToolset>v120</PlatformToolset> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup> + <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\$(Platform)\$(Configuration)\lib\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\$(Platform)\$(Configuration)\lib\libusb-usbdk-1.0\</IntDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\$(Platform)\$(Configuration)\lib\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\$(Platform)\$(Configuration)\lib\libusb-usbdk-1.0\</IntDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\$(Platform)\$(Configuration)\lib\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\$(Platform)\$(Configuration)\lib\libusb-usbdk-1.0\</IntDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\$(Platform)\$(Configuration)\lib\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\$(Platform)\$(Configuration)\lib\libusb-usbdk-1.0\</IntDir> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">libusb-usbdk-1.0</TargetName> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">libusb-usbdk-1.0</TargetName> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">libusb-usbdk-1.0</TargetName> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">libusb-usbdk-1.0</TargetName> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <Optimization>Disabled</Optimization> + <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_WIN32;USE_USBDK;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <WarningLevel>Level4</WarningLevel> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + </ClCompile> + <Lib> + <OutputFile>$(OutDir)libusb-usbdk-1.0.lib</OutputFile> + </Lib> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <Midl> + <TargetEnvironment>X64</TargetEnvironment> + </Midl> + <ClCompile> + <Optimization>Disabled</Optimization> + <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_WIN32;USE_USBDK;_WIN64;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <WarningLevel>Level4</WarningLevel> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + </ClCompile> + <Lib> + <OutputFile>$(OutDir)libusb-usbdk-1.0.lib</OutputFile> + </Lib> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_WIN32;USE_USBDK;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Lib> + <OutputFile>$(OutDir)libusb-usbdk-1.0.lib</OutputFile> + </Lib> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <Midl> + <TargetEnvironment>X64</TargetEnvironment> + </Midl> + <ClCompile> + <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_WIN32;USE_USBDK;_WIN64;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Lib> + <OutputFile>$(OutDir)libusb-usbdk-1.0.lib</OutputFile> + </Lib> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="..\libusb\core.c" /> + <ClCompile Include="..\libusb\descriptor.c" /> + <ClCompile Include="..\libusb\hotplug.c" /> + <ClCompile Include="..\libusb\io.c" /> + <ClCompile Include="..\libusb\os\poll_windows.c" /> + <ClCompile Include="..\libusb\os\windows_nt_common.c" /> + <ClCompile Include="..\libusb\os\windows_usbdk.c" /> + <ClCompile Include="..\libusb\strerror.c" /> + <ClCompile Include="..\libusb\sync.c" /> + <ClCompile Include="..\libusb\os\threads_windows.c" /> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\libusb\hotplug.h" /> + <ClInclude Include="..\libusb\os\windows_nt_common.h" /> + <ClInclude Include="..\libusb\os\windows_usbdk.h" /> + <ClInclude Include="..\libusb\version.h" /> + <ClInclude Include="..\libusb\version_nano.h" /> + <ClInclude Include=".\config.h" /> + <ClInclude Include="..\libusb\libusb.h" /> + <ClInclude Include="..\libusb\libusbi.h" /> + <ClInclude Include="..\libusb\os\poll_windows.h" /> + <ClInclude Include="..\libusb\os\threads_windows.h" /> + <ClInclude Include="..\libusb\os\windows_common.h" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/msvc/libusb_usbdk_static_2015.vcxproj b/msvc/libusb_usbdk_static_2015.vcxproj new file mode 100644 index 0000000..0b6208e --- /dev/null +++ b/msvc/libusb_usbdk_static_2015.vcxproj @@ -0,0 +1,162 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectName>libusb-usbdk-1.0 (static)</ProjectName> + <ProjectGuid>{0B3D86CF-5D70-41A9-B391-A2E7C5C969ED}</ProjectGuid> + <RootNamespace>libusb</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PlatformToolset>v140</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <PlatformToolset>v140</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PlatformToolset>v140</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <PlatformToolset>v140</PlatformToolset> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup> + <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\$(Platform)\$(Configuration)\lib\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)..\$(Platform)\$(Configuration)\lib\libusb-usbdk-1.0\</IntDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\$(Platform)\$(Configuration)\lib\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\$(Platform)\$(Configuration)\lib\libusb-usbdk-1.0\</IntDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\$(Platform)\$(Configuration)\lib\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)..\$(Platform)\$(Configuration)\lib\libusb-usbdk-1.0\</IntDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\$(Platform)\$(Configuration)\lib\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\$(Platform)\$(Configuration)\lib\libusb-usbdk-1.0\</IntDir> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">libusb-usbdk-1.0</TargetName> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">libusb-usbdk-1.0</TargetName> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">libusb-usbdk-1.0</TargetName> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">libusb-usbdk-1.0</TargetName> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <Optimization>Disabled</Optimization> + <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_WIN32;USE_USBDK;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <WarningLevel>Level4</WarningLevel> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + </ClCompile> + <Lib> + <OutputFile>$(OutDir)libusb-usbdk-1.0.lib</OutputFile> + </Lib> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <Midl> + <TargetEnvironment>X64</TargetEnvironment> + </Midl> + <ClCompile> + <Optimization>Disabled</Optimization> + <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_WIN32;USE_USBDK;_WIN64;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <WarningLevel>Level4</WarningLevel> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + </ClCompile> + <Lib> + <OutputFile>$(OutDir)libusb-usbdk-1.0.lib</OutputFile> + </Lib> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_WIN32;USE_USBDK;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Lib> + <OutputFile>$(OutDir)libusb-usbdk-1.0.lib</OutputFile> + </Lib> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <Midl> + <TargetEnvironment>X64</TargetEnvironment> + </Midl> + <ClCompile> + <AdditionalIncludeDirectories>.;..\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>_WIN32;USE_USBDK;_WIN64;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <WarningLevel>Level4</WarningLevel> + </ClCompile> + <Lib> + <OutputFile>$(OutDir)libusb-usbdk-1.0.lib</OutputFile> + </Lib> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="..\libusb\core.c" /> + <ClCompile Include="..\libusb\descriptor.c" /> + <ClCompile Include="..\libusb\hotplug.c" /> + <ClCompile Include="..\libusb\io.c" /> + <ClCompile Include="..\libusb\os\poll_windows.c" /> + <ClCompile Include="..\libusb\os\windows_nt_common.c" /> + <ClCompile Include="..\libusb\os\windows_usbdk.c" /> + <ClCompile Include="..\libusb\strerror.c" /> + <ClCompile Include="..\libusb\sync.c" /> + <ClCompile Include="..\libusb\os\threads_windows.c" /> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\libusb\hotplug.h" /> + <ClInclude Include="..\libusb\os\windows_nt_common.h" /> + <ClInclude Include="..\libusb\os\windows_usbdk.h" /> + <ClInclude Include="..\libusb\version.h" /> + <ClInclude Include="..\libusb\version_nano.h" /> + <ClInclude Include=".\config.h" /> + <ClInclude Include="..\libusb\libusb.h" /> + <ClInclude Include="..\libusb\libusbi.h" /> + <ClInclude Include="..\libusb\os\poll_windows.h" /> + <ClInclude Include="..\libusb\os\threads_windows.h" /> + <ClInclude Include="..\libusb\os\windows_common.h" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file -- 2.4.3 |
From: Chris D. <chr...@gm...> - 2016-01-27 09:54:44
|
Hi Dmitry, I have merged the patch series into the master branch. Thanks for all your work on this! I made some additional changes on top of these patches. If you are interested in these changes, please see the commit logs following these patch commits. Regards, Chris On Wed, Jan 20, 2016 at 7:05 AM, Dmitry Fleytman <dm...@da...> wrote: > Hello libusb-devel, > > Following is the next version of UsbDk backend patches. > The same patches are also available at https://github.com/dmitryfleytman/libusb/tree/usbdk-backend-v6 > > Thanks, > Dmitry > > ===================================================================================== > Changes since v5: > > 1. Rebased to the latest master > 2. Patches changed as suggested by Chris > > Changes since v4: > > 1. Rebased to the latest master > 2. Patch set reorganised, some functions renamed as suggested by Chris > > Changes since v3: > > 1. Added processing of USBD errors supplied by UsbDk > > Changes since v2: > > 1. UsbDk clear_halt callback implementation fixed > > Changes since v1: > > 1. Project files for Visual Studio 2013 added > 2. DDK/WDK build files updated to support builds with UsbDk backend > 3. File names changed as agreed (windows_usb.* -> windows_winusb.*) > 4. Function names in windows_nt_common.c changed as areed ("nt" dropped) > 5. UsbDk headers merged as agreed, no subfolder, one file only (windows_usbdk.h) > 6. Build tested and fixed for different MinGW versions > > Adding dynamic backend selection for UsbDk/libusb*/WinUsb configuration turned out > to be too tricky for a number of reasons, so we would like to postpone this feature > for now and return to it later along with support for attach/detach mode. > > We will also release a new usbDk version in a few days with support for persistent > hide rules feature as suggested on this list before. > > ===================================================================================== > > This series contains patches that extend Windows backend to support UsbDk. > Switch between UsbDk and WinUSB/LibusbK/Libusb0 is done at compile time > with --enable-usbdk configuration option (off by default). > > UsbDk (USB Development Kit) is a set of software components meant to provide > Windows user mode applications with direct and exclusive access to USB devices. > > Some distinctive UsbDk properties are: > > 1. UsbDk supports all types of devices and interfaces - bulk, isochronous, > composite, HID etc. > 2. Device capture process is totally dynamic, i.e. no inf files and > self-signing needed, any device can be captured. > 3. UsbDk co-exists with original device driver, when the device is not > captured original driver is loaded by the system automatically. > 4. If user mode client terminates unexpectedly for any reason system reverts > to original device driver immediately. > 5. Being USB filter driver UsbDk doesn't require WHQL-ing > as per Microsoft requirements. > > UsbDk supports all Windows OS versions staring from Windows XP, > i.e. XP/Vista/7/8/8.1/2003/2008/2008R2/2012/2012R2. > Both 32 and 64 bit architectures are supported. > > UsbDk is fully open source and distributed under Apache 2.0 license. > > UsbDk project is hosted at spice-space.org, source code repository available at: > http://cgit.freedesktop.org/spice/win32/usbdk > > Latest source tarball is at: http://www.spice-space.org/download/windows/usbdk/spice-usbdk-win-1.0-2-sources.zip > > UsbDk releases come with precompiled and signed by Red Hat binaries: > 1. 32 bit: http://www.spice-space.org/download/windows/usbdk/UsbDk_1.0.8_x86.msi > 2. 64 bit: http://www.spice-space.org/download/windows/usbdk/UsbDk_1.0.8_x64.msi > > UsbDk documentation: > 1. Short presentation: http://www.spice-space.org/docs/usbdk/UsbDk_at_a_Glance.pdf > 2. SDM: http://www.spice-space.org/docs/usbdk/UsbDk_Software_Development_Manual.pdf > 3. UsbDk architecture specificatin (part of source tree): > http://cgit.freedesktop.org/spice/win32/usbdk/tree/ARCHITECTURE > > UsbDk is maintained by Dmitry Fleytman (dm...@da...). > I'll be glad to answer your questions sent to me directly or via this mailing list. > > What do you think about this series? > We will be glad to have it accepted into libusb upstream. > > Best Regards, > Dmitry > > Dmitry Fleytman (4): > windows: Move common definitions to a separate file > windows: Rename windows_usb.h/c windows_winusb.h/c > usbdk: Introduce usbdk backend > build: Integrate usbdk backend > > configure.ac | 9 + > libusb/Makefile.am | 16 +- > libusb/core.c | 6 + > libusb/libusbi.h | 1 + > libusb/os/windows_nt_common.c | 616 ++++ > libusb/os/windows_nt_common.h | 58 + > libusb/os/windows_usb.c | 4645 ------------------------------- > libusb/os/windows_usb.h | 973 ------- > libusb/os/windows_usbdk.c | 951 +++++++ > libusb/os/windows_usbdk.h | 126 + > libusb/os/windows_winusb.c | 4144 +++++++++++++++++++++++++++ > libusb/os/windows_winusb.h | 947 +++++++ > msvc/ddk_build.cmd | 9 + > msvc/libusb_2013.sln | 20 + > msvc/libusb_2015.sln | 20 + > msvc/libusb_dll.dsp | 4 +- > msvc/libusb_dll_2005.vcproj | 4 +- > msvc/libusb_dll_2010.vcxproj | 4 +- > msvc/libusb_dll_2010.vcxproj.filters | 4 +- > msvc/libusb_dll_2012.vcxproj | 4 +- > msvc/libusb_dll_2012.vcxproj.filters | 4 +- > msvc/libusb_dll_2013.vcxproj | 6 +- > msvc/libusb_dll_2015.vcxproj | 6 +- > msvc/libusb_sources | 10 +- > msvc/libusb_static.dsp | 4 +- > msvc/libusb_static_2005.vcproj | 4 +- > msvc/libusb_static_2010.vcxproj | 4 +- > msvc/libusb_static_2010.vcxproj.filters | 4 +- > msvc/libusb_static_2012.vcxproj | 4 +- > msvc/libusb_static_2012.vcxproj.filters | 4 +- > msvc/libusb_static_2013.vcxproj | 6 +- > msvc/libusb_static_2015.vcxproj | 6 +- > msvc/libusb_usbdk_dll_2013.vcxproj | 178 ++ > msvc/libusb_usbdk_dll_2015.vcxproj | 178 ++ > msvc/libusb_usbdk_static_2013.vcxproj | 162 ++ > msvc/libusb_usbdk_static_2015.vcxproj | 162 ++ > 36 files changed, 7648 insertions(+), 5655 deletions(-) > create mode 100644 libusb/os/windows_nt_common.c > create mode 100644 libusb/os/windows_nt_common.h > delete mode 100644 libusb/os/windows_usb.c > delete mode 100644 libusb/os/windows_usb.h > create mode 100644 libusb/os/windows_usbdk.c > create mode 100644 libusb/os/windows_usbdk.h > create mode 100644 libusb/os/windows_winusb.c > create mode 100644 libusb/os/windows_winusb.h > create mode 100644 msvc/libusb_usbdk_dll_2013.vcxproj > create mode 100644 msvc/libusb_usbdk_dll_2015.vcxproj > create mode 100644 msvc/libusb_usbdk_static_2013.vcxproj > create mode 100644 msvc/libusb_usbdk_static_2015.vcxproj > > -- > 2.4.3 > |
From: Dmitry F. <dm...@da...> - 2016-01-27 11:40:14
|
Thanks a lot for your help, Chris! > On 27 Jan 2016, at 11:54 AM, Chris Dickens <chr...@gm...> wrote: > > Hi Dmitry, > > I have merged the patch series into the master branch. Thanks for all > your work on this! > > I made some additional changes on top of these patches. If you are > interested in these changes, please see the commit logs following > these patch commits. > > Regards, > Chris > > On Wed, Jan 20, 2016 at 7:05 AM, Dmitry Fleytman <dm...@da...> wrote: >> Hello libusb-devel, >> >> Following is the next version of UsbDk backend patches. >> The same patches are also available at https://github.com/dmitryfleytman/libusb/tree/usbdk-backend-v6 >> >> Thanks, >> Dmitry >> >> ===================================================================================== >> Changes since v5: >> >> 1. Rebased to the latest master >> 2. Patches changed as suggested by Chris >> >> Changes since v4: >> >> 1. Rebased to the latest master >> 2. Patch set reorganised, some functions renamed as suggested by Chris >> >> Changes since v3: >> >> 1. Added processing of USBD errors supplied by UsbDk >> >> Changes since v2: >> >> 1. UsbDk clear_halt callback implementation fixed >> >> Changes since v1: >> >> 1. Project files for Visual Studio 2013 added >> 2. DDK/WDK build files updated to support builds with UsbDk backend >> 3. File names changed as agreed (windows_usb.* -> windows_winusb.*) >> 4. Function names in windows_nt_common.c changed as areed ("nt" dropped) >> 5. UsbDk headers merged as agreed, no subfolder, one file only (windows_usbdk.h) >> 6. Build tested and fixed for different MinGW versions >> >> Adding dynamic backend selection for UsbDk/libusb*/WinUsb configuration turned out >> to be too tricky for a number of reasons, so we would like to postpone this feature >> for now and return to it later along with support for attach/detach mode. >> >> We will also release a new usbDk version in a few days with support for persistent >> hide rules feature as suggested on this list before. >> >> ===================================================================================== >> >> This series contains patches that extend Windows backend to support UsbDk. >> Switch between UsbDk and WinUSB/LibusbK/Libusb0 is done at compile time >> with --enable-usbdk configuration option (off by default). >> >> UsbDk (USB Development Kit) is a set of software components meant to provide >> Windows user mode applications with direct and exclusive access to USB devices. >> >> Some distinctive UsbDk properties are: >> >> 1. UsbDk supports all types of devices and interfaces - bulk, isochronous, >> composite, HID etc. >> 2. Device capture process is totally dynamic, i.e. no inf files and >> self-signing needed, any device can be captured. >> 3. UsbDk co-exists with original device driver, when the device is not >> captured original driver is loaded by the system automatically. >> 4. If user mode client terminates unexpectedly for any reason system reverts >> to original device driver immediately. >> 5. Being USB filter driver UsbDk doesn't require WHQL-ing >> as per Microsoft requirements. >> >> UsbDk supports all Windows OS versions staring from Windows XP, >> i.e. XP/Vista/7/8/8.1/2003/2008/2008R2/2012/2012R2. >> Both 32 and 64 bit architectures are supported. >> >> UsbDk is fully open source and distributed under Apache 2.0 license. >> >> UsbDk project is hosted at spice-space.org, source code repository available at: >> http://cgit.freedesktop.org/spice/win32/usbdk >> >> Latest source tarball is at: http://www.spice-space.org/download/windows/usbdk/spice-usbdk-win-1.0-2-sources.zip >> >> UsbDk releases come with precompiled and signed by Red Hat binaries: >> 1. 32 bit: http://www.spice-space.org/download/windows/usbdk/UsbDk_1.0.8_x86.msi >> 2. 64 bit: http://www.spice-space.org/download/windows/usbdk/UsbDk_1.0.8_x64.msi >> >> UsbDk documentation: >> 1. Short presentation: http://www.spice-space.org/docs/usbdk/UsbDk_at_a_Glance.pdf >> 2. SDM: http://www.spice-space.org/docs/usbdk/UsbDk_Software_Development_Manual.pdf >> 3. UsbDk architecture specificatin (part of source tree): >> http://cgit.freedesktop.org/spice/win32/usbdk/tree/ARCHITECTURE >> >> UsbDk is maintained by Dmitry Fleytman (dm...@da...). >> I'll be glad to answer your questions sent to me directly or via this mailing list. >> >> What do you think about this series? >> We will be glad to have it accepted into libusb upstream. >> >> Best Regards, >> Dmitry >> >> Dmitry Fleytman (4): >> windows: Move common definitions to a separate file >> windows: Rename windows_usb.h/c windows_winusb.h/c >> usbdk: Introduce usbdk backend >> build: Integrate usbdk backend >> >> configure.ac | 9 + >> libusb/Makefile.am | 16 +- >> libusb/core.c | 6 + >> libusb/libusbi.h | 1 + >> libusb/os/windows_nt_common.c | 616 ++++ >> libusb/os/windows_nt_common.h | 58 + >> libusb/os/windows_usb.c | 4645 ------------------------------- >> libusb/os/windows_usb.h | 973 ------- >> libusb/os/windows_usbdk.c | 951 +++++++ >> libusb/os/windows_usbdk.h | 126 + >> libusb/os/windows_winusb.c | 4144 +++++++++++++++++++++++++++ >> libusb/os/windows_winusb.h | 947 +++++++ >> msvc/ddk_build.cmd | 9 + >> msvc/libusb_2013.sln | 20 + >> msvc/libusb_2015.sln | 20 + >> msvc/libusb_dll.dsp | 4 +- >> msvc/libusb_dll_2005.vcproj | 4 +- >> msvc/libusb_dll_2010.vcxproj | 4 +- >> msvc/libusb_dll_2010.vcxproj.filters | 4 +- >> msvc/libusb_dll_2012.vcxproj | 4 +- >> msvc/libusb_dll_2012.vcxproj.filters | 4 +- >> msvc/libusb_dll_2013.vcxproj | 6 +- >> msvc/libusb_dll_2015.vcxproj | 6 +- >> msvc/libusb_sources | 10 +- >> msvc/libusb_static.dsp | 4 +- >> msvc/libusb_static_2005.vcproj | 4 +- >> msvc/libusb_static_2010.vcxproj | 4 +- >> msvc/libusb_static_2010.vcxproj.filters | 4 +- >> msvc/libusb_static_2012.vcxproj | 4 +- >> msvc/libusb_static_2012.vcxproj.filters | 4 +- >> msvc/libusb_static_2013.vcxproj | 6 +- >> msvc/libusb_static_2015.vcxproj | 6 +- >> msvc/libusb_usbdk_dll_2013.vcxproj | 178 ++ >> msvc/libusb_usbdk_dll_2015.vcxproj | 178 ++ >> msvc/libusb_usbdk_static_2013.vcxproj | 162 ++ >> msvc/libusb_usbdk_static_2015.vcxproj | 162 ++ >> 36 files changed, 7648 insertions(+), 5655 deletions(-) >> create mode 100644 libusb/os/windows_nt_common.c >> create mode 100644 libusb/os/windows_nt_common.h >> delete mode 100644 libusb/os/windows_usb.c >> delete mode 100644 libusb/os/windows_usb.h >> create mode 100644 libusb/os/windows_usbdk.c >> create mode 100644 libusb/os/windows_usbdk.h >> create mode 100644 libusb/os/windows_winusb.c >> create mode 100644 libusb/os/windows_winusb.h >> create mode 100644 msvc/libusb_usbdk_dll_2013.vcxproj >> create mode 100644 msvc/libusb_usbdk_dll_2015.vcxproj >> create mode 100644 msvc/libusb_usbdk_static_2013.vcxproj >> create mode 100644 msvc/libusb_usbdk_static_2015.vcxproj >> >> -- >> 2.4.3 >> |