Hello,
trying to use the supplied or the mingw (cross) compiled libusb0.sys from sourceforge with the USB enabled tree from http://git.etersoft.ru/people/lav/packages/wine.git
loading libusb0.sys fails:
trace:winedevice:ServiceMain starting service L"libusb0" trace:winedevice:load_driver loading driver L"c:\windows\system32\drivers\libusb0.sys" trace:winedevice:load_driver_module name L"c:\windows\system32\drivers\libusb0.sys" module (nil) trace:winedevice:ServiceMain driver L"libusb0" failed to load trace:winedevice:ServiceMain service L"libusb0" stopped
Using some other USB driver instead of libusb0.sys at least loads:
trace:winedevice:load_driver loading driver L"c:\windows\system32\drivers\ezusb.sys" trace:winedevice:load_driver_module name L"c:\windows\system32\drivers\ezusb.sys" module 0x81340000 trace:winedevice:load_driver_module L"c:\windows\system32\drivers\ezusb.sys": relocating from 0x10000 to 0x81340000 trace:winedevice:load_driver_module name L"NTOSKRNL.EXE" module 0x84b70000 trace:winedevice:load_driver_module name L"HAL.DLL" module 0x84590000 trace:winedevice:load_driver_module name L"USBD.SYS" module 0x84580000 trace:winedevice:init_driver trace:winedevice:init_driver init done for L"libusb0" obj 0x84c0a560
The failure happens in program/winedevices/devices.c: static HMODULE load_driver_module( const WCHAR *name ) { IMAGE_NT_HEADERS *nt; const IMAGE_IMPORT_DESCRIPTOR *imports; size_t page_size = getpagesize(); int i, delta; ULONG size; --> HMODULE module = LoadLibraryW( name );
if (!module) return NULL;
LoadLibraryW loads the file and then calls the DriverEntry of libusb0:
NTSTATUS DDKAPI DriverEntry(DRIVER_OBJECT *driver_object, UNICODE_STRING *registry_path) { int i;
DEBUG_MESSAGE("DriverEntry(): loading driver");
/* initialize global variables */ debug_level = LIBUSB_DEBUG_MSG;
/* initialize the driver object's dispatch table */ for(i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) { driver_object->MajorFunction[i] = dispatch; }
driver_object->DriverExtension->AddDevice = add_device; driver_object->DriverUnload = unload;
return STATUS_SUCCESS; }
While loading, the protection is set to 0014:trace:virtual:VIRTUAL_DumpView 0x68640000 - 0x68640fff c-r--
and driver_object is in the 0x68640000 pages and so writing to driver_object->MajorFunction[i] through an exception and the function fails.
I guess libusb0.sys works on WIN32, so here our loader does something wrong or perhaps is not bug-to-bug compatible.
Any fixes?
Thanks