On 2022-01-24 12:26, Stefan Dösinger wrote:
Am Montag, 24. Jänner 2022, 13:13:23 EAT schrieb Daniel Kucera:
I am reversing the driver and I'll create a Linux char device to handle those ioctl calls and talk to the USB device using libusb.
If I understand you right you want to create a $WINEPREFIX/dosdevices/d6CDE-0 link to whatever char device your Linux driver creates, and that doesn't work because Wine will only do that for COM ports and other drives?
I can create the link but wine refuses to open the device because it doesn't match any of the defined device prefixes: https://github.com/wine-mirror/wine/blob/e909986e6ea5ecd49b2b847f321ad89b2ae...
From Wine's point of view the proper solution is to load the original Windows device driver, have it talk to the USB hardware via libusb and the Windows software via the device it creates. Wine nowadays should have infrastructure to support that. I haven't used it myself though.
I was researching this option but I haven't even found a way to load a driver. Besides, if the original driver doesn't work out-of-the-box (which I presume it won't), I am not really able to write/compile wine/Windows driver.
Beyond opening the device name, how would the ioctl forward work? Is it some standard serial port ioctl that pass throuh Wine to your driver fine? Or would you need to teach Wine to forward them as well?
So what works for me now is, that when I create the link COM81 -> /dev/hantek and create the device using cuse (https://libfuse.github.io/doxygen/cuse_8c.html) , the software is able to open the device:
FUSE library version: 3.10.3 unique: 2, opcode: CUSE_INIT (4096), nodeid: 0, insize: 56, pid: 1568849 CUSE_INIT: 7.34 flags=0x00000001 CUSE_INIT: 7.31 flags=0x00000001 max_read=0x00020000 max_write=0x00100000 dev_major=0 dev_minor=0 dev_info: DEVNAME=hantek unique: 2, success, outsize: 103 unique: 4, opcode: OPEN (14), nodeid: 0, insize: 48, pid: 1568962 unique: 4, success, outsize: 32 unique: 6, opcode: IOCTL (39), nodeid: 0, insize: 72, pid: 1568962 unknown ioctld 21505 unique: 6, error: -22 (Invalid argument), outsize: 16 unique: 8, opcode: RELEASE (18), nodeid: 0, insize: 64, pid: 0 unique: 8, success, outsize: 16
The software is calling DeviceIoControl() which results in ioctl calls in wine server and ends here: https://github.com/wine-mirror/wine/blob/master/server/fd.c#L2408
To forward the call to device, I would need to modify this function, something in this sense:
diff --git a/server/fd.c b/server/fd.c index 5d80e218b97..627b44fc195 100644 --- a/server/fd.c +++ b/server/fd.c @@ -2261,7 +2261,8 @@ int default_fd_ioctl( struct fd *fd, ioctl_code_t code, struct async *async ) unmount_device( fd ); return 1; default: - set_error( STATUS_NOT_SUPPORTED ); + ioctl(fd->unix_fd, code, ioctl_data); // how the get the call data here? + //set_error( STATUS_NOT_SUPPORTED ); return 0; } }