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

📄 usbmicard.cpp

📁 Mifare USBMiCard.DLL - Visual C/C++ Source Program
💻 CPP
📖 第 1 页 / 共 3 页
字号:
{
	// AFX_MANAGE_STATE(AfxGetStaticModuleState());
	BYTE SendBuf[3],RevBuf[7],i,check=0;
	BOOL status;
	SendBuf[0]=0xAB;
	SendBuf[1]=0x00;
	SendBuf[2]=0xAB;
    status=Communicate(RevBuf,7,SendBuf,3);
    if(status)
	{
		for(i=0;i<6;i++)
			check^=RevBuf[i];
		if(check==RevBuf[6] && RevBuf[0]==0x00 && RevBuf[1]==0x04)
		{
			*CardSN=RevBuf[2]+RevBuf[3]*256+RevBuf[4]*256*256+RevBuf[5]*256*256*256;
			return 0;
		}
		else
         return 1;
	}
	else
         return 1;
}

MI_CARD_API long WINAPI SelectCard(unsigned long CardSN)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	BYTE SendBuf[7],RevBuf[3];
	BOOL status;
	unsigned long Card_Sn;
	Card_Sn=CardSN;
	SendBuf[0]=0xB7;
	SendBuf[1]=0x04;
	SendBuf[2]=(BYTE)Card_Sn%256;
    Card_Sn=Card_Sn/256;
	SendBuf[3]=(BYTE)Card_Sn%256;
	Card_Sn=Card_Sn/256;
	SendBuf[4]=(BYTE)Card_Sn%256;
	Card_Sn=Card_Sn/256;
	SendBuf[5]=(BYTE)Card_Sn;
	SendBuf[6]=SendBuf[0]^SendBuf[1]^SendBuf[2]^SendBuf[3]^SendBuf[4]^SendBuf[5];
    status=Communicate(RevBuf,3,SendBuf,7);
	if(status)
	{
		
		if( RevBuf[0]==0x00 && RevBuf[1]==0x00 && RevBuf[2]==0x00)
		{
			return 0;
		}
		else
           return 1;
	}
	else
           return 1;
}
MI_CARD_API long WINAPI CardAuthern(unsigned char ModeSN,unsigned char  SectorSN,unsigned char BlockSN)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	BYTE SendBuf[6],RevBuf[3];
	BOOL status;
	SendBuf[0]=0xb8;
	SendBuf[1]=0x03;
	SendBuf[2]=ModeSN;
	SendBuf[3]=SectorSN;
	SendBuf[4]=BlockSN;	
	SendBuf[5]=SendBuf[0]^SendBuf[1]^SendBuf[2]^SendBuf[3]^SendBuf[4];
	status=Communicate(RevBuf,3,SendBuf,6);
	if(status)
	{
		
		if( RevBuf[0]==0x00 && RevBuf[1]==0x00 && RevBuf[2]==0x00)
		{
			return 0;
		}
		else
           return 1;
	}
	else
          return 1;
}
MI_CARD_API long WINAPI HaltCard()
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	BYTE SendBuf[3],RevBuf[3];
	BOOL status;
	SendBuf[0]=0xBD;
	SendBuf[1]=0x00;
	SendBuf[2]=0xBD;
    status=Communicate(RevBuf,3,SendBuf,3);
	if(status)
	{
		
		if( RevBuf[0]==0x00 && RevBuf[1]==0x00 && RevBuf[2]==0x00)
		{
			return 0;
		}
		else
			return 1;
		
	}
	else
		return 1;
}

// MI_CARD_API long WINAPI TransKey(unsigned char sector , BYTE *mima)
MI_CARD_API long FAR PASCAL MifUSB_TransKey(BYTE nSector , BYTE *sKey)
{
	return(MifareTransKey(nSector, sKey));

	/*
	// AFX_MANAGE_STATE(AfxGetStaticModuleState());
	BYTE SendBuf[10],RevBuf[3],i,check=0;
	BOOL status;

	SendBuf[0]=0xA4;
	SendBuf[1]=0x07;
	SendBuf[2]=sector;
	// SendBuf[2]=*sector;

	for(i=3;i<9;i++)
		SendBuf[i]=(BYTE)nKey[i-3];

	for(i=0;i<9;i++)
		check^=SendBuf[i];

	SendBuf[9]=check;

	status=Communicate(RevBuf,3,SendBuf,10);
    if(status)
	{
		if(RevBuf[0]==0x00 && RevBuf[1]==0x00 && RevBuf[2]==0x00)
			return 0;
		else
           return 1;
	}
	else
         return 1; 
	*/
}


MI_CARD_API long FAR PASCAL TransKey(unsigned char sector , unsigned char *mima)
{
	// AFX_MANAGE_STATE(AfxGetStaticModuleState());
	BYTE SendBuf[10],RevBuf[3],i,check=0;
	BOOL status;

	SendBuf[0]=0xA4;
	SendBuf[1]=0x07;
	SendBuf[2]=sector;
	// SendBuf[2]=*sector;

	for(i=3;i<9;i++)
		SendBuf[i]=(BYTE)mima[i-3];

	for(i=0;i<9;i++)
		check^=SendBuf[i];

	SendBuf[9]=check;

	status=Communicate(RevBuf,3,SendBuf,10);
    if(status)
	{
		if(RevBuf[0]==0x00 && RevBuf[1]==0x00 && RevBuf[2]==0x00)
			return 0;
		else
           return 1;
	}
	else
         return 1; 
}

MI_CARD_API long WINAPI WriteKey(unsigned char * sector,unsigned long CardSN,unsigned char * mode ,unsigned char *mima)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	BYTE SendBuf[25],RevBuf[3],i,check=0;
	BOOL status;
	unsigned long Card_Sn;
	Card_Sn=CardSN;
	SendBuf[0]=0xae;
	SendBuf[1]=0x16;
	SendBuf[2]=*sector;
	SendBuf[3]=(BYTE)Card_Sn%256;
	Card_Sn=Card_Sn/256;
	SendBuf[4]=(BYTE)Card_Sn%256;
	Card_Sn=Card_Sn/256;
	SendBuf[5]=(BYTE)Card_Sn%256;
	Card_Sn=Card_Sn/256;
	SendBuf[6]=(BYTE)Card_Sn;
	for(i=7;i<23;i++)
	  SendBuf[i]=mima[i-7];
	SendBuf[23]=*mode;	
	for(i=0;i<24;i++)
	 check=check^SendBuf[i];
 	SendBuf[24]=check;
	status=Communicate(RevBuf,3,SendBuf,25);
	if(status)
	{
		if(RevBuf[0]==0x00 && RevBuf[1]==0x00 && RevBuf[2]==0x00)
		{
			return 0;
		}
		else
            return 1;
	}
	else
           return 1;
}
MI_CARD_API long WINAPI ReadValue(unsigned long BlockSN,unsigned long CardSN,unsigned char mode, long *value)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	BYTE SendBuf[9],RevBuf[7],i,check=0;
	BOOL status;
	unsigned long Card_Sn;
	Card_Sn=CardSN;
	SendBuf[0]=0xaf;
	SendBuf[1]=0x06;
    SendBuf[2]=(BYTE)BlockSN;
	SendBuf[3]=(BYTE)Card_Sn%256;
	Card_Sn=Card_Sn/256;
	SendBuf[4]=(BYTE)Card_Sn%256;
	Card_Sn=Card_Sn/256;
	SendBuf[5]=(BYTE)Card_Sn%256;
	Card_Sn=Card_Sn/256;
	SendBuf[6]=(BYTE)Card_Sn;
	SendBuf[7]=mode;
	SendBuf[8]=SendBuf[0]^SendBuf[1]^SendBuf[2]^SendBuf[3]^SendBuf[4]^SendBuf[5]^SendBuf[6]^SendBuf[7];
	status=Communicate(RevBuf,7,SendBuf,9);
	if(status)
	{
		for(i=0;i<6;i++)
			check^=RevBuf[i];
		if(check==RevBuf[6] && RevBuf[0]==0x00 && RevBuf[1]==0x04 && RevBuf[6]==check)
		{			
            *value=RevBuf[2]+RevBuf[3]*256+RevBuf[4]*256*256+RevBuf[5]*256*256*256;			
			return 0;
		}
			
		else
         return 1;
	}
	else
         return 1;
}
MI_CARD_API long WINAPI WriteValue(unsigned long BlockSN,unsigned long CardSN,unsigned char mode, long *value,long *Realvalue)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	BYTE SendBuf[13],RevBuf[7],i,check=0;
	long Wvalue,Rvalue;
	unsigned long Card_Sn;
	Card_Sn=CardSN;
	BOOL status;
	SendBuf[0]=0xb0;
	SendBuf[1]=0x0a;
    SendBuf[2]=(BYTE)BlockSN;
	SendBuf[3]=(BYTE)Card_Sn%256;
	Card_Sn=Card_Sn/256;
	SendBuf[4]=(BYTE)Card_Sn%256;
	Card_Sn=Card_Sn/256;
	SendBuf[5]=(BYTE)Card_Sn%256;
	Card_Sn=Card_Sn/256;
	SendBuf[6]=(BYTE)Card_Sn;
	Wvalue=*value;
	SendBuf[7]=(BYTE)Wvalue%256;
	Wvalue=Wvalue/256;
	SendBuf[8]=(BYTE)Wvalue%256;
	Wvalue=Wvalue/256;
	SendBuf[9]=(BYTE)Wvalue%256;
	Wvalue=Wvalue/256;
	SendBuf[10]=(BYTE)Wvalue;
	SendBuf[11]=mode;
	for(i=0;i<12;i++)
		check^=SendBuf[i];
	SendBuf[12]=check;
	status=Communicate(RevBuf,7,SendBuf,13);
	if(status)
	{
		check=0;
		for(i=0;i<6;i++)
			check^=RevBuf[i];
		if(check==RevBuf[6] && RevBuf[0]==0x00 && RevBuf[1]==0x04)
		{			
			Rvalue=RevBuf[2]+RevBuf[3]*256+RevBuf[4]*256*256+RevBuf[5]*256*256*256;
			if(Rvalue!=*value)
				return 1;
			 *Realvalue=Rvalue;
			return 0;
		}
		else
         return 1;
	}
	else
         return 1;
}
MI_CARD_API long WINAPI IncrementValue(unsigned long BlockSN,unsigned long CardSN, unsigned char mode,long *value,long *Realvalue)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	BYTE SendBuf[13],RevBuf[7],i,check=0;
	long Wvalue,Rvalue;
	unsigned long Card_Sn;
	Card_Sn=CardSN;
	BOOL status;
	SendBuf[0]=0xb1;
	SendBuf[1]=0x0a;
    SendBuf[2]=(BYTE)BlockSN;
	SendBuf[3]=(BYTE)Card_Sn%256;
	Card_Sn=Card_Sn/256;
	SendBuf[4]=(BYTE)Card_Sn%256;
	Card_Sn=Card_Sn/256;
	SendBuf[5]=(BYTE)Card_Sn%256;
	Card_Sn=Card_Sn/256;
	SendBuf[6]=(BYTE)Card_Sn;
	Wvalue=*value;
	SendBuf[7]=(BYTE)Wvalue%256;
	Wvalue=Wvalue/256;
	SendBuf[8]=(BYTE)Wvalue%256;
	Wvalue=Wvalue/256;
	SendBuf[9]=(BYTE)Wvalue%256;
	Wvalue=Wvalue/256;
	SendBuf[10]=(BYTE)Wvalue;
	SendBuf[11]=mode;
	for(i=0;i<12;i++)
		check^=SendBuf[i];
	SendBuf[12]=check;
	status=Communicate(RevBuf,7,SendBuf,13);
	if(status)
	{
		check=0;
		for(i=0;i<6;i++)
			check^=RevBuf[i];
		if(check==RevBuf[6] && RevBuf[0]==0x00 && RevBuf[1]==0x04)
		{			
			Rvalue=RevBuf[2]+RevBuf[3]*256+RevBuf[4]*256*256+RevBuf[5]*256*256*256;
			if(Rvalue!=*value)
				return 1;
             *Realvalue=Rvalue;
			return 0;
		}
		else
         return 1;
	}
	else
         return 1;
}
MI_CARD_API long WINAPI DecrementValue(unsigned long BlockSN,unsigned long CardSN, unsigned char mode,long *value,long *Realvalue)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	BYTE SendBuf[13],RevBuf[7],i,check=0;
	long Wvalue,Rvalue;
	unsigned long Card_Sn;
	Card_Sn=CardSN;
	BOOL status;
	SendBuf[0]=0xb2;
	SendBuf[1]=0x0a;
    SendBuf[2]=(BYTE)BlockSN;
	SendBuf[3]=(BYTE)Card_Sn%256;
	Card_Sn=Card_Sn/256;
	SendBuf[4]=(BYTE)Card_Sn%256;
	Card_Sn=Card_Sn/256;
	SendBuf[5]=(BYTE)Card_Sn%256;
	Card_Sn=Card_Sn/256;
	SendBuf[6]=(BYTE)Card_Sn;
	Wvalue=*value;
	SendBuf[7]=(BYTE)Wvalue%256;
	Wvalue=Wvalue/256;
	SendBuf[8]=(BYTE)Wvalue%256;
	Wvalue=Wvalue/256;
	SendBuf[9]=(BYTE)Wvalue%256;
	Wvalue=Wvalue/256;
	SendBuf[10]=(BYTE)Wvalue;
	SendBuf[11]=mode;
	for(i=0;i<12;i++)
		check^=SendBuf[i];
	SendBuf[12]=check;
	status=Communicate(RevBuf,7,SendBuf,13);
	if(status)
	{
		check=0;
		for(i=0;i<6;i++)
			check^=RevBuf[i];
		if(check==RevBuf[6] && RevBuf[0]==0x00 && RevBuf[1]==0x04)
		{			
			Rvalue=RevBuf[2]+RevBuf[3]*256+RevBuf[4]*256*256+RevBuf[5]*256*256*256;
			if(Rvalue!=*value)
				return 1;
			 *Realvalue=Rvalue;
			return 0;
		}
		else
         return 1;
	}
	else
         return 1;
}

MI_CARD_API LPSTR WINAPI TestString(int nSector, int nBlock)
{
	// AFX_MANAGE_STATE(AfxGetStaticModuleState());
	char szBuf[255];
	wsprintf(szBuf,"sector=%02d - 12345ABCDE67890FGHIJ12345KLMNO - block=%02d", nSector, nBlock);
	return(szBuf);
}


// MI_CARD_API long WINAPI ReadBlock(int BlockSN,unsigned long CardSN,int mode, unsigned char *RevDat)
MI_CARD_API LPSTR FAR PASCAL MifUSB_ReadBlock(BYTE nBlock, unsigned long cSN, BYTE nMode)
{
	int nRet;
	int nErr=0;
	BYTE iBuf[255];
	char szBuf[255];

	if(nMode < 0 || nMode > 1) {
		wsprintf(szBuf,"INVALID MODE");
		nErr=1;
	}

	if(CurrentCardType==0x04){
		// Mifare 1K
		if(nBlock < 0 || nBlock > 63) {
			wsprintf(szBuf,"INVALID BLOCK");
			nErr=1;
		}
	}
	else if(CurrentCardType==0x02){
		// Mifare 4K
		if(nBlock < 0 || nBlock > 255) {
			wsprintf(szBuf,"INVALID BLOCK");
			nErr=1;
		}
	}
	else nErr=1;

	if(nErr==0){
		nRet=MifareReadBlock(nBlock, cSN, nMode, iBuf);
		if(nRet==0){
			wsprintf(szBuf,"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", 
							(BYTE *)iBuf[0],(BYTE *)iBuf[1],(BYTE *)iBuf[2],(BYTE *)iBuf[3],
							(BYTE *)iBuf[4],(BYTE *)iBuf[5],(BYTE *)iBuf[6],(BYTE *)iBuf[7],
							(BYTE *)iBuf[8],(BYTE *)iBuf[9],(BYTE *)iBuf[10],(BYTE *)iBuf[11],
							(BYTE *)iBuf[12],(BYTE *)iBuf[13],(BYTE *)iBuf[14],(BYTE *)iBuf[15]);
		}
		else{
			wsprintf(szBuf,"NAK");
		}
	}

	return(szBuf);
}

MI_CARD_API LPSTR FAR PASCAL MifUSB_ReadBlockEx(BYTE nSector, BYTE nBlock, unsigned long sSN, BYTE nMode, BYTE *sKey)
{
	int nRet;
	int nErr=0;
	BYTE bBlock;
	BYTE iBuf[255];
	char szBuf[255];

	if(CurrentCardType==0x04){
		if((nSector < 0) || (nSector > 15)){
			wsprintf(szBuf,"INVALID SECTOR");
			nErr=1;
		}
	}
	else if(CurrentCardType==0x02){
		if((nSector < 0) || (nSector > 39)){
			wsprintf(szBuf,"INVALID SECTOR");
			nErr=1;
		}
	}

	if(nErr==0){
		if(MifareTransKey(nSector, sKey)){
			wsprintf(szBuf,"INVALID KEY");
		}
		else{
			if(nMode < 0 || nMode > 1) {
				wsprintf(szBuf,"INVALID MODE");
				nErr=1;
			}

			if(CurrentCardType==0x04){
				// Mifare 1K
				if(nBlock < 0 || nBlock > 3) {
					wsprintf(szBuf,"INVALID BLOCK");
					nErr=1;
				}
			}
			else if(CurrentCardType==0x02){
				// Mifare 4K
				if(nSector < 32){
					if(nBlock < 0 || nBlock > 3) {
						wsprintf(szBuf,"INVALID BLOCK");
						nErr=1;
					}
				}
				else{
					if(nBlock < 0 || nBlock > 15) {
						wsprintf(szBuf,"INVALID BLOCK");
						nErr=1;
					}
				}
			}

			if(nErr==0){
				if(nSector > 31){
					bBlock = (32 * 4) + (((nSector - 32) * 16) + nBlock);
				}
				else{
					bBlock = nSector * 4 + nBlock;
				}
				nRet=MifareReadBlock(bBlock, sSN, nMode, iBuf);
				if(nRet==0){
					wsprintf(szBuf,"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", 
									(BYTE *)iBuf[0],(BYTE *)iBuf[1],(BYTE *)iBuf[2],(BYTE *)iBuf[3],
									(BYTE *)iBuf[4],(BYTE *)iBuf[5],(BYTE *)iBuf[6],(BYTE *)iBuf[7],
									(BYTE *)iBuf[8],(BYTE *)iBuf[9],(BYTE *)iBuf[10],(BYTE *)iBuf[11],
									(BYTE *)iBuf[12],(BYTE *)iBuf[13],(BYTE *)iBuf[14],(BYTE *)iBuf[15]);
				}
				else{
					wsprintf(szBuf,"NAK");
				}
			}
		}
	}
	return(szBuf);
}

int MifareReadBlock(BYTE nBlock, unsigned long sSN, BYTE nMode, BYTE *RevDat)
{
	BYTE SendBuf[9],RevBuf[19],i,check=0;
	BOOL status;

	unsigned long Card_Sn;

	SendBuf[0]=0xAC;
	SendBuf[1]=0x06;	
	SendBuf[2]=nBlock;

	Card_Sn=sSN;
	SendBuf[3]=(BYTE)Card_Sn%256;
	Card_Sn=Card_Sn/256;
	SendBuf[4]=(BYTE)Card_Sn%256;
	Card_Sn=Card_Sn/256;
	SendBuf[5]=(BYTE)Card_Sn%256;
	Card_Sn=Card_Sn/256;
	SendBuf[6]=(BYTE)Card_Sn;

    SendBuf[7]=nMode;
	for(i=0;i<8;i++)
     check^=SendBuf[i];
    SendBuf[8]=check;	
    status=Communicate(RevBuf,19,SendBuf,9);
	if(status)
	{
		check=0;
		for(i=0;i<18;i++)
			check^=RevBuf[i];
		if(check==RevBuf[18] && RevBuf[0]==0x00 && RevBuf[1]==0x10)
		{
			  for(i=2;i<18;i++)
			  RevDat[i-2]= RevBuf[i];
              return 0;
		}
		else
         return 1;
	}
	else
         return 1;

}

int MifareGetSN(void)
{
	BYTE SendBuf[3],RevBuf[7],i,check=0;
	BOOL status;
	SendBuf[0]=0xAB;
	SendBuf[1]=0x00;
	SendBuf[2]=0xAB;
	status=Communicate(RevBuf,7,SendBuf,3);
    if(status)
	{
		for(i=0;i<6;i++)
			check^=RevBuf[i];
		if(check==RevBuf[6] && RevBuf[0]==0x00 && RevBuf[1]==0x04)
		{
			*szCardSN=RevBuf[2]+RevBuf[3]*256+RevBuf[4]*256*256+RevBuf[5]*256*256*256;
			return 0;
		}
		else
         return 1;
	}
	else
         return 1;
}

// int MifareTransKey(int nSector , LPSTR sKey)
int MifareTransKey(BYTE nSector , BYTE *sKey)
{
	BYTE SendBuf[10],RevBuf[3],i,check=0;
	BOOL status;

	if(CurrentCardType==0x04){
		// Mifare 1K
		if((nSector < 0) || (nSector > 15))
			return(1);
	}
	else if(CurrentCardType==0x02){
		// Mifare 4K
		if((nSector < 0) || (nSector > 39))
			return(1);
	}
	else return(1);

	SendBuf[0]=0xA4;
	SendBuf[1]=0x07;
	SendBuf[2]=nSector;

	for(i=3;i<9;i++)
		SendBuf[i]=sKey[i-3];

	for(i=0;i<9;i++)
		check^=SendBuf[i];

	SendBuf[9]=check;

	status=Communicate(RevBuf,3,SendBuf,10);
    if(status)
	{
		if(RevBuf[0]==0x00 && RevBuf[1]==0x00 && RevBuf[2]==0x00)
			return 0;
		else
           return 1;
	}
	else
         return 1; 
}


// MI_CARD_API long WINAPI WriteBlock(int BlockSN,unsigned long CardSN,int mode, LPSTR SendDat)
MI_CARD_API long FAR PASCAL MifUSB_WriteBlock(BYTE nBlock, unsigned long sSN, BYTE nMode, BYTE *SendDat)
{
	// AFX_MANAGE_STATE(AfxGetStaticModuleState());
	BYTE SendBuf[25],RevBuf[19],RevDat[16],i,check=0;
	BOOL status;

	unsigned long Card_Sn;
	int nErr=0;

	if(nMode < 0 || nMode > 1) {

⌨️ 快捷键说明

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