亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? descriptor.c

?? 最新的libusb庫
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * USB descriptor handling functions for libusb * Copyright (C) 2007 Daniel Drake <dsd@gentoo.org> * Copyright (c) 2001 Johannes Erdfelt <johannes@erdfelt.com> * * 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 <errno.h>#include <stdlib.h>#include <string.h>#include "libusbi.h"#define DESC_HEADER_LENGTH		2#define DEVICE_DESC_LENGTH		18#define CONFIG_DESC_LENGTH		9#define INTERFACE_DESC_LENGTH		9#define ENDPOINT_DESC_LENGTH		7#define ENDPOINT_AUDIO_DESC_LENGTH	9/** @defgroup desc USB descriptors * This page details how to examine the various standard USB descriptors * for detected devices *//* set host_endian if the w values are already in host endian format, * as opposed to bus endian. */int usbi_parse_descriptor(unsigned char *source, char *descriptor, void *dest,	int host_endian){	unsigned char *sp = source, *dp = dest;	uint16_t w;	char *cp;	for (cp = descriptor; *cp; cp++) {		switch (*cp) {			case 'b':	/* 8-bit byte */				*dp++ = *sp++;				break;			case 'w':	/* 16-bit word, convert from little endian to CPU */				dp += ((unsigned long)dp & 1);	/* Align to word boundary */				if (host_endian) {					memcpy(dp, sp, 2);				} else {					w = (sp[1] << 8) | sp[0];					*((uint16_t *)dp) = w;				}				sp += 2;				dp += 2;				break;		}	}	return sp - source;}static void clear_endpoint(struct libusb_endpoint_descriptor *endpoint){	if (endpoint->extra)		free((unsigned char *) endpoint->extra);}static int parse_endpoint(struct libusb_context *ctx,	struct libusb_endpoint_descriptor *endpoint, unsigned char *buffer,	int size, int host_endian){	struct usb_descriptor_header header;	unsigned char *extra;	unsigned char *begin;	int parsed = 0;	int len;	usbi_parse_descriptor(buffer, "bb", &header, 0);	/* Everything should be fine being passed into here, but we sanity */	/*  check JIC */	if (header.bLength > size) {		usbi_err(ctx, "ran out of descriptors parsing");		return -1;	}	if (header.bDescriptorType != LIBUSB_DT_ENDPOINT) {		usbi_err(ctx, "unexpected descriptor %x (expected %x)",			header.bDescriptorType, LIBUSB_DT_ENDPOINT);		return parsed;	}	if (header.bLength >= ENDPOINT_AUDIO_DESC_LENGTH)		usbi_parse_descriptor(buffer, "bbbbwbbb", endpoint, host_endian);	else if (header.bLength >= ENDPOINT_DESC_LENGTH)		usbi_parse_descriptor(buffer, "bbbbwb", endpoint, host_endian);	buffer += header.bLength;	size -= header.bLength;	parsed += header.bLength;	/* Skip over the rest of the Class Specific or Vendor Specific */	/*  descriptors */	begin = buffer;	while (size >= DESC_HEADER_LENGTH) {		usbi_parse_descriptor(buffer, "bb", &header, 0);		if (header.bLength < 2) {			usbi_err(ctx, "invalid descriptor length %d", header.bLength);			return -1;		}		/* If we find another "proper" descriptor then we're done  */		if ((header.bDescriptorType == LIBUSB_DT_ENDPOINT) ||				(header.bDescriptorType == LIBUSB_DT_INTERFACE) ||				(header.bDescriptorType == LIBUSB_DT_CONFIG) ||				(header.bDescriptorType == LIBUSB_DT_DEVICE))			break;		usbi_dbg("skipping descriptor %x", header.bDescriptorType);		buffer += header.bLength;		size -= header.bLength;		parsed += header.bLength;	}	/* Copy any unknown descriptors into a storage area for drivers */	/*  to later parse */	len = (int)(buffer - begin);	if (!len) {		endpoint->extra = NULL;		endpoint->extra_length = 0;		return parsed;	}	extra = malloc(len);	endpoint->extra = extra;	if (!extra) {		endpoint->extra_length = 0;		return LIBUSB_ERROR_NO_MEM;	}	memcpy(extra, begin, len);	endpoint->extra_length = len;	return parsed;}static void clear_interface(struct libusb_interface *interface){	int i;	int j;	if (interface->altsetting) {		for (i = 0; i < interface->num_altsetting; i++) {			struct libusb_interface_descriptor *ifp =				(struct libusb_interface_descriptor *)				interface->altsetting + i;			if (ifp->extra)				free((void *) ifp->extra);			if (ifp->endpoint) {				for (j = 0; j < ifp->bNumEndpoints; j++)					clear_endpoint((struct libusb_endpoint_descriptor *)						ifp->endpoint + j);				free((void *) ifp->endpoint);			}		}		free((void *) interface->altsetting);	}	}static int parse_interface(libusb_context *ctx,	struct libusb_interface *interface, unsigned char *buffer, int size,	int host_endian){	int i;	int len;	int r;	int parsed = 0;	int tmp;	struct usb_descriptor_header header;	struct libusb_interface_descriptor *ifp;	unsigned char *begin;	interface->num_altsetting = 0;	while (size >= INTERFACE_DESC_LENGTH) {		struct libusb_interface_descriptor *altsetting =			(struct libusb_interface_descriptor *) interface->altsetting;		altsetting = realloc(altsetting,			sizeof(struct libusb_interface_descriptor) *			(interface->num_altsetting + 1));		if (!altsetting) {			r = LIBUSB_ERROR_NO_MEM;			goto err;		}		interface->altsetting = altsetting;		ifp = altsetting + interface->num_altsetting;		interface->num_altsetting++;		usbi_parse_descriptor(buffer, "bbbbbbbbb", ifp, 0);		ifp->extra = NULL;		ifp->extra_length = 0;		ifp->endpoint = NULL;		/* Skip over the interface */		buffer += ifp->bLength;		parsed += ifp->bLength;		size -= ifp->bLength;		begin = buffer;		/* Skip over any interface, class or vendor descriptors */		while (size >= DESC_HEADER_LENGTH) {			usbi_parse_descriptor(buffer, "bb", &header, 0);			if (header.bLength < 2) {				usbi_err(ctx, "invalid descriptor of length %d",					header.bLength);				r = LIBUSB_ERROR_IO;				goto err;			}			/* If we find another "proper" descriptor then we're done */			if ((header.bDescriptorType == LIBUSB_DT_INTERFACE) ||					(header.bDescriptorType == LIBUSB_DT_ENDPOINT) ||					(header.bDescriptorType == LIBUSB_DT_CONFIG) ||					(header.bDescriptorType == LIBUSB_DT_DEVICE))				break;			buffer += header.bLength;			parsed += header.bLength;			size -= header.bLength;		}		/* Copy any unknown descriptors into a storage area for */		/*  drivers to later parse */		len = (int)(buffer - begin);		if (len) {			ifp->extra = malloc(len);			if (!ifp->extra) {				r = LIBUSB_ERROR_NO_MEM;				goto err;			}			memcpy((unsigned char *) ifp->extra, begin, len);			ifp->extra_length = len;		}		/* Did we hit an unexpected descriptor? */		usbi_parse_descriptor(buffer, "bb", &header, 0);		if ((size >= DESC_HEADER_LENGTH) &&				((header.bDescriptorType == LIBUSB_DT_CONFIG) ||				 (header.bDescriptorType == LIBUSB_DT_DEVICE)))			return parsed;		if (ifp->bNumEndpoints > USB_MAXENDPOINTS) {			usbi_err(ctx, "too many endpoints (%d)", ifp->bNumEndpoints);			r = LIBUSB_ERROR_IO;			goto err;		}		if (ifp->bNumEndpoints > 0) {			struct libusb_endpoint_descriptor *endpoint;			tmp = ifp->bNumEndpoints * sizeof(struct libusb_endpoint_descriptor);			endpoint = malloc(tmp);			ifp->endpoint = endpoint;			if (!endpoint) {				r = LIBUSB_ERROR_NO_MEM;				goto err;			}			memset(endpoint, 0, tmp);			for (i = 0; i < ifp->bNumEndpoints; i++) {				usbi_parse_descriptor(buffer, "bb", &header, 0);				if (header.bLength > size) {					usbi_err(ctx, "ran out of descriptors parsing");					r = LIBUSB_ERROR_IO;					goto err;				}				r = parse_endpoint(ctx, endpoint + i, buffer, size,					host_endian);				if (r < 0)					goto err;				buffer += r;				parsed += r;				size -= r;			}		}		/* We check to see if it's an alternate to this one */		ifp = (struct libusb_interface_descriptor *) buffer;		if (size < LIBUSB_DT_INTERFACE_SIZE ||				ifp->bDescriptorType != LIBUSB_DT_INTERFACE ||				!ifp->bAlternateSetting)			return parsed;	}	return parsed;err:	clear_interface(interface);	return r;}static void clear_configuration(struct libusb_config_descriptor *config){	if (config->interface) {		int i;		for (i = 0; i < config->bNumInterfaces; i++)			clear_interface((struct libusb_interface *)				config->interface + i);		free((void *) config->interface);	}	if (config->extra)		free((void *) config->extra);}static int parse_configuration(struct libusb_context *ctx,	struct libusb_config_descriptor *config, unsigned char *buffer,	int host_endian){	int i;	int r;	int size;	int tmp;	struct usb_descriptor_header header;	struct libusb_interface *interface;	usbi_parse_descriptor(buffer, "bbwbbbbb", config, host_endian);	size = config->wTotalLength;	if (config->bNumInterfaces > USB_MAXINTERFACES) {		usbi_err(ctx, "too many interfaces (%d)", config->bNumInterfaces);		return LIBUSB_ERROR_IO;	}	tmp = config->bNumInterfaces * sizeof(struct libusb_interface);	interface = malloc(tmp);	config->interface = interface;	if (!config->interface)		return LIBUSB_ERROR_NO_MEM;	memset(interface, 0, tmp);	buffer += config->bLength;	size -= config->bLength;	config->extra = NULL;	config->extra_length = 0;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区日韩电影| 午夜电影一区二区| 亚洲成人免费影院| 蜜臀a∨国产成人精品| 风流少妇一区二区| 欧美一区午夜精品| 亚洲综合清纯丝袜自拍| 国产成人av一区二区三区在线 | 成人激情免费视频| 欧美一区二区观看视频| 一区二区三区视频在线看| 激情五月激情综合网| 欧美色综合网站| 最新成人av在线| 国产xxx精品视频大全| 日韩一区二区免费电影| 亚洲自拍偷拍图区| 成人激情校园春色| 国产亚洲欧美色| 老鸭窝一区二区久久精品| 在线观看网站黄不卡| 国产欧美日韩不卡| 国模冰冰炮一区二区| 日韩一区二区在线免费观看| 夜夜揉揉日日人人青青一国产精品 | 久久99精品网久久| 欧美女孩性生活视频| 亚洲最新视频在线观看| 99久久伊人久久99| 国产精品成人一区二区三区夜夜夜 | 91视频观看视频| 国产精品视频一二三区| 国产成人自拍高清视频在线免费播放| 精品久久99ma| 六月丁香综合在线视频| 日韩欧美久久一区| 久久99精品国产麻豆婷婷洗澡| 欧美一级在线观看| 九一九一国产精品| 国产片一区二区| 99久久精品一区二区| 中文字幕+乱码+中文字幕一区| 成人免费视频一区二区| 中文字幕巨乱亚洲| jlzzjlzz亚洲日本少妇| ●精品国产综合乱码久久久久| 本田岬高潮一区二区三区| 18涩涩午夜精品.www| 91麻豆福利精品推荐| 亚洲图片另类小说| 欧美亚洲丝袜传媒另类| 亚洲福利国产精品| 日韩视频在线一区二区| 国产乱码字幕精品高清av| 日本一区二区三区四区 | 不卡视频在线看| 精品国产伦一区二区三区观看方式| 国产在线精品一区二区| 国产精品免费av| 欧美视频一区二区三区在线观看| 日韩va欧美va亚洲va久久| 久久免费精品国产久精品久久久久| 处破女av一区二区| 亚洲国产欧美在线人成| 91精品国产色综合久久久蜜香臀| 久久www免费人成看片高清| 久久久午夜精品| 91精品办公室少妇高潮对白| 日韩国产在线一| 欧美一级黄色片| 黄色日韩网站视频| 亚洲裸体xxx| 91麻豆精品国产91久久久久久 | 国产综合久久久久影院| 国产午夜亚洲精品理论片色戒| 国产99久久久国产精品| 国产精品福利一区二区三区| 一本色道久久综合亚洲aⅴ蜜桃| 亚洲一区二区精品3399| 色琪琪一区二区三区亚洲区| 黑人巨大精品欧美一区| 国产精品不卡视频| 91精品欧美综合在线观看最新 | 免费亚洲电影在线| 亚洲品质自拍视频| 色狠狠色噜噜噜综合网| 蜜臀a∨国产成人精品| 国产精品污网站| 91偷拍与自偷拍精品| 美女在线视频一区| 国产精品第五页| 欧美v亚洲v综合ⅴ国产v| av资源站一区| 免费成人在线播放| 中文字幕一区二区在线播放| 精品国产一区a| jlzzjlzz国产精品久久| 美女免费视频一区| 一区二区三区不卡在线观看 | 午夜欧美视频在线观看| 综合激情网...| 精品日韩一区二区三区免费视频| 97精品视频在线观看自产线路二| 蜜臀av性久久久久蜜臀av麻豆| 亚洲国产精品高清| 国产视频一区在线播放| 91精品福利在线一区二区三区| eeuss鲁片一区二区三区在线看| 蜜桃精品视频在线观看| 亚洲精品免费播放| 国产欧美一区二区精品久导航 | av爱爱亚洲一区| 激情成人综合网| 日韩在线卡一卡二| 一区二区三区成人在线视频| 国产日韩欧美a| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 亚洲图片欧美视频| 一区二区视频免费在线观看| 国产嫩草影院久久久久| 久久免费精品国产久精品久久久久| 成人永久免费视频| av午夜一区麻豆| 国产69精品久久99不卡| 国产一区日韩二区欧美三区| 免费视频最近日韩| 免费看欧美美女黄的网站| 亚洲一二三区在线观看| 久久久亚洲欧洲日产国码αv| 欧美一区二区三区啪啪| 欧美日韩国产123区| 欧美三级韩国三级日本三斤 | 国内精品伊人久久久久av影院 | 日韩一区中文字幕| 中文字幕乱码日本亚洲一区二区| 久久久精品tv| 久久久久综合网| 国产精品免费久久| 亚洲国产精品高清| 国产精品入口麻豆九色| 国产精品久久久爽爽爽麻豆色哟哟| 国产欧美一区二区精品性色超碰| 欧美一区二区三区视频免费| 久久久久久久综合狠狠综合| 久久精品视频一区| 国产精品福利一区二区| 亚洲视频香蕉人妖| 一区二区三区四区乱视频| 亚洲永久免费av| 奇米四色…亚洲| 国产美女一区二区| 成人精品一区二区三区四区| av不卡一区二区三区| 在线亚洲高清视频| 7777精品伊人久久久大香线蕉| 91精品在线免费| 国产日韩一级二级三级| 综合色中文字幕| 精品午夜一区二区三区在线观看| 国产精品一级黄| 97精品久久久午夜一区二区三区 | 精品国产免费视频| 亚洲三级在线免费| 日本免费在线视频不卡一不卡二| 国产原创一区二区| 97久久超碰国产精品| 欧美精品久久天天躁| 亚洲丝袜精品丝袜在线| 日韩国产精品91| 高清不卡在线观看| 欧美人妖巨大在线| 国产亚洲综合在线| 一区二区三区不卡视频在线观看 | 成人综合婷婷国产精品久久蜜臀| 欧美性猛交一区二区三区精品| 欧美一级精品大片| 亚洲欧洲精品天堂一级 | 日韩欧美中文字幕公布| 亚洲图片欧美激情| 久久精品国产一区二区三区免费看 | 91精品国产黑色紧身裤美女| 久久久久久久久久美女| 亚洲国产日韩在线一区模特| 国产伦精一区二区三区| 成人黄色电影在线| 欧美午夜精品久久久| 国产精品福利影院| 波多野结衣一区二区三区| 欧美日韩在线观看一区二区| 欧美精品一区二区在线观看| 午夜精品久久久久久久久| 91超碰这里只有精品国产| 一道本成人在线| 国产亚洲综合在线| 亚洲午夜av在线| 久久草av在线| 久久精品国产**网站演员| 亚洲午夜日本在线观看| 精品视频在线免费| 欧美国产亚洲另类动漫|