VC获取usb设备信息

#include <windows.h>
#include <stdio.h>
#include <Shlwapi.h>
#include <conio.h>
extern "C" {
	// Declare the C libraries used
#include <setupapi.h>  // Must link in setupapi.lib
#include <hidsdi.h>   // Must link in hid.lib


}

static /*const*/ GUID GUID_DEVINTERFACE_USB_DEVICE = 
{ 0xA5DCBF10L, 0x6530, 0x11D2, { 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } };

TCHAR * GetErrString(TCHAR *str, DWORD errcode)  
{  
	LPVOID lpbuf;  
	if(FormatMessage(   
		FORMAT_MESSAGE_ALLOCATE_BUFFER |  
		FORMAT_MESSAGE_FROM_SYSTEM |   
		FORMAT_MESSAGE_IGNORE_INSERTS,  
		NULL,  
		errcode,  
		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),  
		(LPTSTR) &lpbuf,  
		0,  
		NULL  
		))  
	{  
		lstrcpy(str,(LPCWSTR)lpbuf);  
		LocalFree(lpbuf);  
	}  

	return str;  
}  

int main(int argc, char* argv[])
{
	char szTraceBuf[256];
	// Get device interface info set handle for all devices attached to system
	HDEVINFO hDevInfo = SetupDiGetClassDevs(
		&GUID_DEVINTERFACE_USB_DEVICE, /* CONST GUID * ClassGuid - USB class GUID */
		NULL, /* PCTSTR Enumerator */
		NULL, /* HWND hwndParent */
		DIGCF_PRESENT | DIGCF_DEVICEINTERFACE /* DWORD Flags */
		); 

	if (hDevInfo == INVALID_HANDLE_VALUE)
	{
		sprintf(szTraceBuf, "SetupDiClassDevs() failed. GetLastError() " \
			"returns: 0x%x\n", GetLastError());
		OutputDebugStringA(szTraceBuf);
		return 1;
	}
	sprintf(szTraceBuf, "Device info set handle for all devices attached to " \
		"system: 0x%x\n", hDevInfo);
	OutputDebugStringA(szTraceBuf);
	// Retrieve a context structure for a device interface of a device 
	// information set.
	DWORD dwIndex = 0;
	SP_DEVICE_INTERFACE_DATA devInterfaceData;
	ZeroMemory(&devInterfaceData, sizeof(SP_DEVICE_INTERFACE_DATA));
	devInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
	BOOL bRet = FALSE;
	ULONG  neededLength,requiredLength;  
	PSP_DEVICE_INTERFACE_DETAIL_DATA         ClassDeviceData; 
	HIDD_ATTRIBUTES   attributes; 

	while(TRUE)
	{ 
		bRet = SetupDiEnumDeviceInterfaces(
			hDevInfo, /* HDEVINFO DeviceInfoSet */
			NULL, /* PSP_DEVINFO_DATA DeviceInfoData */ 
			&GUID_DEVINTERFACE_USB_DEVICE, /* CONST GUID * InterfaceClassGuid */
			dwIndex,
			&devInterfaceData /* PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData */
			);
		if (!bRet)
		{
			TCHAR buffer[1024];
			TCHAR szTraceBuf[1024];
			GetErrString(buffer,GetLastError());

			wsprintf(szTraceBuf, L"SetupDiEnumDeviceInterfaces failed msg:%s",buffer);
			OutputDebugStringW(szTraceBuf);

			if (GetLastError() == ERROR_NO_MORE_ITEMS)
			{
				break;
			}
		}else{

			//   发现一个HID设备,获取设备的详细信息 
			//   第一次调用SetupDiGetDeviceInterfaceDetail得到ClassDeviceData的大小,但返回错误 
			SetupDiGetDeviceInterfaceDetail(hDevInfo,&devInterfaceData, 
				NULL,0,&requiredLength,NULL); 
			neededLength                         =requiredLength; 
			ClassDeviceData                         =(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(neededLength); 
			ClassDeviceData-> cbSize   =sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); 

			//第二次调用SetupDiGetDeviceInterfaceDetail   
			//   使用 合适的neededLength. 
			if   (!SetupDiGetDeviceInterfaceDetail(hDevInfo,&devInterfaceData, 
				ClassDeviceData,neededLength,&requiredLength,NULL)) 
			{ 
				free(ClassDeviceData); 
				SetupDiDestroyDeviceInfoList(hDevInfo);         
				return   -1; 
			} 
			//   建立HID设备的句柄 
			HANDLE handle=CreateFile(ClassDeviceData-> DevicePath, 
				GENERIC_READ|GENERIC_WRITE, 
				FILE_SHARE_READ|FILE_SHARE_WRITE, 
				NULL,OPEN_EXISTING,0,NULL); 
			//   获取   attributes   以便得到Vendor   ID   和   Product   ID 
			HidD_GetAttributes(handle,&attributes); 

			TCHAR buffer[1024];

			wsprintf(buffer,L"name:%s pid=%d vid=%d version=%d \n",ClassDeviceData-> DevicePath,attributes.ProductID,attributes.VendorID,attributes.VersionNumber);
			OutputDebugStringW(buffer);
			CloseHandle(handle);         

			free(ClassDeviceData); 

		}

		dwIndex++;	
	}

	sprintf(szTraceBuf, "Number of device interface sets representing all " \
		"devices attached to system: %d\n", dwIndex);
	OutputDebugStringA(szTraceBuf);
	SetupDiDestroyDeviceInfoList(hDevInfo);
	getch();
	return 0;
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
现在USB设备却很多,因此对USB设备的查找与读写就必不可少了。但是能找到关于USB读写的资料很少。这里使用VC++示范了一些获得USB信息的方法。 一、枚举USB设备   通过枚举USB控制器->枚举此控制器上的USB HUB->枚举HUB的各个端口->获得设备信息。 枚举控制器: wsprintf(HCName, "\\\\.\\HCD%d", HCNum); hHCDev = CreateFile(HCName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);   计算机上的USB主控制器以HCD1,HCD2等命名。通过控制器名称,使用CCreateFile 打开它。使用DeviceIoControl即可得到其驱动程序名,以及与它连接的HUB的名称。用CCreateFile打开HUB,获得连接信息。再枚举HUB的各个端口即可获得连接的设备信息。 二、枚举HID设备   HID设备是微软定义的标准人机接口规范。比如USB鼠标,USB游戏手柄等。不用查找具体设备的GUID,使用API HidD_GetHidGuid(&guidHID)即可得到GUID。有了GUID通过API SetupDiEnumDeviceInterfaces可获得是否有设备连接。如果此类设备连接通过SetupDiGetDeviceInterfaceDetail获得它的设备路径信息。使用CCreateFile 打开它,通过HidD_GetAttributes获得其基本属性信息。使用DeviceIoControl可以获得更详细的属性。在本代码中如果计算机上插有USB游戏手柄,可获得其信息。但不知道为什么xp下却不能获得USB鼠标的信息。 三 枚举U盘   先用GetDriveType API获得设备的类型,若类型为REMOVABLE(当然有些大容量U盘可能报告为FIXED,那就需要其他方法来确定了),即可能是U盘。用CCreateFile 打开之后,再用IOCTL_STORAGE_QUERY_PROPERTY为参数的DeviceIoControl来获得其属性。 四、结束语   示例工程在winxp+xpDDK+VC6下编译通过。USB设备种类比较多,也比较特殊,不同厂商的硬件不同,控制软件也不尽相同(我想主要是ICTL码不同,也不容易查到)。使得访问USB口的设备不象串口并口那么方便。这个例程只是展示了访问的基本方法。其中还有些问题还没有解决,发出来希望大家解决之后能通知我或者发表出来。 参考了USBPort,USBview等代码,一并致谢。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值