?? 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 + -