📄 pcscpage.cpp
字号:
// PcScPage.cpp : implementation file
//
#include "stdafx.h"
#include "scrtest.h"
#include "PcScPage.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPcScPage property page
IMPLEMENT_DYNCREATE(CPcScPage, CPropertyPage)
CPcScPage::CPcScPage() : CPropertyPage(CPcScPage::IDD)
{
CRuntimeClass *pClass = RUNTIME_CLASS(CPcScTest);
CPcScTest::m_CmdIdToRuntimeClass[_T("APDU")] = pClass;
//{{AFX_DATA_INIT(CPcScPage)
m_testFile = _T("");
//}}AFX_DATA_INIT
m_psp.dwFlags &= ~PSP_HASHELP; // Lose the Help button
}
CPcScPage::~CPcScPage()
{
}
void CPcScPage::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPcScPage)
DDX_Control(pDX, IDC_COMBO_CMD, m_CmdCombo);
DDX_Control(pDX, IDC_COMBO_READER, m_ReaderCombo);
DDX_Control(pDX, IDC_EDIT_CMD, m_CmdHexEdit);
DDX_Control(pDX, IDC_EDIT_RESPONSE, m_ResHexEdit);
DDX_Text(pDX, IDC_EDIT_FILE, m_testFile);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPcScPage, CPropertyPage)
//{{AFX_MSG_MAP(CPcScPage)
ON_BN_CLICKED(IDC_BUTTON_OPEN, OnButtonFileOpen)
ON_CBN_SELCHANGE(IDC_COMBO_READER, OnSelchangeComboReader)
ON_CBN_SELCHANGE(IDC_COMBO_CMD, OnSelchangeComboCmd)
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_BUTTON_EXECUTE, OnButtonExecute)
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
ON_BN_CLICKED(IDC_BUTTON5, OnButton5)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPcScPage message handlers
BOOL CPcScPage::OnSetActive()
{
// TODO: Add your specialized code here and/or call the base class
if(m_PcScCtrl.ListReaders())
{
if(m_PcScCtrl.SetCurReader(0) == SCARD_S_SUCCESS)
SetDlgItemText(IDC_STATIC_CARD,_T("Card Present."));
else
SetDlgItemText(IDC_STATIC_CARD,_T("Card Not Present."));
UpdateReaderCombo();
}
return CPropertyPage::OnSetActive();
}
void CPcScPage::UpdateCmdCombo()
{
for (int i=0; i < m_CmdArray.GetSize(); i++)
m_CmdCombo.AddString(m_CmdArray[i]->GetCmdName());
m_CmdCombo.SetCurSel(0);
// Find the longest string in the combo box.
CString str;
CSize sz;
int dx=0;
CDC* pDC = m_CmdCombo.GetDC();
for (i=0;i < m_CmdCombo.GetCount();i++)
{
m_CmdCombo.GetLBText( i, str );
sz = pDC->GetTextExtent(str);
if (sz.cx > dx)
dx = sz.cx;
}
m_CmdCombo.ReleaseDC(pDC);
// Adjust the width for the vertical scroll bar and the left and right border.
dx += ::GetSystemMetrics(SM_CXVSCROLL) + 2*::GetSystemMetrics(SM_CXEDGE);
// Set the width of the list box so that every item is completely visible.
m_CmdCombo.SetDroppedWidth(dx);
OnSelchangeComboCmd();
}
void CPcScPage::UpdateReaderCombo()
{
int oldSel = m_ReaderCombo.GetCurSel();
if(oldSel == CB_ERR )
oldSel = 0;
m_ReaderCombo.ResetContent();
for (int i=0; i < m_PcScCtrl.m_asReaderNames.GetSize(); i++)
m_ReaderCombo.AddString(m_PcScCtrl.m_asReaderNames[i]);
//m_ReaderCombo.SetCurSel(m_PcScCtrl.GetCurReader());
m_ReaderCombo.SetCurSel(oldSel);
OnSelchangeComboReader();
// Find the longest string in the combo box.
CString str;
CSize sz;
int dx=0;
CDC* pDC = m_ReaderCombo.GetDC();
for (i=0;i < m_ReaderCombo.GetCount();i++)
{
m_ReaderCombo.GetLBText( i, str );
sz = pDC->GetTextExtent(str);
if (sz.cx > dx)
dx = sz.cx;
}
m_ReaderCombo.ReleaseDC(pDC);
// Adjust the width for the vertical scroll bar and the left and right border.
dx += ::GetSystemMetrics(SM_CXVSCROLL) + 2*::GetSystemMetrics(SM_CXEDGE);
// Set the width of the list box so that every item is completely visible.
m_ReaderCombo.SetDroppedWidth(dx);
}
void CPcScPage::OnButtonFileOpen()
{
// TODO: Add your control notification handler code here
USES_CONVERSION;
CString strExt((LPCSTR)IDS_DEFAULTXMLEXTENSION);
CString strTitle((LPCSTR)IDS_OPENDIALOGTITLE);
CString strFilter((LPCSTR)IDS_DEFAULTXMLFILTERS);
CString strRootElem((LPCSTR)IDS_PCSC_ROOT);
CString strCmdTag((LPCSTR)IDS_CMD_TAG);
UpdateData();
CFileDialog fileDialog(TRUE, strExt, NULL, OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY,
strFilter, this);
fileDialog.m_ofn.lpstrTitle = strTitle;
int ret = fileDialog.DoModal();
if (IDOK == ret)
{
CString strPathName = fileDialog.GetPathName();
if (!strPathName.IsEmpty())
{
m_testFile = strPathName;
UpdateData(FALSE);
}
if (!m_testFile.IsEmpty())
{
IXMLDOMDocumentPtr pDOMDoc = Helper::loadXML(m_testFile);
if(pDOMDoc)
{
ReleaseCurrentDocument();
m_pDOMDoc = pDOMDoc;
IXMLDOMElementPtr rootElementPtr = m_pDOMDoc->GetdocumentElement();
if (rootElementPtr == NULL)
return;
CString strText = W2T(rootElementPtr->GetnodeName());
TRACE(_T("%s\n"),strText);
if(strRootElem.CompareNoCase(strText))
{
CString strFileNotMatch((LPCSTR)IDS_FILE_NOTMATCH);
AfxMessageBox(strFileNotMatch);
return;
}
IXMLDOMNodeListPtr NodeListPtr;
NodeListPtr = rootElementPtr->getElementsByTagName((TCHAR *)strCmdTag.GetBuffer(0));
ICmdTest::CreateObjects(NodeListPtr,m_CmdArray,CPcScTest::m_CmdIdToRuntimeClass);
UpdateCmdCombo();
}
}
}
}
void CPcScPage::ReleaseCurrentDocument()
{
if (m_pDOMDoc)
{
m_CmdCombo.ResetContent();
for (int i=0; i < m_CmdArray.GetSize(); i++)
delete m_CmdArray[i];
m_CmdArray.RemoveAll();
m_pDOMDoc = NULL;
}
}
void CPcScPage::OnSelchangeComboReader()
{
// TODO: Add your control notification handler code here
int nCurSel = m_ReaderCombo.GetCurSel();
m_PcScCtrl.SetCurReader(nCurSel);
}
void CPcScPage::OnSelchangeComboCmd()
{
// TODO: Add your control notification handler code here
int nCurSel = m_CmdCombo.GetCurSel();
TRACE("nCurSel=%d\n",nCurSel);
SetDlgItemText(IDC_PCSC_DESC,m_CmdArray[nCurSel]->GetDescription());
int len;
LPBYTE pData = m_CmdArray[nCurSel]->GetSendData(len);
m_CmdHexEdit.SetBPR(4);
m_CmdHexEdit.SetDataAddr(pData,len);
}
void CPcScPage::OnDestroy()
{
ReleaseCurrentDocument();
CPropertyPage::OnDestroy();
// TODO: Add your message handler code here
}
void CPcScPage::OnButtonExecute()
{
// TODO: Add your control notification handler code here
SetCursor (AfxGetApp ()->LoadStandardCursor (IDC_WAIT));
int nCurSel = m_CmdCombo.GetCurSel();
m_CmdArray[nCurSel]->Execute(this);
SetCursor (AfxGetApp ()->LoadStandardCursor (IDC_ARROW));
}
void CPcScPage::OnButton1()
{
// TODO: Add your control notification handler code here
UCHAR Buffer[256];
DWORD retByte;
m_PcScCtrl.SCardControl(IOCTL_SMARTCARD_SET_PROTOCOL,
Buffer,
256,
Buffer,
256,
&retByte);
}
void CPcScPage::OnButton2()
{
// TODO: Add your control notification handler code here
TCHAR szReader[200];
DWORD cch = 200;
BYTE bAttr[32];
DWORD cByte = 32;
DWORD dwState, dwProtocol;
LONG lReturn;
// Determine the status.
// hCardHandle was set by an earlier call to SCardConnect.
lReturn = m_PcScCtrl.SCardStatus(
szReader,
&cch,
&dwState,
&dwProtocol,
(LPBYTE)&bAttr,
&cByte);
if ( SCARD_S_SUCCESS != lReturn )
{
TRACE("Failed SCardStatus\n");
}
// Examine retrieved status elements.
// Here, we'll look at the reader name and card state.
TRACE("%S\n", szReader );
switch ( dwState )
{
case SCARD_ABSENT:
TRACE("Card absent.\n");
break;
case SCARD_PRESENT:
TRACE("Card present.\n");
break;
case SCARD_SWALLOWED:
TRACE("Card swallowed.\n");
break;
case SCARD_POWERED:
TRACE("Card has power.\n");
break;
case SCARD_NEGOTIABLE:
TRACE("Card reset and waiting PTS negotiation.\n");
break;
case SCARD_SPECIFIC:
TRACE("Card has specific communication protocols set.\n");
break;
default:
TRACE("Unknown or unexpected card state.\n");
break;
}
TRACE("ATR:\n");
for(DWORD i=0; i<cByte; i++)
TRACE("%02x ",bAttr[i]);
}
void CPcScPage::OnButton3()
{
// TODO: Add your control notification handler code here
BYTE bAttr[512];
DWORD cByte = 512;//SCARD_AUTOALLOCATE;
DWORD i;
LONG lReturn;
// Retrieve an attribute.
// hCardHandle was set by a previous call to SCardConnect.
lReturn = m_PcScCtrl.SCardGetAttrib(
SCARD_ATTR_CURRENT_CLK,
(LPBYTE)bAttr,
&cByte);
if ( SCARD_S_SUCCESS != lReturn )
{
if ( ERROR_NOT_SUPPORTED == lReturn )
TRACE("Value not supported\n");
else
{
// Some other error occurred.
TRACE("Failed SCardGetAttrib - %x\n", lReturn);
}
}
else
{
// Output the bytes.
for (i = 0; i < cByte; i++)
TRACE("%c", bAttr[i]);
TRACE("\n");
for (i = 0; i < cByte; i++)
TRACE("%02x ", bAttr[i]);
TRACE("\n");
}
}
void CPcScPage::OnButton4()
{
// TODO: Add your control notification handler code here
UCHAR IoCode = PC_to_RDR_ResetParameters;
DWORD ret;
m_PcScCtrl.SCardControl(IOCTL_USCR_CCID,
&IoCode,1,NULL,0,&ret);
}
void CPcScPage::OnButton5()
{
// TODO: Add your control notification handler code here
UCHAR Buf[128];
DWORD ret;
Buf[0] = PC_to_RDR_GetParameters;
m_PcScCtrl.SCardControl(IOCTL_USCR_CCID,
Buf,128,Buf,128,&ret);
for(DWORD i=0; i<ret; i++)
{
TRACE("%02x ",Buf[i]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -