📄 devicebase03.cpp
字号:
// DeviceBase03.cpp: implementation of the CDeviceBase03 class.
//
//////////////////////////////////////////////////////////////////////
#include "windows.h"
#include "DeviceBase03.h"
#include "kxssbpriv.h"
#include <string.h>
#include <time.h>
#include "kxssbdll.h"
#include "..\spkdll_share\spkdll.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDeviceBase03::CDeviceBase03()
{
faxingmm=0x7006E52A;
//非加密模式
modezc[0]=0x00;
modezc[1]=0x08;
modezc[2]=0x8c;
modezc[3]=0xe8;
//加密模式
modejmzc[0]=0x00;
modejmzc[1]=0x08;
modejmzc[2]=0x8e;
modejmzc[3]=0xf8;
//空密码
mm_clear[0]=0x00;
mm_clear[1]=0x00;
mm_clear[2]=0x00;
mm_clear[3]=0x00;
//支持的表型号列表
nEnableNum[0]=430001001;
nEnableNum[1]=430002001;
nEnableNum[2]=430003001;
nEnableNum[3]=430004001;
nEnableNumGs=4;
YhmmJmKey=0xABCD1234;
//初始设置当前表型号
nCurrDeviceNum[0]=nEnableNum[0];
nCurrDeviceNum[1]=nEnableNum[1];
nCurrDeviceNum[2]=nEnableNum[2];
nCurrDeviceNum[3]=nEnableNum[3];
}
UINT CDeviceBase03::m_YhmmCoding(UINT yhmm)
{
return (yhmm ^ YhmmJmKey);
}
//从对应的密码表截取4字节密码数据
int CDeviceBase03::m_mmb_Get(int biaoh, //表版本号
int qsdz, //密码起始
int mmcd, //密码长度
BYTE * mmc) //返回的密码
{
int i, nDrvLoc;
//密码表设置
int nDrvNum[4]={430001001,
430002001,
430003001,
430004001};
BYTE mmq[20],mmb[4][600]={"E52C700AE52B7006E52A7002D24022D293D2920000C2930000C29222C293D2920000D2930000C29222D293D2920000C292C29322D293D292C2D5E59030E302D2D5C29200227A03EDF87914E6F70809DAFA79107B04E4F709DBFC7B1878147A03C3E633F608DAFA79107A04E737D4F709DAF9DBE8781079227A03E6540FF709E654F0C4F70809DAF2227808334005E11AD8F922D293D2920000C292C293E10BC293D2920000C29280E77808D293D292E59030E305E13CD8F322C3EA33FAC292E131D3EA33FAC292E1317EA5DEFE22F144DDFC227D0AF149227D24F14922753E00C203E6253EF53E08DAF8B53D02D203227C1079287B15F1BC0C09DBFA7B03AC29792AF1BC0C09DBFA2279287C10F19F090CDBFAC2E97B03AC29792AF19F09",
"E52C700AE52B7006E52A7002D24022D291D2920000C2910000C29222C291D2920000D2910000C29222D291D2920000C292C29122D291D292C2D5E59030E102D2D5C29200227808D291D292E59030E105C1D8D8F322C3EA33FAC292C1CDD3EA33FAC292C1CD7808334005C1F6D8F922D291D2920000C292C291C1E7C291D2920000C29280E77A03E637F70809DAF9227A03E796F70809DAF922E6F70809DAFA22758911E4F58DF58BFBD28ED2ABD2AF227EA5DEFE227D0AF13522F12BDDFC2200000000227D24F13522C2AFD18A74A0D1E0D1AFECD1E0D1AFE7D1E0D1AFD197D2AF7D14F13522C2AFD18A74A0D1E0D1AFECD1E0D1AFD18A74A1D1E0D1AFD1C0D1A4D197F7D2AF7D02F135227C0B79237B15F1610C09DBFA7B03AC29792AF1610C09",
"E52C700AE52B7006E52A7002D24022D293D2920000C2930000C29222C293D2920000D2930000C29222D293D2920000C292C29322D293D292C2D5E59030E302D2D5C29200227A03E637F70809DAF9227A03E796F70809DAF9227808334005C1EAD8F922D293D2920000C292C293C1DBC293D2920000C29280E77808D293D292E59030E305E10CD8F322C3EA33FAC292E101D3EA33FAC292E101758911E4F58DF58BFBD28ED2ABD2AF22E6F70809DAFA22E4F532F533227EA5DEFE22F131DDFC227D0AF136227D24F13622C2E9D18A74A0D1D4D1AFECD1D4D1AFE7D1D4D1AFD1977D14F136D2E922D18A74A0D1D4D1AFECD1D4D1AFD18A74A1D1D4D1AFD1F4D1A4D197F77D02F136227C1079287B19F1620C09DBFA7B03AC29792AF1620C09DBFA227B1679",
"E52C700AE52B7006E52A7002D24022D293D2920000C2930000C29222C293D2920000D2930000C29222D293D2920000C292C29322D293D292C2D5E59030E302D2D5C29200227A03E637F70809DAF9227A03E796F70809DAF9227808334005C1EAD8F922D293D2920000C292C293C1DBC293D2920000C29280E77808D293D292E59030E305E10CD8F322C3EA33FAC292E101D3EA33FAC292E101758911E4F58DF58BFBD28ED2ABD2AF22E6F70809DAFA22E4F532F533227EA5DEFE22F131DDFC227D0AF136227D24F13622C2E9D18A74A0D1D4D1AFECD1D4D1AFE7D1D4D1AFD1977D14F136D2E922D18A74A0D1D4D1AFECD1D4D1AFD18A74A1D1D4D1AFD1F4D1A4D197F77D02F136227C1079287B19F1620C09DBFA7B03AC29792AF1620C09DBFA227B1679",
};
if(qsdz<0||qsdz>251||mmcd>8) return -1;
nDrvLoc=-1;
for (i=0;i<nEnableNumGs;i++)
{
if(nDrvNum[i]==biaoh)
{
nDrvLoc=i;
break;
}
}
if(nDrvLoc==-1) return -1;
for(i=0;i<mmcd;i++)
{
mmq[i*2]=mmb[nDrvLoc][(qsdz+i)*2];
mmq[i*2+1]=mmb[nDrvLoc][(qsdz+i)*2+1];
}
::hextostr(mmq,mmc,4);
return 0;
}
//查询用户密码
int CDeviceBase03::scyhmm(int biaoh, //表版本号
int tzm, //密码表偏移地址
BYTE * idm, //变换后的密码
BYTE * yhmm) //真实的用户密码
{
BYTE scmm[10];
int i,errno;
errno=m_mmb_Get(biaoh,tzm,4,scmm);
for(i=0;i<4;i++) yhmm[i]=scmm[i]^idm[i];
return 0;
}
//密码计算
int CDeviceBase03::m_mmjs(int biaoh, //表版本号
int tzm, //密码表偏移地址
BYTE * bdmm, //变动密码
BYTE * nbdmm) //新变动密码
{
BYTE mmjs[10];
int i,errno;
errno=m_mmb_Get(biaoh,tzm,4,mmjs);
for(i=0;i<4;i++) nbdmm[i]=mmjs[i]^bdmm[i];
return 0;
}
//数据加密
int CDeviceBase03::m_sjjm(int biaoh, //表版本号
int tzm, //密码表偏移地址
BYTE * yssj, //需加密的数据
BYTE * jmsj) //返回的加密数据
{
BYTE mmjs[10];
int i,errno;
errno=m_mmb_Get(biaoh,tzm,4,mmjs);
for(i=0;i<4;i++) jmsj[i]=mmjs[i]^yssj[i];
return 0;
}
//核对消费卡
int CDeviceBase03::DKxGetID(long KnID, //用户ID号
long yhmm) //用户密码
{
return 0;
/*
unsigned char zhuanzf[10];
int errno,zhuansz;
if(testview)
{
char xxinfo[100];
wsprintf(xxinfo,"ID=%ld\nyhmm=%ld",KnID,yhmm);
MessageBox(NULL,xxinfo,"写入数据显示窗口",0);
}
//如果用非加密方式能读出返回 “11”
errno=Set_modecode(modezc);
if(errno!=0) return errcase(errno);
errno=rd_dat(1,1,zhuanzf);
if(errno==0) return 11;
if(errno!=3) return errcase(errno);
//判断是否有正常的消费卡标志
//用加密方式读卡
errno=Set_modecode(modejmzc);
if(errno!=0) return errcase(errno);
zhuansz=m_YhmmCoding(yhmm);
numtostr(&zhuansz,zhuanzf);
errno=Set_pass(zhuanzf);
if (errno!=0) return errcase(errno);
errno=rd_dat(1,1,zhuanzf);
if (errno!=0) return errcase(errno);
errno=Set_pass(mm_clear); //清空密码暂存
errno=Set_modecode(modezc); //设为非加密方式
errno=0;
for(int i=0;i<4;i++)
{
if((zhuanzf[i]!=0xf2) && ((zhuanzf[i]&0x0F)!=0x03)) errno=10;
}
return errno;
*/
}
//分析消费卡中某一个表的卡数据
int CDeviceBase03::Xfqr(long nDrvID, //表版本号
long nDrvNum, //表位置号
struct XFZT * DrvSj, //表数据
BYTE * buff) //卡数据缓存
{
BYTE tmp;
DrvSj->xferr=0;
DrvSj->xfcs=0;
DrvSj->xfsl=0;
DrvSj->xfyx=1;
tmp=buff[nDrvNum];
switch(tmp)
{
case 0xF2:
DrvSj->xfcs=-1;
case 0x03:
BYTE jmcda[10],jmcdb[10];
int i,movedm;
for(i=0;i<4;i++)
jmcda[i]=buff[nDrvNum*4+4+i];
movedm=buff[20+nDrvNum];
m_sjjm(nDrvID,movedm,jmcda,jmcdb);
strznum.strzh[0]=jmcdb[0];
strznum.strzh[1]=jmcdb[1];
strznum.strzh[2]=jmcdb[2];
strznum.strzh[3]=0x00;
DrvSj->xfsl=strznum.numzh; //销售数量
if((jmcdb[3] & 0x20) && (tmp==0xF2))
DrvSj->xfcs=-2; //当不是正常销售卡时,回读次数制-2
break;
case 0x13:
case 0x23:
case 0x33:
case 0x43:
case 0x53:
case 0x63:
case 0x73:
case 0x83:
case 0x93:
case 0xA3:
case 0xB3:
case 0xC3:
case 0xD3:
case 0xE3:
case 0xF3:
strznum.strzh[0]=buff[20+nDrvNum];
strznum.strzh[1]=buff[7+nDrvNum*4];
strznum.strzh[2]=0x00;
strznum.strzh[3]=0x00;
DrvSj->xferr=strznum.numzh; //表内错误代码
DrvSj->xfcs=(tmp>>4) & 0x0F; //回读次数
strznum.strzh[0]=buff[nDrvNum*4+4];
strznum.strzh[1]=buff[nDrvNum*4+5];
strznum.strzh[2]=buff[nDrvNum*4+6];
strznum.strzh[3]=0x00;
DrvSj->xfsl=strznum.numzh; //表内余额
break;
default:
//卡标志非法
DrvSj->xfyx=0;
}
//处理余额为0标志
if((DrvSj->xfyx==1) && (DrvSj->xferr & 1))
DrvSj->xfsl=-1*DrvSj->xfsl;
return 0;
}
//写某一个表的消费数据
int CDeviceBase03::Wrxfk( long nDrvID, //表版本号
long nDrvNum, //表位置号
struct XFZT * DrvSj, //表数据
BYTE * buff) //卡数据缓存
{
int i,k;
int movedm;
BYTE jmcda[50],jmcdb[50];
BYTE nCheckNum,newxfcs;
if(DrvSj->xfyx==0) return 0; //此表不消费
movedm=rand()%255;
movedm=movedm & 0xC0;
newxfcs=(unsigned char) DrvSj->xfcs%32;
buff[nDrvNum]=0xF2;
newxfcs+=movedm;
if(DrvSj->xferr)
newxfcs |= 0x20; //当不是正常销售制卡时,newxfcs的每5位置1
//否则置0
for(k=0;k<4;k++) //用以测试跳转码是否合适(<251)
{
strznum.numzh=DrvSj->xfsl;
jmcda[0]=strznum.strzh[0];
jmcda[1]=strznum.strzh[1];
jmcda[2]=strznum.strzh[2];
jmcda[3]=newxfcs;
nCheckNum=jmcda[0]+jmcda[1]+jmcda[2]+jmcda[3];
if(nCheckNum<251) break;
newxfcs+=0x40;
}
if(nCheckNum>=251) return 2; //数据不合适
buff[20+nDrvNum]=nCheckNum;
movedm=nCheckNum;
m_sjjm(nDrvID,movedm,jmcda,jmcdb);
for(i=0;i<4;i++)
buff[4+nDrvNum*4+i]=jmcdb[i];
return 0;
}
//设置四表版本号
int CDeviceBase03::DKxSetCurrDevice(long *qbsj,long *dbsj,long *sb1sj,long *sb2sj)
{
long DrvZc[4];
int i,j;
//取四表版本号
DrvZc[0]=*qbsj;
DrvZc[1]=*dbsj;
DrvZc[2]=*sb1sj;
DrvZc[3]=*sb2sj;
//检查表版本号是否在可用列表中
for(i=0;i<4;i++)
{
for(j=0;j<nEnableNumGs;j++)
{
if(nEnableNum[j]==DrvZc[i]) break;
}
if(j==nEnableNumGs) return 0x102; //设备不存在
}
nCurrDeviceNum[0]=DrvZc[0];
nCurrDeviceNum[1]=DrvZc[1];
nCurrDeviceNum[2]=DrvZc[2];
nCurrDeviceNum[3]=DrvZc[3];
return 0;
}
//获取当前表版本号的设置
int CDeviceBase03::DKxGetCurrDevice(long *qbsj,long *dbsj,long *sb1sj,long *sb2sj)
{
*qbsj=nCurrDeviceNum[0];
*dbsj=nCurrDeviceNum[1];
*sb1sj=nCurrDeviceNum[2];
*sb2sj=nCurrDeviceNum[3];
return 0;
}
//设置发行密码
int CDeviceBase03::DKxSetFxmm(long fxmm)
{
long newfxmm;
if(testview)
{
char xxinfo[100];
wsprintf(xxinfo,"gsdm=%X\n",fxmm);
MessageBox(NULL,xxinfo,"写入数据显示窗口",0);
}
if(fxmm==0)
faxingmm=0x7006E52A; //使用默认密码
else
{
newfxmm=fxmm ^ 0x0A5C3E15;
if(newfxmm==0) return 2;
faxingmm=newfxmm;
}
return 0;
}
//获取发行密码
int CDeviceBase03::DKxGetFxmm(long *fxmm,long pwd)
{
if((*fxmm ^ pwd)==0x4c8a6b2e)
{
*fxmm=faxingmm^0x0A5C3E15;
return 0;
}
else
return 2;
}
//将空卡新制成加密卡,数据存储在wrbuff[]中
int CDeviceBase03::makenewcard(BYTE *wrbuff)
{
int i,errno;
//先设置为非加密方式
errno=Set_modecode(modezc);
if(errno!=0) return errcase(errno);
//写卡
errno=wr_dat(1,7,wrbuff);
if(errno!=0) return errcase(errno);
//校验
errno=rd_dat(1,7,rdbuff);
if(errno!=0) return 1;
for(i=0;i<28;i++)
{
if(wrbuff[i]!=rdbuff[i]) return 1;
}
//加密
errno=wr_modecode(modejmzc);
Set_pass(mm_clear);
Set_modecode(modezc);
return errcase(errno);
}
//将加密卡清空,参数:卡密码
int CDeviceBase03::clearjmcard(BYTE *mm)
{
int i,errno;
//设置为加密方式
errno=Set_modecode(modejmzc);
if (errno!=0) return errcase(errno);
errno=Set_pass(mm);
if(errno==0) errno=wr_pass(mm_clear);
if(errno==0) errno=wr_modecode(modezc);
if(errno!=0) return errcase(errno);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -