Re: [pyusb-users] pyusb1 picks wrong driver on Windows

2016-08-13 Thread Wander Lairson Costa
Hi,

PyUSB relies on ctypes for finding libraries, which relies on Windows
library search policy, if it finds libusb1 first, then that's what it
assumes as the backend. backend parameter was designed for cases like
yours, when the default backend discovery policy doesn't apply.
Anyway, you code may be helpful to improve the search code, would you
mind opening a issue?

2016-08-13 4:34 GMT-03:00 Hermann Hamann :
> Dear maintainers,
> my client and I have the same USB-Device. I have written a program for it.
> It runs fine on both Linux systems. It runs fine on my Windows but crashes
> on my client's.
> Both have installed the driver with inf-wizard and the system control shows
> libusb0.dll on
> both machines.
>
> However, pyusb1 does not care about it; there is no single line related to
> the registry in the code.
> Instead pyusb started searching with pyusb1 backend and finds some libusb1
> in some private direcory
> of some other device. And crashed.
>
> This is not acceptable.
> I have written a demo to fetch the correct service from the registry, it
> follows here:
> -
> from __future__ import print_function
> # call this only on Windows
> try:
> from _winreg import *
> except:
> from winreg import *
> def getService(vid,pid):
> vidpid = r"\VID_%04x_%04x" % (vid,pid)
> path = r"SYSTEM\ControlSet002\ENUM\USB" + vidpid
> key = OpenKey(HKEY_LOCAL_MACHINE,path,0,KEY_READ)
> try:
> i = 0
> enumkey = EnumKey(key,i)
> i = i + 1
> except Exception as message:
> pass # print("enumkey",message)
>
> newkey = OpenKeyEx(key,enumkey,0,KEY_READ)
> service,Size = QueryValueEx(newkey,"Service")
> return service
> if __name__ == "__main__":
> print ("service for 0x5656 0x0834 is",getService(0x5656,0x0834))
> -
> The output is
> "service for 0x5656 0x0834 is libusb0"
>
> I am aware of the backend=xxx switches and the findlibrary hooks.
> They are useful to override defaults in special cases.
>
> However this does not answer the question which defaults are appropiate in
> the normal case.
> On Windows the registry entry is the most appropriate default.
>
> I hope this can help you to amend pyusb1 (which is a great tool anyway).
>
> Sincerely Hermann Hamann
>
>
>
> --
> What NetFlow Analyzer can do for you? Monitors network bandwidth and traffic
> patterns at an interface-level. Reveals which users, apps, and protocols are
> consuming the most bandwidth. Provides multi-vendor support for NetFlow,
> J-Flow, sFlow and other flows. Make informed decisions using capacity
> planning reports. http://sdm.link/zohodev2dev
> ___
> pyusb-users mailing list
> pyusb-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/pyusb-users
>



-- 
Best Regards,
Wander Lairson Costa

--
What NetFlow Analyzer can do for you? Monitors network bandwidth and traffic
patterns at an interface-level. Reveals which users, apps, and protocols are 
consuming the most bandwidth. Provides multi-vendor support for NetFlow, 
J-Flow, sFlow and other flows. Make informed decisions using capacity 
planning reports. http://sdm.link/zohodev2dev
___
pyusb-users mailing list
pyusb-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/pyusb-users


[pyusb-users] pyusb1 picks wrong driver on Windows

2016-08-13 Thread Hermann Hamann


Dear maintainers,

my client and I have the same USB-Device. I have written a program for it.
It runs fine on both Linux systems. It runs fine on my Windows but crashes on my client's.

Both have installed the driver with inf-wizard and the system control shows libusb0.dll on
both machines.

 

However, pyusb1 does not care about it; there is no single line related to the registry in the code.

Instead pyusb started searching with pyusb1 backend and finds some libusb1 in some private direcory
of some other device. And crashed.

 

This is not acceptable.

I have written a demo to fetch the correct service from the registry, it follows here:

-

from __future__ import print_function

# call this only on Windows

try:
    from _winreg import *
except:
    from winreg import *

def getService(vid,pid):
    vidpid = r"\VID_%04x_%04x" % (vid,pid)
    path = r"SYSTEM\ControlSet002\ENUM\USB" + vidpid
    key = OpenKey(HKEY_LOCAL_MACHINE,path,0,KEY_READ)

    try:
    i = 0
    enumkey = EnumKey(key,i)
    i = i + 1
    except Exception as message:
    pass # print("enumkey",message)
    
    newkey = OpenKeyEx(key,enumkey,0,KEY_READ)
    service,Size = QueryValueEx(newkey,"Service")
    return service

if __name__ == "__main__":
    print ("service for 0x5656 0x0834 is",getService(0x5656,0x0834))

-

The output is
"service for 0x5656 0x0834 is libusb0"

 

I am aware of the backend=xxx switches and the findlibrary hooks.

They are useful to override defaults in special cases.

 

However this does not answer the question which defaults are appropiate in the normal case.

On Windows the registry entry is the most appropriate default.

 

I hope this can help you to amend pyusb1 (which is a great tool anyway).

 

Sincerely Hermann Hamann

 


 




--
What NetFlow Analyzer can do for you? Monitors network bandwidth and traffic
patterns at an interface-level. Reveals which users, apps, and protocols are 
consuming the most bandwidth. Provides multi-vendor support for NetFlow, 
J-Flow, sFlow and other flows. Make informed decisions using capacity 
planning reports. http://sdm.link/zohodev2dev___
pyusb-users mailing list
pyusb-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/pyusb-users