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

📄 pcscpage.cpp

📁 usblsccid-0.9.2: ED1x Smart Card Reader Driver
💻 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 + -