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

📄 devicebase03.cpp

📁 shuibiao danpianji chengxu
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// 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 + -