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

📄 termsdriver.c.bak

📁 hid类usb对外设的驱动application
💻 BAK
📖 第 1 页 / 共 2 页
字号:
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include "hidsdi.h"
#include <setupapi.h>
#include <malloc.h>
#include "TermsDriver.h"

#define TermsDriver(foo) Java_TermsDriver_ ## foo
//------------读写事件,用于检测超时时间内的动作-----------
HANDLE ReadEventObject;
HANDLE WriteEventObject;
//---------------------------------------------------------

HANDLE TermsDriver(hcom)=NULL;

//---------------打印设备与HID设备的GUID-------------------
GUID DeviceGuid;
//---------------------------------------------------------

//---------------HID设备的能力描述符-----------------------
HIDP_CAPS Capabilities;
//---------------------------------------------------------

//---------------设备接口细节------------------------------
PSP_DEVICE_INTERFACE_DETAIL_DATA DetailData;
//---------------------------------------------------------

//---------------非阻塞读写标志----------------------------
OVERLAPPED HIDOverlappedRead; 
OVERLAPPED HIDOverlappedWrite;
//---------------------------------------------------------

//---------------获得HID设备能力---------------------------
void GetDeviceCapabilities(){
	PHIDP_PREPARSED_DATA PreparsedData;						//预解析数据,装载设备能力的描述
	HidD_GetPreparsedData(TermsDriver(hcom),&PreparsedData);
	HidP_GetCaps(PreparsedData,&Capabilities);				//将预解析数据填入设备能力描述符结构体中
	HidD_FreePreparsedData(PreparsedData);					//释放资源
}
//---------------------------------------------------------

//---------------HID设备传输有阻塞的可能,该函数为非阻塞模式传输定义事件------
void PreparedForOverlappedTransfer(){

    if(ReadEventObject==NULL){
		ReadEventObject=CreateEvent(NULL,TRUE,TRUE,"");
		HIDOverlappedRead.hEvent=ReadEventObject;
        HIDOverlappedRead.Offset=0;
		HIDOverlappedRead.OffsetHigh=0;
    }
	if(WriteEventObject==NULL){
		WriteEventObject=CreateEvent(NULL,TRUE,TRUE,"");
		HIDOverlappedWrite.hEvent=WriteEventObject;
        HIDOverlappedWrite.Offset=0;
		HIDOverlappedWrite.OffsetHigh=0;
    }
}
//----------------------------------------------------------------------------

//----------------当printFlag为TRUE时寻找打印设备,否则寻找HID类设备----------
//----------------找寻设备一共分为8步-----------------------------------------

//	1、获取对应的USB类设备的GUID
//	2、获得拥有该GUID类的设备的集合
//	3、遍历设备集合里每一个设备的接口标识
//	4、获取每一个标识下接口的详细数据结构
//	5、获取设备路径,打开设备
//	6、获得设备的字符串描述符
//	7、与既定规则进行比较
//	8、如果不符合,关闭设备,继续寻找;如果符合,继续操作。
//---------------------------------------------------------------------------

BOOL SearchDevices(byte deviceType[],BOOL printFlag){
	HIDD_ATTRIBUTES attributes;
	BOOL LastDevice=FALSE;
	BOOL DeviceDetected=FALSE;
	long Required;
	HANDLE hDevInfo;
	SP_DEVICE_INTERFACE_DATA DevInfoData;
	int Length,i,MemberIndex,Result;
	char tmpStr[128];
	char str[64];
	char str1[10];

	memset(tmpStr,0x00,128);
	memset(str,0x00,64);
	memset(str1,0x00,10);

	if(printFlag==TRUE){

		//--------获取Print类设备的GUID---------
		DeviceGuid.Data1 = 0x28d78fad;
		DeviceGuid.Data2 = 0x5a12;
		DeviceGuid.Data3 = 0x11D1;
		DeviceGuid.Data4[0] = 0xae;
		DeviceGuid.Data4[1] = 0x5b;
		DeviceGuid.Data4[2] = 0x00;
		DeviceGuid.Data4[3] = 0x00;
		DeviceGuid.Data4[4] = 0xf8;
		DeviceGuid.Data4[5] = 0x03;
		DeviceGuid.Data4[6] = 0xa8;
		DeviceGuid.Data4[7] = 0xc2;
		//--------------------------------------

		//-------获得指定类的设备集合-----------
		hDevInfo=SetupDiGetClassDevs(&DeviceGuid,NULL,NULL,DIGCF_PRESENT|DIGCF_DEVICEINTERFACE);
		//--------------------------------------

		DevInfoData.cbSize=sizeof(DevInfoData);
		MemberIndex=0;
		LastDevice=FALSE;

		//-------遍历该类下每一个设备-----------
		do{
			//---获取设备的标识结构-------------
			Result=SetupDiEnumDeviceInterfaces(hDevInfo,
				0,
				&DeviceGuid,
				MemberIndex,
				&DevInfoData);

			if(Result!=0){

				//---获得用于分配PSP_DEVICE_INTERFACE_DETAIL_DATA的空间的长度---
				Result=SetupDiGetDeviceInterfaceDetail(hDevInfo,
					&DevInfoData,
					NULL,
					0,
					&Length,
					NULL);

				//---获得接口的详细数据结构---
				DetailData=(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(Length);
				DetailData->cbSize=sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
				Result=SetupDiGetDeviceInterfaceDetail(hDevInfo,
					&DevInfoData,
					DetailData,
					Length,
					&Required,
					NULL);

				//----获取设备路径,以独占、非阻塞方式打开设备----
				//----以非阻塞方式打开USB口设备-------------------
				TermsDriver(hcom)=CreateFile(DetailData->DevicePath,
					GENERIC_READ|GENERIC_WRITE,
					FILE_SHARE_READ|FILE_SHARE_WRITE,
					NULL,
					OPEN_EXISTING,
					FILE_FLAG_OVERLAPPED,
					NULL);

				//-----获得厂商字符串,然后进行比较-----
				HidD_GetManufacturerString(TermsDriver(hcom),
						tmpStr,
						128);

				//-----将Unicode编码转化为ASCII码-------
				for(i=0;i<64;i++){
					str[i]=tmpStr[2*i];
				}
				//--------------------------------------
				str1[0]=str[12];// I
				str1[1]=str[13];// C
				str1[2]=str[14];// B
				str1[3]=str[15];// C

				//----------------比较细则--------------
				if(strcmp(deviceType,"pr2")==0||strcmp(deviceType,"Ar2400")==0){
					str1[4]=str[16];
					if(strcmp(str1,"ICBC1")==0||strcmp(str1,"ICBC0")==0){
						DeviceDetected=TRUE;
						PreparedForOverlappedTransfer();
					}
				}else{ 
					if(strcmp(deviceType,"scanner")==0){
						str1[4]=str[16];
						if(strcmp(str1,"ICBC2")==0){
							DeviceDetected=TRUE;
							PreparedForOverlappedTransfer();
						}else{ 
							if(strcmp(str1,"ICBC0")==0){
								str1[5]=str[17];
								if(strcmp(str1,"ICBC01")==0){
									DeviceDetected=TRUE;
									PreparedForOverlappedTransfer();
								}else{
									CloseHandle(TermsDriver(hcom));
								}
							}else {
								CloseHandle(TermsDriver(hcom));
							}
						}
					}
				}
				//--------------------------------------------------
			free(DetailData);
			}else
				LastDevice=TRUE;
			MemberIndex=MemberIndex+1;
		}while(LastDevice!=FALSE&&DeviceDetected!=FALSE);
		SetupDiDestroyDeviceInfoList(hDevInfo);
		return DeviceDetected;
	}else{
		//------------------寻找HID类设备--------------------
		memset(tmpStr,0x00,128);
		memset(str,0x00,64);
		memset(str1,0x00,10);
		LastDevice=FALSE;
		DeviceDetected=FALSE;
		MemberIndex=0;
		Result=0;
		Length=0;
		i=0;

		TermsDriver(hcom)=NULL;

		//获得HID类型设备的Guid
		HidD_GetHidGuid(&DeviceGuid);

		hDevInfo=SetupDiGetClassDevs(&DeviceGuid,NULL,NULL,DIGCF_PRESENT|DIGCF_DEVICEINTERFACE);
		DevInfoData.cbSize=sizeof(DevInfoData);
		do
		{
			Result=SetupDiEnumDeviceInterfaces(hDevInfo,
				0,
				&DeviceGuid,
				MemberIndex,
			    &DevInfoData);
			if(Result!=0){
				Result=SetupDiGetDeviceInterfaceDetail(hDevInfo,
					&DevInfoData,
					NULL,
					0,
					&Length,
					NULL);

				DetailData=(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(Length);
				DetailData->cbSize=sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);

				Result=SetupDiGetDeviceInterfaceDetail(hDevInfo,
					&DevInfoData,
					DetailData,
					Length,
					&Required,
					NULL);

				TermsDriver(hcom)=CreateFile(DetailData->DevicePath,
					GENERIC_READ|GENERIC_WRITE,
					FILE_SHARE_READ|FILE_SHARE_WRITE,
					NULL,
					OPEN_EXISTING,
					FILE_FLAG_OVERLAPPED,
					NULL);

				attributes.Size=sizeof(attributes);
				DeviceDetected=FALSE;

				Result=HidD_GetAttributes(TermsDriver(hcom),&attributes);
				HidD_GetManufacturerString(TermsDriver(hcom),
					tmpStr,
					128);
				for(i=0;i<64;i++){
					str[i]=tmpStr[2*i];
				}
				str1[0]=str[12];
				str1[1]=str[13];
				str1[2]=str[14];
				str1[3]=str[15];
				if(strcmp(deviceType,"pinkey")==0){
					str1[4]=str[16];
					if(strcmp(str1,"ICBC1")==0){
						DeviceDetected=1;
					    GetDeviceCapabilities();
					    PreparedForOverlappedTransfer();
					}
					else 
						if(strcmp(str1,"ICBC0")==0){
							str1[5]=str[17];
							if(strcmp(str1,"ICBC01")==0){
								DeviceDetected=1;
								GetDeviceCapabilities();
								PreparedForOverlappedTransfer();
							}else{
								CloseHandle(TermsDriver(hcom));
							}
						}
				}
				if(strcmp(deviceType,"MSFDriver")==0){
					str1[4]=str[16];
					if(strcmp(str1,"ICBC2")==0){
						DeviceDetected=1;
					    GetDeviceCapabilities();
					    PreparedForOverlappedTransfer();
					}
					else 
						if(strcmp(str1,"ICBC0")==0){
							str1[5]='0';
							str1[6]=str[18];
							if((strcmp(str1,"ICBC011")==0)||(strcmp(str1,"ICBC001")==0)){
								DeviceDetected=1;
								GetDeviceCapabilities();
								PreparedForOverlappedTransfer();
							}else{
								CloseHandle(TermsDriver(hcom));
							}
						}
				}
				if(strcmp(deviceType,"ICCard")==0){
					str1[4]=str[16];
					if(strcmp(str1,"ICBC3")==0){
						DeviceDetected=TRUE;
					    GetDeviceCapabilities();
					    PreparedForOverlappedTransfer();
					}
					else 
						if(strcmp(str1,"ICBC0")==0){
							str1[5]='0';
							str1[6]=str[19];
							if(str[6]=='1'){
								DeviceDetected=TRUE;
								GetDeviceCapabilities();
								PreparedForOverlappedTransfer();
							}else{
								CloseHandle(TermsDriver(hcom));
							}
						}
				}

⌨️ 快捷键说明

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