/*
* windows backend for libusb 1.0
* Copyright © 2009-2012 Pete Batard <pete@akeo.ie>
* With contributions from Michael Plante, Orin Eman et al.
* Parts of this code adapted from libusb-win32-v1 by Stephan Meyer
* HID Reports IOCTLs inspired from HIDAPI by Alan Ott, Signal 11 Software
* Hash table functions adapted from glibc, by Ulrich Drepper et al.
* Major code testing contribution by Xiaofan Chen
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <config.h>
#include <windows.h>
#include <setupapi.h>
#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
#include <process.h>
#include <stdio.h>
#include <inttypes.h>
#include <objbase.h>
#include <winioctl.h>
#include "libusbi.h"
#include "poll_windows.h"
#include "windows_usb.h"
// The 2 macros below are used in conjunction with safe loops.
#define LOOP_CHECK(fcall) { r=fcall; if (r != LIBUSB_SUCCESS) continue; }
#define LOOP_BREAK(err) { r=err; continue; }
// Helper prototypes
static int windows_get_active_config_descriptor(struct libusb_device *dev, unsigned char *buffer, size_t len, int *host_endian);
static int windows_clock_gettime(int clk_id, struct timespec *tp);
unsigned __stdcall windows_clock_gettime_threaded(void* param);
// Common calls
static int common_configure_endpoints(int sub_api, struct libusb_device_handle *dev_handle, int iface);
// WinUSB-like API prototypes
static int winusbx_init(int sub_api, struct libusb_context *ctx);
static int winusbx_exit(int sub_api);
static int winusbx_open(int sub_api, struct libusb_device_handle *dev_handle);
static void winusbx_close(int sub_api, struct libusb_device_handle *dev_handle);
static int winusbx_configure_endpoints(int sub_api, struct libusb_device_handle *dev_handle, int iface);
static int winusbx_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface);
static int winusbx_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface);
static int winusbx_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer);
static int winusbx_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting);
static int winusbx_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer);
static int winusbx_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint);
static int winusbx_abort_transfers(int sub_api, struct usbi_transfer *itransfer);
static int winusbx_abort_control(int sub_api, struct usbi_transfer *itransfer);
static int winusbx_reset_device(int sub_api, struct libusb_device_handle *dev_handle);
static int winusbx_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size);
// HID API prototypes
static int hid_init(int sub_api, struct libusb_context *ctx);
static int hid_exit(int sub_api);
static int hid_open(int sub_api, struct libusb_device_handle *dev_handle);
static void hid_close(int sub_api, struct libusb_device_handle *dev_handle);
static int hid_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface);
static int hid_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface);
static int hid_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting);
static int hid_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer);
static int hid_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer);
static int hid_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint);
static int hid_abort_transfers(int sub_api, struct usbi_transfer *itransfer);
static int hid_reset_device(int sub_api, struct libusb_device_handle *dev_handle);
static int hid_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size);
// Composite API prototypes
static int composite_init(int sub_api, struct libusb_context *ctx);
static int composite_exit(int sub_api);
static int composite_open(int sub_api, struct libusb_device_handle *dev_handle);
static void composite_close(int sub_api, struct libusb_device_handle *dev_handle);
static int composite_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface);
static int composite_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting);
static int composite_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface);
static int composite_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer);
static int composite_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer);
static int composite_submit_iso_transfer(int sub_api, struct usbi_transfer *itransfer);
static int composite_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint);
static int composite_abort_transfers(int sub_api, struct usbi_transfer *itransfer);
static int composite_abort_control(int sub_api, struct usbi_transfer *itransfer);
static int composite_reset_device(int sub_api, struct libusb_device_handle *dev_handle);
static int composite_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size);
// Global variables
uint64_t hires_frequency, hires_ticks_to_ps;
const uint64_t epoch_time = UINT64_C(116444736000000000); // 1970.01.01 00:00:000 in MS Filetime
int windows_version = WINDOWS_UNDEFINED;
static char windows_version_str[128] = "Windows Undefined";
// Concurrency
static int concurrent_usage = -1;
usbi_mutex_t autoclaim_lock;
// Timer thread
HANDLE timer_thread = NULL;
DWORD timer_thread_id = 0;
// API globals
#define CHECK_WINUSBX_AVAILABLE(sub_api) do { if (sub_api == SUB_API_NOTSET) sub_api = priv->sub_api; \
if (!WinUSBX[sub_api].initialized) return LIBUSB_ERROR_ACCESS; } while(0)
static struct winusb_interface WinUSBX[SUB_API_MAX];
const char* sub_api_name[SUB_API_MAX] = WINUSBX_DRV_NAMES;
bool api_hid_available = false;
#define CHECK_HID_AVAILABLE do { if (!api_hid_available) return LIBUSB_ERROR_ACCESS; } while (0)
static inline BOOLEAN guid_eq(const GUID *guid1, const GUID *guid2) {
if ((guid1 != NULL) && (guid2 != NULL)) {
return (memcmp(guid1, guid2, sizeof(GUID)) == 0);
}
return false;
}
#if defined(ENABLE_LOGGING)
static char* guid_to_string(const GUID* guid)
{
static char guid_string[MAX_GUID_STRING_LENGTH];
if (guid == NULL) return NULL;
sprintf(guid_string, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
(unsigned int)guid->Data1, guid->Data2, guid->Data3,
guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3],
guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7]);
return guid_string;
}
#endif
/*
* Converts a windows error to human readable string
* uses retval as errorcode, or, if 0, use GetLastError()
*/
#if defined(ENABLE_LOGGING)
static char *windows_error_str(uint32_t retval)
{
static char err_string[ERR_BUFFER_SIZE];
DWORD size;
ssize_t i;
uint32_t error_code, format_error;
error_code = retval?retval:GetLastError();
safe_sprintf(err_string, ERR_BUFFER_SIZE, "[%u] ", error_code);
// Translate codes returned by SetupAPI. The ones we are dealing with are either
// in 0x0000xxxx or 0xE000xxxx and can be distinguished from standard error codes.
// See http://msdn.micr
没有合适的资源?快使用搜索试试~ 我知道了~
libusb+wingw源码(已经编译过)
共288个文件
c:31个
h:27个
vcxproj:24个
5星 · 超过95%的资源 需积分: 50 61 下载量 23 浏览量
2017-12-03
23:23:01
上传
评论 1
收藏 2.74MB ZIP 举报
温馨提示
已经通过mingw进行了编译,生成了windows下vs可用的lib和dll
资源推荐
资源详情
资源评论
收起资源包目录
libusb+wingw源码(已经编译过) (288个子文件)
output.0 525KB
output.0 447KB
traces.0 101KB
traces.0 57KB
output.1 525KB
output.1 447KB
traces.1 114KB
traces.1 31KB
output.2 447KB
traces.2 112KB
libusb-1.0.a 579KB
libusb-1.0.dll.a 131KB
configure.ac 10KB
configure.ac 168B
Makefile.am 2KB
Makefile.am 672B
Makefile.am 432B
Makefile.am 323B
Makefile.am 189B
Makefile.am 149B
AUTHORS 2KB
windows_usb.c 159KB
io.c 102KB
core.c 81KB
linux_usbfs.c 73KB
darwin_usb.c 70KB
xusb.c 37KB
descriptor.c 35KB
getopt.c 30KB
wince_usb.c 28KB
ezusb.c 23KB
poll_windows.c 20KB
openbsd_usb.c 18KB
netbsd_usb.c 16KB
dpfp_threaded.c 11KB
sync.c 11KB
dpfp.c 11KB
hotplug.c 10KB
fxload.c 9KB
linux_netlink.c 9KB
linux_udev.c 8KB
strerror.c 7KB
testlib.c 7KB
threads_windows.c 7KB
sam3u_benchmark.c 5KB
stress.c 5KB
getopt1.c 4KB
hotplugtest.c 3KB
missing.c 2KB
threads_posix.c 2KB
listdevs.c 2KB
poll_posix.c 1KB
doxygen.cfg 100KB
ChangeLog 9KB
ddk_build.cmd 4KB
compile 7KB
compile 4KB
configure 523KB
configure 444KB
COPYING 26KB
haiku_usb_backend.cpp 15KB
haiku_usb_raw.cpp 7KB
haiku_pollfs.cpp 7KB
libusb-1.0.def 7KB
depcomp 18KB
depcomp 18KB
.dirstamp 0B
.dirstamp 0B
libusb-1.0.dll 545KB
libusb_dll.dsp 6KB
libusb_static.dsp 5KB
listdevs.dsp 4KB
xusb.dsp 4KB
libusb.dsw 1KB
libusb_dll_2012.vcxproj.filters 3KB
libusb_dll_2010.vcxproj.filters 3KB
libusb_static_2010.vcxproj.filters 3KB
libusb_static_2012.vcxproj.filters 3KB
getopt_2012.vcxproj.filters 968B
getopt_2010.vcxproj.filters 968B
stress_2010.vcxproj.filters 889B
stress_2012.vcxproj.filters 889B
fxload_2010.vcxproj.filters 887B
fxload_2012.vcxproj.filters 887B
hotplugtest_2012.vcxproj.filters 522B
hotplugtest_2010.vcxproj.filters 522B
listdevs_2010.vcxproj.filters 519B
listdevs_2012.vcxproj.filters 519B
xusb_2012.vcxproj.filters 515B
xusb_2010.vcxproj.filters 515B
fxload_sources 500B
getopt_sources 373B
config.guess 44KB
config.guess 44KB
libusb.h 69KB
libusbi.h 39KB
windows_usb.h 32KB
stdint.h 7KB
getopt.h 6KB
linux_usbfs.h 6KB
共 288 条
- 1
- 2
- 3
资源评论
- gongyankkk2019-04-01非常的实用!
rgrui
- 粉丝: 0
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功