⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usb.cpp

📁 经典的 读写usb设备的 dll
💻 CPP
字号:
//////////////////////////////////////////////////////////////////////
//
// USBDevice1.cpp: implementation of the USBDevice class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "USB.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

static USBDevice Device;

USBDevice::USBDevice()
{

}

USBDevice::~USBDevice()
{

}

extern "C"__declspec(dllexport) bool InputReport(unsigned char report[])
{
	unsigned char i;
	unsigned char	Devicereport[15];
	unsigned long	BytesWritten;

	for(i = 0; i < 15;i++)
		Devicereport[i] = 0;
	//Devicereport[2] = 0xff;
	//Devicereport[3] = 0xff;

	if(Device.GetDeviceHandler())
	{ 
		if(Device.ReadReportFromDevice(Device.Device_Report))
		{
			for(i = 0; i < 15; i++)
				report[i] = Device.Device_Report[i];		
			//WriteFile(Device.DeviceHandler,Devicereport,15,&BytesWritten,NULL);
			CloseHandle(Device.DeviceHandler);
			return true;
		}
		else
		{
			CloseHandle(Device.DeviceHandler);
			return FALSE;		
		}
	}
	else
	{
		CloseHandle(Device.DeviceHandler);
		return false;
	}
}

extern "C"__declspec(dllexport) bool OutputReport(unsigned char report[])
{

	unsigned char	Devicereport[15],i;
	unsigned long	BytesWritten;

	for(i = 0; i < 15; i++)
		Devicereport[i + 1] = report[i];
	Devicereport[0] = 0;
	Devicereport[1] = 0;

	if(Device.GetDeviceHandler())
	{ 
		WriteFile(Device.DeviceHandler,Devicereport,15,&BytesWritten,NULL);
		CloseHandle(Device.DeviceHandler);
		return true;
	}
	else
	{
		CloseHandle(Device.DeviceHandler);
		return false;
	}
}

bool USBDevice::ReadReportFromDevice(unsigned char *p_Report)
{
	unsigned long BytesRead;

	if(ReadFile(DeviceHandler,p_Report,15,&BytesRead,NULL))
		return TRUE;
	else
		return FALSE;
}

PCHAR USBDevice::GetDeviceHandler(void)
{
	GUID guidHID;
	HidD_GetHidGuid(&guidHID);
		
	SP_DEVICE_INTERFACE_DATA strtInterfaceData;
	strtInterfaceData.cbSize=sizeof(SP_DEVICE_INTERFACE_DATA);
	BOOL bSuccess ;
	DWORD index=0;
	for(int i=0;i<10;i++)
	{
		HDEVINFO hDevInfo = SetupDiGetClassDevs(&guidHID,NULL,0,
			DIGCF_PRESENT|DIGCF_DEVICEINTERFACE );		//获得设备信息群的地址
	
		if(hDevInfo==INVALID_HANDLE_VALUE)
		{
			SetupDiDestroyDeviceInfoList(hDevInfo);
			return	NULL;
		}
		bSuccess= SetupDiEnumDeviceInterfaces(hDevInfo,NULL,&guidHID,index,
				&strtInterfaceData);	//获得设备信息群内的一个设备
		if (!bSuccess)	//("查找USB设备出错!");
		{
			SetupDiDestroyDeviceInfoList(hDevInfo);
			return	NULL;
		}
		else
		{
			if(strtInterfaceData.Flags == SPINT_ACTIVE )
				if(VerifyDeviceID(hDevInfo,strtInterfaceData)) 
				{
					SetupDiDestroyDeviceInfoList(hDevInfo);
					return PCHAR(0xff);
				}
			SetupDiDestroyDeviceInfoList(hDevInfo);
		}
	index++;
	}
	return NULL;
}

PCHAR USBDevice::VerifyDeviceID(HDEVINFO hDevInfo, SP_DEVICE_INTERFACE_DATA strtInterfaceData)
{
	PSP_DEVICE_INTERFACE_DETAIL_DATA strtDetailData;
	
	DWORD strSzie=0,requiesize=0;
	SetupDiGetDeviceInterfaceDetail(hDevInfo,&strtInterfaceData,NULL,0,&strSzie,NULL);

	requiesize=strSzie;
	strtDetailData=(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(requiesize);
	strtDetailData->cbSize=sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);

	SP_DEVINFO_DATA infodata;
	infodata.cbSize=sizeof(SP_DEVINFO_DATA);
	if (!SetupDiGetDeviceInterfaceDetail(hDevInfo,&strtInterfaceData,
		strtDetailData,strSzie,&requiesize,NULL))
	{
		//ShowMessage("查找设备路径时出错!");
		SetupDiDestroyDeviceInfoList(hDevInfo);
		free(strtDetailData);
		return NULL;
	}
	HANDLE hCom = CreateFile (
                  strtDetailData->DevicePath,
                  GENERIC_READ | GENERIC_WRITE,
                  FILE_SHARE_READ | FILE_SHARE_WRITE,
                  NULL, 
                  OPEN_EXISTING, 0, 
                  NULL);
	if (hCom == INVALID_HANDLE_VALUE)
	{
		//无法打开通信端口。不能读取设备信息!
		SetupDiDestroyDeviceInfoList(hDevInfo);
		free(strtDetailData);
		return NULL;
	}
	//打开通信端口成功!
	HIDD_ATTRIBUTES strtAttrib;

	//读取设备的标识...	
	strtAttrib.Size=sizeof(HIDD_ATTRIBUTES);
	if (!HidD_GetAttributes(hCom,&strtAttrib))
	{
		//"查询设备状态时出错!
		CloseHandle(hCom);
		free(strtDetailData);
		return NULL;	
	}

	if((strtAttrib.VendorID == 0x925) && (strtAttrib.ProductID== 0x4321))
	{
		DeviceHandler = hCom;
		free(strtDetailData);
		return PCHAR(0xff);
	}
	else
	{
		free(strtDetailData);
		return NULL;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -