📄 smartcarddlg.cpp
字号:
{
DispatchCommand(COMMAND_SUBMIT_CODE);
}
void CSmartCardDlg::OnButtonSelectFile()
{
DispatchCommand(COMMAND_SELECT_FILE);
}
void CSmartCardDlg::OnButtonReadFile()
{
DispatchCommand(COMMAND_READ_FILE);
}
void CSmartCardDlg::OnButtonSetup()
{
DispatchCommand(COMMAND_SETUP);
}
void CSmartCardDlg::OnButtonProgram()
{
DispatchCommand(COMMAND_PROGRAM);
}
bool CSmartCardDlg::DoATR()
{
unsigned char buf[64];
DWORD dwLength;
dwLength = sizeof buf;
return m_acos1.GetATR(buf, dwLength);
}
void CSmartCardDlg::DoStartSession()
{
unsigned char buf[128];
DWORD dwLength;
if ( m_acos1.StartSession(buf, dwLength) )
{
CString ccc;
CString sss = _T("key = ");;
for ( DWORD ii = 0; ii < dwLength; ii++ )
{
ccc.Format(_T("%02X "), buf[ii]);
sss += ccc;
}
sss += _T("\r\n");
AppendText(sss);
}
}
bool CSmartCardDlg::DoSubmitCode()
{
unsigned char CODE[] = {'A', 'C', 'O', 'S', 'T', 'E', 'S', 'T'};
return m_acos1.SubmitIC(CODE);
}
bool CSmartCardDlg::DoSelectFile()
{
unsigned char FILE_DATA[] = {0xFF, 0x03};
return m_acos1.SelectFile(FILE_DATA);
}
void CSmartCardDlg::DoReadFile()
{
BOOL bEnableEncryption = m_checkEncrypt.GetCheck();
//if ( !DoATR() )
//{
// return;
//}
if ( !DoSubmitCode() )
{
return;
}
if ( !DoSelectFile() )
{
return;
}
unsigned char buf[128];
DWORD dwLength;
if ( m_acos1.ReadRecord(6, 8, buf, dwLength) )
{
if ( bEnableEncryption )
{
for ( int ii = 0; ii < 8; ii++ )
{
buf[ii] = SDES::Decrypt(buf[ii]);
}
}
CString response;
CString ccc;
serialNumStruct serialNum;
::CopyMemory(&serialNum, buf, 8);
m_first = serialNum.first;
m_last = serialNum.last;
m_BtnProgram.EnableWindow(m_first <= m_last);
CString sss;
sss.Format(_T("%lu"), serialNum.first);
m_EditCurrent.SetWindowText(sss);
sss.Format(_T("%lu"), serialNum.last - serialNum.first + 1);
m_EditRemaining.SetWindowText(sss);
if ( m_checkVerbose.GetCheck() )
{
response.Format(_T("RECORD %2d: "), 6);
for ( DWORD ii = 0; ii < dwLength; ii++ )
{
ccc.Format(_T("%02X "), buf[ii]);
response += ccc;
}
AppendText(response);
}
}
}
void CSmartCardDlg::DoSetup()
{
CDlgSetup dlg;
int nResponse = dlg.DoModal();
if ( nResponse == IDOK )
{
ClearOutput();
serialNumStruct serialNum;
serialNum.first = dlg.m_uStartNum;
serialNum.last = dlg.m_uStartNum + dlg.m_uCount - 1;
m_BtnProgram.EnableWindow(serialNum.first <= serialNum.last);
CString sss;
if ( !m_acos1.OpenPort() )
{
CString errMsg = m_acos1.GetLastErrorMsg();
sss.Format(_T("Error opening serial port.\n\n%s"), (LPCTSTR)errMsg);
AfxMessageBox(sss, MB_OK | MB_ICONERROR );
return;
}
Sleep(200);
unsigned char CODE[] = {'A', 'C', 'O', 'S', 'T', 'E', 'S', 'T'};
if ( m_acos1.SubmitIC(CODE) )
{
unsigned char FILE_DATA[] = {0xFF, 0x03};
if ( m_acos1.SelectFile(FILE_DATA) )
{
if ( m_acos1.WriteRecord(6, (unsigned char *)&serialNum, sizeof serialNum) )
{
AppendText(_T("Success "));
DoReadFile();
}
}
}
}
}
void CSmartCardDlg::DoProgram()
{
DoReadFile();
if ( m_first <= m_last )
{
m_first++;
serialNumStruct serialNum;
serialNum.first = m_first;
unsigned char CODE[] = {'A', 'C', 'O', 'S', 'T', 'E', 'S', 'T'};
if ( m_acos1.SubmitIC(CODE) )
{
unsigned char FILE_DATA[] = {0xFF, 0x03};
if ( m_acos1.SelectFile(FILE_DATA) )
{
if ( m_acos1.WriteRecord(6, (unsigned char *)&serialNum, 4) )
{
AppendText(_T("Success "));
DoReadFile();
}
}
}
}
else
{
AfxMessageBox(_T("Serial numbers exhausted!"), MB_OK | MB_ICONWARNING );
}
}
void CSmartCardDlg::OnSelchangeComboStopBits()
{
m_acos1.SetStopBits(m_comboStopBits.GetCurSel() + 1);
}
void CSmartCardDlg::OnButtonDumpDcb()
{
if ( !m_acos1.OpenPort() )
{
CString sss;
CString errMsg = m_acos1.GetLastErrorMsg();
sss.Format(_T("Error opening serial port.\n\n%s"), (LPCTSTR)errMsg);
AfxMessageBox(sss, MB_OK | MB_ICONERROR );
return;
}
ClearOutput();
m_acos1.DumpDCB();
m_acos1.ClosePort();
}
void CSmartCardDlg::OnSelchangeComboBaud()
{
CString sss;
m_comboBaud.GetLBText(m_comboBaud.GetCurSel(), sss);
_stscanf(sss, "%d", &m_iBaud);
m_acos1.SetBaud(m_iBaud);
}
void CSmartCardDlg::OnSelchangeComboComPort()
{
CString sss;
if ( m_comboPort.GetCount() > 0 )
{
m_comboPort.GetLBText(m_comboPort.GetCurSel(), sss);
_stscanf(sss, "COM%d", &m_iPort);
m_acos1.SetPort(m_iPort);
}
}
void CSmartCardDlg::OnDestroy()
{
AfxGetApp()->WriteProfileInt(s_szSectionSettings, s_szPort, m_iPort);
AfxGetApp()->WriteProfileInt(s_szSectionSettings, s_szBaud, m_iBaud);
AfxGetApp()->WriteProfileInt(s_szSectionSettings, s_szClearOutput, m_checkClear.GetCheck());
AfxGetApp()->WriteProfileInt(s_szSectionSettings, s_szEncrypt, m_checkEncrypt.GetCheck());
AfxGetApp()->WriteProfileInt(s_szSectionSettings, s_szVerbose, m_checkVerbose.GetCheck());
CDialog::OnDestroy();
}
void CSmartCardDlg::AppendText(LPCTSTR Text)
{
CString msg = Text;
msg += _T("\r\n");
int Length = m_EditOut.GetWindowTextLength();
m_EditOut.SetSel(Length, Length);
m_EditOut.ReplaceSel(msg);
m_EditOut.LineScroll( m_EditOut.GetLineCount() );
}
void CSmartCardDlg::ClearOutput()
{
if ( m_checkClear.GetCheck() )
{
m_EditOut.SetWindowText(_T(""));
}
}
void CSmartCardDlg::DispatchCommand(CommandEnum command)
{
CString sss;
if ( command != COMMAND_SETUP )
{
ClearOutput();
if ( !m_acos1.OpenPort() )
{
CString errMsg = m_acos1.GetLastErrorMsg();
sss.Format(_T("Error opening serial port.\n\n%s"), (LPCTSTR)errMsg);
AfxMessageBox(sss, MB_OK | MB_ICONERROR );
return;
}
}
switch ( command )
{
case COMMAND_ATR:
{
DoATR();
}
break;
case COMMAND_START_SESSION:
{
DoStartSession();
}
break;
case COMMAND_SUBMIT_CODE:
{
DoSubmitCode();
}
break;
case COMMAND_SELECT_FILE:
{
DoSelectFile();
}
break;
case COMMAND_READ_FILE:
{
DoReadFile();
}
break;
case COMMAND_SETUP:
{
DoSetup();
}
break;
case COMMAND_PROGRAM:
{
DoProgram();
}
break;
default:
break;
}
m_acos1.ClosePort();
}
void CSmartCardDlg::OnCheckEncrypt()
{
m_acos1.EnableEncryption(m_checkEncrypt.GetCheck() != 0);
}
void CSmartCardDlg::OnCheckVerbose()
{
m_acos1.SetVerbose(m_checkVerbose.GetCheck() != 0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -