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

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

?? usbif.cpp

?? 支持USB2.0 BULK傳輸范例
?? CPP
字號:
/************************************************************************
 *
 *  Module:       UsbIF.cpp
 *  Description:  USB Interface for Silabs USB development board
 *  Company:      Silicon Laboratories Inc.
 *
 ************************************************************************/

#include "stdafx.h"
#include "UsbIF.h"

// standard constructor
CUsbIF::CUsbIF()
{
	memset(m_DeviceName, 0, sizeof(m_DeviceName));
}

// destructor
CUsbIF::~CUsbIF()
{
}

// Initialize the GUID
void CUsbIF::SetGUID(GUID newGUID)
{
	m_GUID = newGUID;
}


//------------------------------------------------------------------------
// GetNumDevices()
//
// Counts the number of Silabs USB devices listed in the registry.
//------------------------------------------------------------------------
DWORD CUsbIF::GetNumDevices()
{
	DWORD numDevices = 0;

	// Retrieve device list for GUID that has been specified.
	HDEVINFO hDevInfoList = SetupDiGetClassDevs (&m_GUID, NULL, NULL, (DIGCF_PRESENT | DIGCF_DEVICEINTERFACE)); 

	if (hDevInfoList != NULL)
	{
		SP_DEVICE_INTERFACE_DATA deviceInfoData;

		for (int index = 0; index < 127;index++)
		{
			// Clear data structure
			ZeroMemory(&deviceInfoData, sizeof(deviceInfoData));
			deviceInfoData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

			// retrieves a context structure for a device interface of a device information set.
			if (SetupDiEnumDeviceInterfaces (hDevInfoList, 0, &m_GUID, index, &deviceInfoData)) 
			{
				numDevices++;
			}
			else
			{
				if ( GetLastError() == ERROR_NO_MORE_ITEMS ) 
					break;
			}
		}
	}

	// SetupDiDestroyDeviceInfoList() destroys a device information set
	// and frees all associated memory.
	SetupDiDestroyDeviceInfoList (hDevInfoList);

	return numDevices;
}


//------------------------------------------------------------------------
// GetDeviceStrings()
//
// dwDeviceNum:	Position of device entry in the Windows registry list.
// dev:			container class where device description strings will be stored.
//
// Copies device description from the registry for single device.
//------------------------------------------------------------------------
void CUsbIF::GetDeviceStrings(DWORD dwDeviceNum, CDeviceListEntry& dev)
{
	// Clear the device info
	dev.m_friendlyname	= "";
	dev.m_linkname		= "";
	dev.m_serialnumber	= "";

	// Retrieve device list for GUID that has been specified.
	HDEVINFO hDevInfoList = SetupDiGetClassDevs (&m_GUID, NULL, NULL, (DIGCF_PRESENT | DIGCF_DEVICEINTERFACE)); 

	if (hDevInfoList != NULL)
	{
		SP_DEVICE_INTERFACE_DATA deviceInfoData;

		// Clear data structure
		ZeroMemory(&deviceInfoData, sizeof(deviceInfoData));
		deviceInfoData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

		// retrieves a context structure for a device interface of a device information set.
		if (SetupDiEnumDeviceInterfaces (hDevInfoList, 0, &m_GUID, dwDeviceNum, &deviceInfoData)) 
		{
			// Must get the detailed information in two steps
			// First get the length of the detailed information and allocate the buffer
			// retrieves detailed information about a specified device interface.
			PSP_DEVICE_INTERFACE_DETAIL_DATA     functionClassDeviceData = NULL;
			ULONG  predictedLength, requiredLength;

			predictedLength = requiredLength = 0;
			SetupDiGetDeviceInterfaceDetail (	hDevInfoList,
												&deviceInfoData,
												NULL,			// Not yet allocated
												0,				// Set output buffer length to zero 
												&requiredLength,// Find out memory requirement
												NULL);			

			predictedLength = requiredLength;
			functionClassDeviceData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc (predictedLength);
			functionClassDeviceData->cbSize = sizeof (SP_DEVICE_INTERFACE_DETAIL_DATA);
			
			SP_DEVINFO_DATA did = {sizeof(SP_DEVINFO_DATA)};
	
			// Second, get the detailed information
			if ( SetupDiGetDeviceInterfaceDetail (	hDevInfoList,
													&deviceInfoData,
													functionClassDeviceData,
													predictedLength,
													&requiredLength,
													&did)) 
			{
				TCHAR fname[256];

				// Try by friendly name first.
				if (!SetupDiGetDeviceRegistryProperty(hDevInfoList, &did, SPDRP_FRIENDLYNAME, NULL, (PBYTE) fname, sizeof(fname), NULL))
				{	// Try by device description if friendly name fails.
					if (!SetupDiGetDeviceRegistryProperty(hDevInfoList, &did, SPDRP_DEVICEDESC, NULL, (PBYTE) fname, sizeof(fname), NULL))
					{	// Use the raw path information for linkname and friendlyname
						strncpy(fname, functionClassDeviceData->DevicePath, 256);
					}
				}
					dev.m_friendlyname	= fname;
					dev.m_linkname		= functionClassDeviceData->DevicePath;
					// Now get the Serial Number this is OS dependent as the registry
				// has to be manually parsed under Win98
				if(!IsWin98())
				{
					GetSerialNumber(functionClassDeviceData->DevicePath, &(dev.m_serialnumber));
				}
				else
				{
					HKEY tempkey = NULL;
					LONG lRet;
					char szDeviceInstance[256];
					DWORD dwBufLen=256;

					//KeyPath is the known location of our device using SIBULK GUID {37538c66-9584-42d3-9632-ebad0a230d13} under Win98SE
					std::string KeyPath = "System\\CurrentControlSet\\Control\\DeviceClasses\\{37538c66-9584-42d3-9632-ebad0a230d13}\\";
					//SymLinkName is the dynamically allocated path of this particular instance of the Xpress USB device
					std::string SymLinkName = functionClassDeviceData->DevicePath;
					//You cannot use '/' symbols in a registry path name so replace them with "#
					SymLinkName = SymLinkName.replace(0,4,"##.#");
					//Add the dynamic SymLinkName to the known KeyPath string and you have the key path to this device instance
					KeyPath += SymLinkName;
					//Get the Key
					lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, KeyPath.c_str() , NULL, KEY_READ, &tempkey);
					if( lRet != ERROR_SUCCESS )
						tempkey = NULL;	//error retrieving key
					
					// Get the Device Instance string using the key
					lRet = RegQueryValueEx( tempkey, "DeviceInstance", NULL, NULL,
					(LPBYTE) szDeviceInstance, &dwBufLen);
					if( (lRet != ERROR_SUCCESS) || (dwBufLen > 80) )
						tempkey = NULL;	//error retrieving instance string
					std::string SerialNumber = szDeviceInstance;
					SerialNumber.erase(0,22);
					dev.m_serialnumber = SerialNumber;
					
				}
					
				free( functionClassDeviceData );
			}
		}
	}

	// SetupDiDestroyDeviceInfoList() destroys a device information set
	// and frees all associated memory.
	SetupDiDestroyDeviceInfoList (hDevInfoList);
}


//------------------------------------------------------------------------
// Open()
//
// dwDevice	: position of device description string in the registry
//
// Get the description strings for a device and copy the linkname into
// m_DeviceName.  Call OpenUSBfile() to create the file handle.
//------------------------------------------------------------------------
HANDLE CUsbIF::Open(DWORD dwDevice)
{
	CDeviceListEntry dev;

	GetDeviceStrings(dwDevice, dev);
	// first set the device by setting the devicename
	strcpy(m_DeviceName, dev.m_linkname.c_str());
	// next get a handle and return it
	return OpenUSBfile(NULL);
}



//------------------------------------------------------------------------
// GetSerialNumber()
//
// Extract the serial number from the device path string.
//------------------------------------------------------------------------
void CUsbIF::GetSerialNumber(LPCTSTR DevicePath, std::string* str)
{
	std::string temp = DevicePath;

	temp = temp.substr(temp.find_first_of('#') + 1, temp.find_last_of('#') - temp.find_first_of('#'));
	temp = temp.substr(temp.find_first_of('#') + 1, (temp.find_last_of('#') - temp.find_first_of('#')) - 1);

	if (str)
	{
		*str += temp;
	}
}


//------------------------------------------------------------------------
// OpenUSBfile()
//
// sFileName : additional string for flexibility in creating the entire
// device path string
//
// Open a handle file handle for the USB device.  Will be used for all
// subsequent communication with the USB device.
//------------------------------------------------------------------------
HANDLE CUsbIF::OpenUSBfile(char* sFileName)
{
	HANDLE hFile;

    if(sFileName)
	{
		strcat (m_DeviceName, "\\");                      
		strcat (m_DeviceName, sFileName);                                      
	}

	hFile = CreateFile(	m_DeviceName,
						GENERIC_WRITE | GENERIC_READ,
						FILE_SHARE_WRITE | FILE_SHARE_READ,
						NULL,
						OPEN_EXISTING,
						0,
						NULL);

	return hFile;
}


CDeviceListEntry::CDeviceListEntry(LPCTSTR linkname, LPCTSTR friendlyname, LPCTSTR serialnumber)
{
	m_linkname		= linkname;
	m_friendlyname	= friendlyname;
	m_serialnumber	= serialnumber;
}


bool IsWin98()
{
	OSVERSIONINFOEX osvi;
	BOOL bOsVersionInfoEx;

	// Try calling GetVersionEx using the OSVERSIONINFOEX structure
	// which is supported on Windows 2000.
	//
	// It that fails, try using the OSVERSIONINFO structure.

	ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
	osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);

	if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
	{
		// If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO
		osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
		if( ! GetVersionEx ( (OSVERSIONINFO *)&osvi) )
		{
			return FALSE;
		}
	}

	switch (osvi.dwPlatformId)
	{

	case VER_PLATFORM_WIN32_NT:
		return FALSE;
		break;

	case VER_PLATFORM_WIN32_WINDOWS:
		if ((osvi.dwMajorVersion > 4) || 
		   ((osvi.dwMajorVersion == 4) && (osvi.dwMinorVersion > 0 )))
		{
			return TRUE; // This is Windows 98
		}
		else
			return FALSE; // This is Windows 95
		break;
	
	case VER_PLATFORM_WIN32s:
		return FALSE;
		break;
			
	}
	
	return FALSE;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本sm残虐另类| 欧美久久久久久蜜桃| 欧美嫩在线观看| 国产精品二三区| 日本不卡一区二区三区高清视频| 国产激情91久久精品导航| 欧美一区二区三区在线观看| 亚洲免费av在线| 国产成人小视频| 日韩精品一区在线观看| 亚洲第一主播视频| 97aⅴ精品视频一二三区| 26uuu亚洲综合色| 午夜视频在线观看一区| 91丨国产丨九色丨pron| 国产欧美中文在线| 黄网站免费久久| 日韩午夜在线观看视频| 亚洲高清免费观看| 在线观看亚洲精品视频| 亚洲另类在线一区| 99国产欧美久久久精品| 国产精品视频九色porn| 狠狠色丁香九九婷婷综合五月| 9191精品国产综合久久久久久| 夜夜亚洲天天久久| 欧美在线高清视频| 尤物视频一区二区| 色视频一区二区| 亚洲激情中文1区| 91极品美女在线| 亚洲一区二区精品久久av| 91麻豆精品一区二区三区| 日韩一区在线看| 91麻豆国产福利在线观看| 亚洲猫色日本管| 91成人免费电影| 亚洲mv大片欧洲mv大片精品| 欧美日韩不卡一区| 日韩高清不卡一区二区三区| 91麻豆精品国产91| 久久不见久久见中文字幕免费| 精品三级在线看| 国产精品一二三在| 亚洲日本一区二区三区| 在线欧美小视频| 偷拍一区二区三区| 日韩视频免费观看高清完整版在线观看| 奇米精品一区二区三区四区| 欧美mv日韩mv亚洲| eeuss影院一区二区三区| 亚洲人快播电影网| 欧美裸体bbwbbwbbw| 国产一区二区精品久久91| 国产精品日日摸夜夜摸av| 欧洲精品中文字幕| 日本最新不卡在线| 久久久精品国产免费观看同学| 国产成都精品91一区二区三| 亚洲精品乱码久久久久久久久 | 亚洲综合一二三区| 欧美日韩高清一区二区三区| 寂寞少妇一区二区三区| 亚洲日本在线观看| 日韩精品一区二区三区视频播放| 成人综合婷婷国产精品久久| 亚洲国产成人av| 欧美国产国产综合| 欧美精品v国产精品v日韩精品| 国产在线精品不卡| 一区二区成人在线视频| 欧美精品一区二区三区四区| 一本到不卡精品视频在线观看| 人人爽香蕉精品| 最新欧美精品一区二区三区| 欧美成人艳星乳罩| 色老汉一区二区三区| 国产一区二区在线观看视频| 亚洲午夜精品网| 欧美国产日韩在线观看| 日韩欧美在线网站| 一本大道久久a久久精二百| 久久99精品国产.久久久久| 亚洲综合成人在线| 国产精品麻豆视频| 久久一区二区三区国产精品| 欧美美女黄视频| 欧美少妇性性性| 91美女福利视频| 成人av电影在线| 国产一区二区三区四区在线观看| 亚洲国产精品天堂| 亚洲视频香蕉人妖| 欧美韩日一区二区三区四区| 337p粉嫩大胆色噜噜噜噜亚洲| 国产片一区二区三区| 成人中文字幕合集| 综合电影一区二区三区| 亚洲综合久久久| 亚洲男人的天堂在线观看| 美女www一区二区| 粉嫩高潮美女一区二区三区| 中文字幕欧美三区| 欧美日韩精品电影| 一区二区三区在线高清| 久久精品亚洲乱码伦伦中文| 欧美va亚洲va香蕉在线| 欧美日韩久久久久久| 欧洲另类一二三四区| 91黄视频在线| 日本韩国一区二区| 91黄色激情网站| 色综合久久天天综合网| 99riav一区二区三区| 成人激情动漫在线观看| 成人av综合在线| 91在线观看下载| 日本高清无吗v一区| 一本大道av伊人久久综合| 日本电影欧美片| 欧洲精品一区二区三区在线观看| 91福利区一区二区三区| 欧美日韩午夜在线视频| 欧美军同video69gay| 日韩一区二区三区视频| 欧美精品一区二区三区在线播放| 欧美大片拔萝卜| 欧美国产一区在线| 亚洲激情欧美激情| 日一区二区三区| 久久 天天综合| 成人综合婷婷国产精品久久蜜臀| www.久久久久久久久| 欧美在线制服丝袜| 91精品国产福利| 久久久国产精品麻豆| 亚洲四区在线观看| 亚洲成va人在线观看| 久久爱www久久做| 成人国产精品视频| 欧美中文字幕一二三区视频| 91精品国产全国免费观看| 精品久久久久久久人人人人传媒 | 日本韩国欧美国产| 欧美久久久久久久久| 久久久综合九色合综国产精品| 中文字幕国产一区| 无码av免费一区二区三区试看 | 国产精品一二三四| 色噜噜狠狠一区二区三区果冻| 欧美精品aⅴ在线视频| 日本一区二区动态图| 天天免费综合色| www.综合网.com| 日韩一级欧美一级| 日韩理论在线观看| 精品午夜久久福利影院 | 亚洲综合在线免费观看| 日本美女一区二区| 91美女视频网站| 2023国产精品| 午夜久久久久久久久久一区二区| 国产乱子伦一区二区三区国色天香 | 午夜精品福利一区二区三区蜜桃| 国产精品综合在线视频| 欧美日韩精品福利| 亚洲另类一区二区| 国产91精品一区二区麻豆网站| 欧美性猛片xxxx免费看久爱| 久久日韩粉嫩一区二区三区| 亚洲成a人在线观看| 99精品一区二区三区| 日韩精品一区二区三区四区视频| 一区二区三区高清不卡| 成人小视频在线观看| 亚洲精品一区在线观看| 亚洲成人av免费| 91色乱码一区二区三区| 国产精品丝袜久久久久久app| 精品一区二区三区免费视频| 欧美日韩国产一二三| 亚洲资源在线观看| www.在线成人| 国产精品久久久久久妇女6080| 精品在线视频一区| 91精品国产黑色紧身裤美女| 亚洲福利视频一区| 欧美午夜宅男影院| 一区二区三区在线观看欧美| 成人ar影院免费观看视频| 国产欧美日韩精品a在线观看| 久久国产婷婷国产香蕉| 日韩精品综合一本久道在线视频| 午夜激情久久久| 欧美精三区欧美精三区| 亚洲v日本v欧美v久久精品| 欧美在线播放高清精品| 一区二区三区精品在线| 色又黄又爽网站www久久| 亚洲精品水蜜桃|