/*
* windows backend for libusb 1.0
* Copyright © 2009-2012 Pete Batard <pete@akeo.ie>
* Copyright © 2016-2018 Chris Dickens <christopher.a.dickens@gmail.com>
* 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 "windows_common.h"
#include "windows_nt_common.h"
#include "windows_winusb.h"
#define HANDLE_VALID(h) (((h) != NULL) && ((h) != INVALID_HANDLE_VALUE))
// 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; \
}
// WinUSB-like API prototypes
static int winusbx_init(struct libusb_context *ctx);
static void winusbx_exit(void);
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_iso_transfer(int sub_api, struct usbi_transfer *itransfer);
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(struct libusb_context *ctx);
static void hid_exit(void);
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_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);
static usbi_mutex_t autoclaim_lock;
// API globals
static HMODULE WinUSBX_handle = NULL;
static struct winusb_interface WinUSBX[SUB_API_MAX];
#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 bool api_hid_available = false;
#define CHECK_HID_AVAILABLE \
do { \
if (!api_hid_available) \
return LIBUSB_ERROR_ACCESS; \
} while (0)
#if defined(ENABLE_LOGGING)
static const char *guid_to_string(const GUID *guid)
{
static char guid_string[MAX_GUID_STRING_LENGTH];
if (guid == NULL)
return "";
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
/*
* Sanitize Microsoft's paths: convert to uppercase, add prefix and fix backslashes.
* Return an allocated sanitized string or NULL on error.
*/
static char *sanitize_path(const char *path)
{
const char root_prefix[] = {'\\', '\\', '.', '\\'};
size_t j, size;
char *ret_path;
size_t add_root = 0;
if (path == NULL)
return NULL;
size = strlen(path) + 1;
// Microsoft indiscriminately uses '\\?\', '\\.\', '##?#" or "##.#" for root prefixes.
if (!((size > 3) && (((path[0] == '\\') && (path[1] == '\\') && (path[3] == '\\'))
|| ((path[0] == '#') && (path[1] == '#') && (path[3] == '#'))))) {
add_root = sizeof(root_prefix);
size += add_root;
}
ret_path = malloc(size);
if (ret_path == NULL)
return NULL;
strcpy(&ret_path[add_root], path);
// Ensure consistency with root prefix
memcpy(ret_path, root_prefix, sizeof(root_prefix));
// Same goes for '\' and '#' after the root prefix. Ensure '#' is used
for (j = sizeof(root_prefix); j < size; j++) {
ret_path[j] = (char)toupper((int)ret_path[j]); // Fix case too
if (ret_path[j] == '\\')
ret_path[j] = '#';
}
return ret_path;
}
/*
* Cfgmgr32, AdvAPI32, OLE32 and SetupAPI DLL functions
*/
static BOOL init_dlls(void)
{
DLL_GET_HANDLE(Cfgmgr32);
DLL_LOAD_FUNC(Cfgmgr32, CM_Get_Parent, TRUE);
DLL_LOAD_FUNC(Cfgmgr32, CM_Get_Child, TRUE
没有合适的资源?快使用搜索试试~ 我知道了~
libusb-1.0.22.zip_libusb_libusb 源码_libusb-1.0.22_libusb1_usbdk+l
共197个文件
vcxproj:45个
c:35个
h:30个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 176 浏览量
2022-07-15
20:07:08
上传
评论 1
收藏 875KB ZIP 举报
温馨提示
实现usb设备免驱数据操作,官方最新源码
资源详情
资源评论
资源推荐
收起资源包目录
libusb-1.0.22.zip_libusb_libusb 源码_libusb-1.0.22_libusb1_usbdk+l (197个子文件)
configure.ac 10KB
Makefile.am 3KB
Makefile.am 672B
Makefile.am 443B
Makefile.am 189B
Makefile.am 149B
AUTHORS 2KB
appveyor.bat 1KB
windows_winusb.c 138KB
io.c 105KB
core.c 86KB
linux_usbfs.c 76KB
darwin_usb.c 76KB
sunos_usb.c 43KB
xusb.c 38KB
descriptor.c 35KB
windows_nt_common.c 31KB
getopt.c 30KB
wince_usb.c 27KB
windows_usbdk.c 26KB
ezusb.c 23KB
openbsd_usb.c 18KB
netbsd_usb.c 16KB
hotplug.c 12KB
sync.c 12KB
dpfp_threaded.c 12KB
dpfp.c 11KB
linux_netlink.c 10KB
fxload.c 9KB
poll_windows.c 9KB
testlibusb.c 8KB
linux_udev.c 8KB
strerror.c 7KB
testlib.c 7KB
sam3u_benchmark.c 5KB
stress.c 5KB
getopt1.c 4KB
threads_windows.c 3KB
hotplugtest.c 3KB
missing.c 2KB
poll_posix.c 2KB
threads_posix.c 2KB
listdevs.c 2KB
ChangeLog 11KB
ddk_build.cmd 4KB
compile 7KB
configure 604KB
COPYING 26KB
haiku_usb_backend.cpp 15KB
haiku_usb_raw.cpp 8KB
haiku_pollfs.cpp 7KB
libusb-1.0.def 7KB
depcomp 23KB
libusb_dll.dsp 6KB
libusb_static.dsp 5KB
listdevs.dsp 4KB
xusb.dsp 4KB
libusb.dsw 1KB
fxload_sources 499B
getopt_sources 415B
config.guess 42KB
libusb.h 71KB
libusbi.h 41KB
windows_winusb.h 22KB
stdint.h 7KB
darwin_usb.h 6KB
getopt.h 6KB
linux_usbfs.h 6KB
inttypes.h 6KB
wince_usb.h 5KB
ezusb.h 4KB
windows_nt_common.h 4KB
windows_common.h 4KB
windows_nt_shared_types.h 4KB
haiku_usb_raw.h 4KB
poll_windows.h 4KB
hotplug.h 3KB
errno.h 3KB
haiku_usb.h 3KB
threads_windows.h 3KB
libusb_testlib.h 3KB
threads_posix.h 3KB
windows_usbdk.h 3KB
config.h 2KB
sunos_usb.h 2KB
config.h 2KB
missing.h 1KB
config.h 527B
version.h 431B
poll_posix.h 218B
version_nano.h 26B
hotplugtest_sources 369B
doxygen.cfg.in 100KB
Makefile.in 55KB
Makefile.in 28KB
Makefile.in 27KB
Makefile.in 17KB
Makefile.in 12KB
config.h.in 4KB
libusb-1.0.pc.in 312B
共 197 条
- 1
- 2
朱moyimi
- 粉丝: 61
- 资源: 1万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论1