1ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch/* 2ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * Windows backend common header for libusbx 1.0 3ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * 4ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * This file brings together header code common between 5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * the desktop Windows and Windows CE backends. 6ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * Copyright © 2012-2013 RealVNC Ltd. 7ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * Copyright © 2009-2012 Pete Batard <pete@akeo.ie> 8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * With contributions from Michael Plante, Orin Eman et al. 9ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer 10ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * Major code testing contribution by Xiaofan Chen 11ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * 12ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * This library is free software; you can redistribute it and/or 13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * modify it under the terms of the GNU Lesser General Public 14ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * License as published by the Free Software Foundation; either 15ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * version 2.1 of the License, or (at your option) any later version. 16ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * 17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * This library is distributed in the hope that it will be useful, 18ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * but WITHOUT ANY WARRANTY; without even the implied warranty of 19ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 20ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * Lesser General Public License for more details. 21ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * 22ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * You should have received a copy of the GNU Lesser General Public 23ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * License along with this library; if not, write to the Free Software 24ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 25ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch */ 26ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 27ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#pragma once 28ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 29ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Windows API default is uppercase - ugh! 30ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if !defined(bool) 31ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define bool BOOL 32ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 33ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if !defined(true) 34ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define true TRUE 35ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 36ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if !defined(false) 37ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define false FALSE 38ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 39ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 40ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define safe_free(p) do {if (p != NULL) {free((void*)p); p = NULL;}} while(0) 41ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define safe_closehandle(h) do {if (h != INVALID_HANDLE_VALUE) {CloseHandle(h); h = INVALID_HANDLE_VALUE;}} while(0) 42ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define safe_min(a, b) min((size_t)(a), (size_t)(b)) 43ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define safe_strcp(dst, dst_max, src, count) do {memcpy(dst, src, safe_min(count, dst_max)); \ 44ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ((char*)dst)[safe_min(count, dst_max)-1] = 0;} while(0) 45ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define safe_strcpy(dst, dst_max, src) safe_strcp(dst, dst_max, src, safe_strlen(src)+1) 46ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define safe_strncat(dst, dst_max, src, count) strncat(dst, src, safe_min(count, dst_max - safe_strlen(dst) - 1)) 47ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define safe_strcat(dst, dst_max, src) safe_strncat(dst, dst_max, src, safe_strlen(src)+1) 48ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define safe_strcmp(str1, str2) strcmp(((str1==NULL)?"<NULL>":str1), ((str2==NULL)?"<NULL>":str2)) 49ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define safe_stricmp(str1, str2) _stricmp(((str1==NULL)?"<NULL>":str1), ((str2==NULL)?"<NULL>":str2)) 50ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define safe_strncmp(str1, str2, count) strncmp(((str1==NULL)?"<NULL>":str1), ((str2==NULL)?"<NULL>":str2), count) 51ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define safe_strlen(str) ((str==NULL)?0:strlen(str)) 52ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define safe_sprintf(dst, count, ...) do {_snprintf(dst, count, __VA_ARGS__); (dst)[(count)-1] = 0; } while(0) 53ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define safe_stprintf _sntprintf 54ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define safe_tcslen(str) ((str==NULL)?0:_tcslen(str)) 55ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define safe_unref_device(dev) do {if (dev != NULL) {libusb_unref_device(dev); dev = NULL;}} while(0) 56ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define wchar_to_utf8_ms(wstr, str, strlen) WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, strlen, NULL, NULL) 57ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#ifndef ARRAYSIZE 58ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define ARRAYSIZE(A) (sizeof(A)/sizeof((A)[0])) 59ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 60ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 61ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define ERR_BUFFER_SIZE 256 62ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define TIMER_REQUEST_RETRY_MS 100 63ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define MAX_TIMER_SEMAPHORES 128 64ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 65ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 66ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch/* 67ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * API macros - from libusb-win32 1.x 68ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch */ 69ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define DLL_DECLARE_PREFIXNAME(api, ret, prefixname, name, args) \ 70ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch typedef ret (api * __dll_##name##_t)args; \ 71ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch static __dll_##name##_t prefixname = NULL 72ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 73ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#ifndef _WIN32_WCE 74ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define DLL_STRINGIFY(dll) #dll 75ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define DLL_GET_MODULE_HANDLE(dll) GetModuleHandleA(DLL_STRINGIFY(dll)) 76ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define DLL_LOAD_LIBRARY(dll) LoadLibraryA(DLL_STRINGIFY(dll)) 77ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#else 78ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define DLL_STRINGIFY(dll) L#dll 79ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define DLL_GET_MODULE_HANDLE(dll) GetModuleHandle(DLL_STRINGIFY(dll)) 80ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define DLL_LOAD_LIBRARY(dll) LoadLibrary(DLL_STRINGIFY(dll)) 81ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 82ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 83ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define DLL_LOAD_PREFIXNAME(dll, prefixname, name, ret_on_failure) \ 84ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch do { \ 85ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch HMODULE h = DLL_GET_MODULE_HANDLE(dll); \ 86ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!h) \ 87ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch h = DLL_LOAD_LIBRARY(dll); \ 88ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!h) { \ 89ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (ret_on_failure) { return LIBUSB_ERROR_NOT_FOUND; } \ 90ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch else { break; } \ 91ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } \ 92ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch prefixname = (__dll_##name##_t)GetProcAddress(h, \ 93ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DLL_STRINGIFY(name)); \ 94ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (prefixname) break; \ 95ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch prefixname = (__dll_##name##_t)GetProcAddress(h, \ 96ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DLL_STRINGIFY(name) DLL_STRINGIFY(A)); \ 97ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (prefixname) break; \ 98ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch prefixname = (__dll_##name##_t)GetProcAddress(h, \ 99ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DLL_STRINGIFY(name) DLL_STRINGIFY(W)); \ 100ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (prefixname) break; \ 101ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if(ret_on_failure) \ 102ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return LIBUSB_ERROR_NOT_FOUND; \ 103ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } while(0) 104ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 105ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define DLL_DECLARE(api, ret, name, args) DLL_DECLARE_PREFIXNAME(api, ret, name, name, args) 106ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define DLL_LOAD(dll, name, ret_on_failure) DLL_LOAD_PREFIXNAME(dll, name, name, ret_on_failure) 107ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define DLL_DECLARE_PREFIXED(api, ret, prefix, name, args) DLL_DECLARE_PREFIXNAME(api, ret, prefix##name, name, args) 108ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define DLL_LOAD_PREFIXED(dll, prefix, name, ret_on_failure) DLL_LOAD_PREFIXNAME(dll, prefix##name, name, ret_on_failure) 109