From 1b463a801efae2bf04b916ec2500e6491bf67dd2 Mon Sep 17 00:00:00 2001 From: radiomanV Date: Wed, 10 Jan 2018 15:51:52 +0200 Subject: [PATCH] Update wine wrapper to autodetect the MiniPro version --- wine/Makefile | 6 ++---- wine/setupapi.dll | Bin 93264 -> 93476 bytes wine/usb.c | 46 +++++++++++++++++++++++----------------------- 3 files changed, 25 insertions(+), 27 deletions(-) mode change 100644 => 100755 wine/setupapi.dll diff --git a/wine/Makefile b/wine/Makefile index 97a8295..fff3629 100644 --- a/wine/Makefile +++ b/wine/Makefile @@ -1,7 +1,7 @@ ### Generated by Winemaker 0.8.4 ### ### Invocation command line was -### /usr/bin/winemaker -lusb-1.0 -ludev -lpthread --dll --nosource-fix --nobackup --nomsvcrt --nodlls ./ +### /usr/bin/winemaker -lusb-1.0 -ludev --dll --nosource-fix --nobackup --nomsvcrt --nodlls ./ SRCDIR = . @@ -22,9 +22,7 @@ INCLUDE_PATH = DLL_PATH = DLL_IMPORTS = LIBRARY_PATH = -LIBRARIES = -lusb-1.0 \ - -ludev \ - -lpthread +LIBRARIES = -lusb-1.0 -ludev ### usb.dll sources and settings diff --git a/wine/setupapi.dll b/wine/setupapi.dll old mode 100644 new mode 100755 index 75f1859c392a09fc1a80688c83b1fb25f2370a11..9ff547a6eef505300e9f628332db87c540bd5a3a GIT binary patch delta 9496 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 bu>ozvKVqiKD-{$Ic=d4-f0Gf*sr&x}3h@DD diff --git a/wine/usb.c b/wine/usb.c index f6e8cbc..ff9a3be 100644 --- a/wine/usb.c +++ b/wine/usb.c @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #include @@ -43,8 +42,8 @@ libusb_device_handle *device_handle[4]; libusb_context *ctx; libusb_device **devs; -pthread_t notifier_id; -pthread_mutex_t lock; +CRITICAL_SECTION lock; +HANDLE h_thread; HWND hWnd; BOOL cancel; @@ -144,7 +143,7 @@ BOOL patch_minipro() printf("Usb Handle found at 0x%08X\n", (DWORD)p_usbhandle); printf("Patched RegisterDeviceNotification at 0x%08X\n", func_addr); - + InitializeCriticalSection (&lock); //Patch all low level functions in MiniPro.exe to point to our custom functions. BYTE t[] = { 0x68, 0, 0, 0, 0, 0xc3 };// push xxxx, ret; an absolute Jump replacement. @@ -215,14 +214,14 @@ int open_devices(GUID guid, int *devices) for (i = 0; i < count; i++) { ret = libusb_get_device_descriptor(devs[i], &desc); - if (ret < 0) + if (ret != LIBUSB_SUCCESS) { return 0; } if (TL866_PID == desc.idProduct && TL866_VID == desc.idVendor) { - if (libusb_open(devs[i], &device_handle[devices_found]) == 0) + if (libusb_open(devs[i], &device_handle[devices_found]) == LIBUSB_SUCCESS) { usb_handle[devices_found] = (HANDLE)devices_found; devices_found++; @@ -244,7 +243,7 @@ void close_devices() { int i; - pthread_mutex_lock(&lock); + EnterCriticalSection(&lock); for (i = 0; i < 4; i++) { if (device_handle[i] != NULL) @@ -256,25 +255,25 @@ void close_devices() libusb_free_device_list(devs, 1); libusb_exit(ctx);//close session devs = NULL; - pthread_mutex_unlock(&lock); + LeaveCriticalSection(&lock); } } BOOL usb_write(unsigned char *lpInBuffer, unsigned int nInBufferSize) { - pthread_mutex_lock(&lock); + EnterCriticalSection(&lock); BOOL ret = uwrite(0, lpInBuffer, nInBufferSize); - pthread_mutex_unlock(&lock); + LeaveCriticalSection(&lock); return ret; } unsigned int usb_read(unsigned char *lpOutBuffer, unsigned int nBytesToRead, unsigned int nOutBufferSize) { - pthread_mutex_lock(&lock); + EnterCriticalSection(&lock); unsigned int ret = uread(0, lpOutBuffer, nBytesToRead); - pthread_mutex_unlock(&lock); + LeaveCriticalSection(&lock); if (ret == 0xFFFFFFFF) MessageBoxA(GetForegroundWindow(), "Read error!", "TL866", MB_ICONWARNING); return ret; @@ -283,18 +282,18 @@ unsigned int usb_read(unsigned char *lpOutBuffer, unsigned int nBytesToRead, uns BOOL usb_write2(HANDLE hDevice, unsigned char *lpInBuffer, unsigned int nInBufferSize) { - pthread_mutex_lock(&lock); + EnterCriticalSection(&lock); BOOL ret = uwrite(hDevice, lpInBuffer, nInBufferSize); - pthread_mutex_unlock(&lock); + LeaveCriticalSection(&lock); return ret; } unsigned int usb_read2(HANDLE hDevice, unsigned char *lpOutBuffer, unsigned int nBytesToRead, unsigned int nOutBufferSize) { - pthread_mutex_lock(&lock); + EnterCriticalSection(&lock); unsigned int ret = uread(hDevice, lpOutBuffer, nBytesToRead); - pthread_mutex_unlock(&lock); + LeaveCriticalSection(&lock); return ret; } @@ -304,8 +303,8 @@ HANDLE __stdcall RegisterDeviceNotifications(HANDLE hRecipient, LPVOID Notificat printf("RegisterDeviceNotifications hWnd=%X4\n", (unsigned int)hRecipient); hWnd = hRecipient; - int tr = pthread_create(¬ifier_id, NULL, (void*)notifier_function, NULL); - if (tr) + h_thread = CreateThread(NULL, 0, (void*)notifier_function, NULL, 0, NULL); + if(! h_thread) printf("Thread notifier failed.\n"); return 0; @@ -321,7 +320,7 @@ unsigned int uread(HANDLE hDevice, unsigned char *data, size_t size) if (device_handle[(int)hDevice] == NULL) return 0; size_t bytes_read; - if (libusb_claim_interface(device_handle[(int)hDevice], 0) < 0) + if (libusb_claim_interface(device_handle[(int)hDevice], 0) != LIBUSB_SUCCESS) return 0; int ret = libusb_bulk_transfer(device_handle[(int)hDevice], LIBUSB_ENDPOINT_IN | 1, data, size, &bytes_read, 3000); libusb_release_interface(device_handle[(int)hDevice], 0); @@ -336,7 +335,7 @@ BOOL uwrite(HANDLE hDevice, unsigned char *data, size_t size) if (device_handle[(int)hDevice] == NULL) return 0; size_t bytes_writen; - if (libusb_claim_interface(device_handle[(int)hDevice], 0) < 0) + if (libusb_claim_interface(device_handle[(int)hDevice], 0) != LIBUSB_SUCCESS) return 0; int ret = libusb_bulk_transfer(device_handle[(int)hDevice], LIBUSB_ENDPOINT_OUT | 1, data, size, &bytes_writen, 3000); libusb_release_interface(device_handle[(int)hDevice], 0); @@ -398,7 +397,7 @@ void notifier_function() dev = udev_monitor_receive_device(mon); if (dev && !strcmp(udev_device_get_devtype(dev), "usb_device")) { int count_new; - if (!strcmp(udev_device_get_action(dev), "add")) + if (!strcasecmp(udev_device_get_action(dev), "add")) { count_new = get_device_count(); if (count != count_new) @@ -413,7 +412,7 @@ void notifier_function() } } - else if (!strcmp(udev_device_get_action(dev), "remove")) + else if (!strcasecmp(udev_device_get_action(dev), "remove")) { count_new = get_device_count(); if (count != count_new) @@ -493,7 +492,8 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) break; case DLL_PROCESS_DETACH: cancel = TRUE; - pthread_join(notifier_id, NULL); + WaitForSingleObject(h_thread, 5000); + DeleteCriticalSection(&lock); break; }