📄 termsdriver.c.bak
字号:
#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 + -