📄 commtran.c
字号:
}
len_index=ComBuffer[1]-1;
memset(buf,0x00,16);
memset(buf2,0x00,16);
i=0;
while(len_index>13)
{
buf[0]=0x12|Block_Index;
memcpy(buf+1,ComBuffer+3+i,13);
Status=Mf500PiccExchangeBlock(buf,16,buf2, &rec_bytelen, 1,5);
if(Status!=MI_OK)
{
SendResponse(0x80,1,buf);
return;
}
memset(buf2,0x00,16);
memset(buf,0x00,16);
len_index-=13;
i+=13;
}
buf[0]=0x02|Block_Index;
memcpy(buf+1,ComBuffer+3+i,len_index);
Status=Mf500PiccExchangeBlock(buf,len_index+3,buf2, &rec_bytelen,1, 5);
if(Status!=MI_OK)
{
SendResponse(0x80,1,buf);
return;
}
len_index=0;
while((buf2[0]==0x12)||(buf2[0]==0x13))
{
memcpy(ComBuffer+9+2+len_index,buf2+1,13);
len_index+=13;
memset(buf2,0xff,16); //2004.4.2
buf[0]=0xa2|Block_Index;
memset(buf2,0xff,16);
Status=Mf500PiccExchangeBlock(buf,3,buf2, &rec_bytelen,1, 5);
if(Status!=MI_OK)
{
SendResponse(0x80,1,buf);
return;
}
}
memset(buf,0xff,25);
//memcpy(buf,buf2,rec_bytelen);
if(rec_bytelen<5)
{
if((buf2[1]==0x00)&&(ComBuffer[9+2+len_index-1]==0x90))
{
sw1=0x90;
sw2=0x00;
ComBuffer[7+2]=sw1;
ComBuffer[8+2]=sw2;
SendResponse(0x01,len_index-1+3+17,buf);
return;
}
}
k=0;
j=0;
for(i=1;i<13;i++)
{
if((buf2[i]==0x90)&&(buf2[i+1]==0x00))
{
k=i;
j=1;
}
}
if(j==1)
{
i=k;
j=0;
}
if(i<13)
{
sw1=0x90;
sw2=0x00;
i--;
ComBuffer[7+2]=sw1;
ComBuffer[8+2]=sw2;
memcpy(ComBuffer+9+2+len_index,buf2+1,i);
len_index+=i;
}
else
{
sw1=buf2[1];
sw2=buf2[2];
ComBuffer[7+2]=sw1;
ComBuffer[8+2]=sw2;
len_index=0;
}
SendResponse(0x01,len_index+3+17,buf);
break;
case 0x58: //close card for pro
Status=deselect();
if(Status==MI_OK)
{
SendResponse(0x01,1,buf);
}
else
{
Status=deselect();
if(Status==MI_OK)
{
SendResponse(0x01,1,buf);
}
else SendResponse(0x80,1,buf);
}
break;
/**************************************************************************************/
case 0x98: //T=0; for hihgspeed sam card
W_DOG();
switch(ComBuffer[3])//check message's head
{
case 0x00:
case 0x04:
case 0x80:
case 0x84:
case 0xe0:
key_index=1; break;
default:
key_index=0;
}
if(key_index==0)
{
SendResponse(COS_CLA_ERROR,1,buf);
}
if(ComBuffer[1]==6)
{
len_index=1;
}
else len_index=0;
IO1=1;
len_x=ComBuffer[7]+2;
len_y=ComBuffer[4];
i=0;
I_send(ComBuffer[3]);
I_send(ComBuffer[4]);
I_send(ComBuffer[5]);
I_send(ComBuffer[6]);
I_send(ComBuffer[7]);
if(len_index==1)
{
sw1=I_receive();
if(sw1!=len_y)
{
sw2=I_receive();
buf[0]=sw1;
buf[1]=sw2;
SendResponse(0x01,3,buf);
return;
}
while(i<len_x)
{
CosBuffer[i]=I_receive();
i++;
}
memcpy(ComBuffer+9,CosBuffer,len_x);
SendResponse(0x01,i+1+17,buf);
return;
}
sw1=I_receive();
for(i=0;i<120;i++)
{
;
}
IO1=1;
for(i=8;i<(ComBuffer[1]+2);i++)
{
I_send(ComBuffer[i]);
}
sw1=I_receive();
sw2=I_receive();
if(sw1!=0x61)
{
buf[0]=sw1;
buf[1]=sw2;
SendResponse(0x01,3,buf);
return;
}
for(i=0;i<60;i++)
{
;
}
IO1=1;
len_y=sw2+2;
i=0;
I_send(0x00);
I_send(0xc0);
I_send(0x00);
I_send(0x00);
I_send(sw2);
sw1=I_receive();
while(i<len_y)
{
CosBuffer[i]=I_receive();
i++;
}
memcpy(ComBuffer+9,CosBuffer,len_y);
SendResponse(0x01,1+len_y+17,buf);
break;
/************************************************************/
case 0x99: //RESET SAM CARD
Reset1();
i=0;
while(1)
{
Status=I_receive1(ComBuffer+9+i);
if(Status) break;
i++;
}
if(i<5) //look as error
{
SendResponse(0x80,1+i+17,buf);
return;
}
SendResponse(0x01,1+i+17,buf);
break;
/********************************************************************************/
case 0x72: //T=0; T=1; IC COMMAND
W_DOG();
cardsequ=select_sen_refunc();
ICProtol=ComBuffer[3+2];
if(ICProtol!=0x01)
{
switch(ComBuffer[4+2]) //check message's head
{
case 0x00:
case 0x04:
case 0x80:
case 0x84:
case 0xA0:
case 0xe0:
key_index=1; break;
default:
key_index=0;
}
if(key_index==0)
{
SendResponse(COS_CLA_ERROR,1,buf);
}
if(ComBuffer[1]==9) // ComBuffer[1]==6
{
len_index=1;
}
else len_index=0;
len_x=ComBuffer[8+2]+2;
len_y=ComBuffer[5+2];
i=0;
Status=cpucard_send(ComBuffer[4+2],(void*)(send_option[cardsequ]));
Status=cpucard_send(ComBuffer[5+2],(void*)(send_option[cardsequ]));
Status=cpucard_send(ComBuffer[6+2],(void*)(send_option[cardsequ]));
Status=cpucard_send(ComBuffer[7+2],(void*)(send_option[cardsequ]));
Status=cpucard_send(ComBuffer[8+2],(void*)(send_option[cardsequ]));
if(len_index==1)
{
Status=cpucard_rec(&sw1,(void*)(rec_option[cardsequ]));
if(sw1!=len_y)
{
Status=cpucard_rec(&sw2,(void*)(rec_option[cardsequ]));
buf[0]=sw1;
buf[1]=sw2;
SendResponse(0x01,3,buf);
return;
}
while(i<len_x)
{
Status=cpucard_rec(CosBuffer+i,(void*)(rec_option[cardsequ]));
if(Status) break;
i++;
}
memcpy(ComBuffer+9,CosBuffer,len_x);
SendResponse(0x01,i+1+17,buf);
return;
}
Status=cpucard_rec(&sw1,(void*)(rec_option[cardsequ]));
for(i=0;i<60;i++)
{
;
}
for(i=9+2;i<(ComBuffer[1]+2);i++) //i=8 test
{
Status=cpucard_send(ComBuffer[i],(void*)(send_option[cardsequ]));
}
Status=cpucard_rec(&sw1,(void*)(rec_option[cardsequ]));
Status=cpucard_rec(&sw2,(void*)(rec_option[cardsequ]));
if(sw1!=0x61)
{
buf[0]=sw1;
buf[1]=sw2;
SendResponse(0x01,3,buf);
return;
}
for(i=0;i<60;i++)
{
;
}
len_y=sw2+2;
i=0;
Status=cpucard_send(0x00, (void*)(send_option[cardsequ]));
Status=cpucard_send(0x0c0,(void*)(send_option[cardsequ]));
Status=cpucard_send(0x00, (void*)(send_option[cardsequ]));
Status=cpucard_send(0x00, (void*)(send_option[cardsequ]));
Status=cpucard_send(sw2, (void*)(send_option[cardsequ]));
Status=cpucard_rec(&sw1,(void*)(rec_option[cardsequ]));
while(i<len_y)
{
Status=cpucard_rec(CosBuffer+i,(void*)(rec_option[cardsequ]));
if(Status) break;
i++;
}
memcpy(ComBuffer+9,CosBuffer,len_y);
SendResponse(0x01,1+len_y+17,buf);
}
else if(ICProtol==0x01)
{
LEN1=ComBuffer[8] ; //T=1 协议 2003.02.21
for(i=0;i<ComBuffer[8]+4;i++)
{
Status=cpucard_send(ComBuffer[i+6],(void*)(send_option[cardsequ]));
}
Status=cpucard_rec(ComBuffer+9,(void*)(rec_option[cardsequ]));//NAD
Status=cpucard_rec(ComBuffer+10,(void*)(rec_option[cardsequ]));//PCB
Status=cpucard_rec(ComBuffer+11,(void*)(rec_option[cardsequ]));//LEN
for(i=0;i<ComBuffer[11]+1;i++)
{
Status=cpucard_rec(ComBuffer+12+i,(void*)(rec_option[cardsequ]));
}
SendResponse(0x01,1+3+i+17,buf);
}
break;
/******************************************************************************/
case 0x71: //RESET ICSLOT OR OPEN ICSLOT/
W_DOG();
cardsequ=select_sen_refunc();
if(ComBuffer[3]==1) slot1_baud=ComBuffer[4]-1;
Reset(ComBuffer[3]-1);
i=0;
while(1)
{
Status=cpucard_rec(ComBuffer+9+i,(void*)(rec_option[cardsequ]));
if(Status) break;
i++;
}
if(i<3) //look as error
{
SendResponse(0x80,1+i+17,buf);
return;
}
SendResponse(0x01,1+i+17,buf);
break;
/*********************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -