Adding support for a USB device

Rolf Kalbermatter rolf.kalbermatter at citeng.com
Wed Dec 10 12:22:37 CST 2003


Message: 2
Date: Tue, 9 Dec 2003 14:56:16 -0800
Subject: Adding support for a USB device
From: Dan Timis <timis at museresearch.com>
To: wine-devel at winehq.org

Hi,

>I need help with supporting a particular USB device under wine.  I have 
>to start by saying that although I am an experienced C/C++ programmer 
>with some Linux experience, I have almost no Windows or wine experience.
>
>The Windows code for which I need to provide support uses CreateFile() 
>to get a handle to the device.  The name of the device is something 
>like "\\.\MyDevice0" "\\.\MyDevice1" and so on.  Then, the code uses 
>DeviceIoControl() to read and write from/to the device.  The 
>requirement is not to change the windows code.
>
>I looked through the wine code and I found this in device.c:
>
>static const struct VxDInfo VxDList[]
>
>I could add another entry into the table and write a deviceio handler 
>(BOOL  (*deviceio)(DWORD, LPVOID, DWORD, LPVOID, DWORD, LPDWORD, 
>LPOVERLAPPED);).  I wrote some test code in Linux using libusb reading 
>and writing to the device so I know what to do inside the deviceio 
>handler.
>
>Is this the right approach?  If so, what do I need to do to get 
>CreateFile to return the right handle?

I think it really depends on the type of device and the possibility to
rewrite the device driver or not.

\\.\MyDevice0 is just a device driver name which at some point is
registered in the registry with the appropriate VXD, SYS, or WDM
driver file. If you know the exact DeviceIOControls called into that
driver with its parameters and all, you could rewrite the VXD, SYS or
WDM driver to call directly the appropriate Unix device driver calls
and maybe compile it as a Winelib driver. 
With a bit hacking in the CreateFile function it should be possible to
call such a driver over DeviceIOControl or you could add the according
code to the above mentioned VXDList.

>Or should I write an external driver that gets loaded by wine?  If so, 
>how would I do that?  What are the chances that the Windows driver for 
>this device would just work with wine?

If you don't know these details and want to use the original device
driver you are probably out of luck. The current CreateFile implementation
is not really up to the task of loading an external native device driver
and invoke it over the DeviceIOControl (which could probably be remedied
with a little hacking at this point) and what is much more problematic
there is little or no support for a lot of the Windows kernel services
most device driver usually expect to be able to call. When they are not
able to link to one or more of those functions at load time, loading of
the device driver will simply fail in Wine, as it does with normal DLL
files under all Win32 implementations, too.

Rolf Kalbermatter





More information about the wine-devel mailing list