📄 pcsc.~cpp
字号:
//---------------------------------------------------------------------------
#pragma hdrstop
#include "PCSC.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#define MAX_RESPONSE_LEN 255;
#define MAX_APDU_CMD_LEN 255;
SCARDCONTEXT hSCardContext =0; //SmartCard Contex
bool CardEStablishContex()
{
if ((0 != hSCardContext) && (false == CardReleaseContext()))
return false;
DWORD resp = SCardEstablishContext(SCARD_SCOPE_USER,NULL,NULL,&hSCardContext);
if(resp != SCARD_S_SUCCESS)
{
hSCardContext = 0;
return false;
}
return true;
}
bool CardReleaseContext()
{
if (0 == hSCardContext)
return true;
DWORD resp = SCardReleaseContext(hSCardContext);
if(resp != SCARD_S_SUCCESS)
{
return false;
}
hSCardContext = 0;
return true;
}
bool CardListReaders(LPTSTR pszReaders, DWORD * pSize)
{
if (0 == hSCardContext)
return false;
LPTSTR plszReaders = NULL;
DWORD cch = SCARD_AUTOALLOCATE;
DWORD dwAP;
DWORD resp = SCardListReaders(hSCardContext, NULL, (LPTSTR)&plszReaders,&cch);
if(resp == SCARD_S_SUCCESS)
{
*pSize = cch;
if (NULL != pszReaders)
memcpy(pszReaders, plszReaders, cch);
}
SCardFreeMemory(hSCardContext, plszReaders);
return true;
}
bool DetectCardPresent(LPCSTR pszReaderName, LPTSTR pszATR, DWORD * pSize)
{
if (NULL == pszATR)
{
*pSize = ATR_MAX_LEN;
return true;
}
SCARD_READERSTATE lReaderState;
lReaderState.szReader = pszReaderName;
lReaderState.pvUserData = NULL;
lReaderState.dwCurrentState = SCARD_STATE_UNAWARE;
lReaderState.dwEventState = SCARD_STATE_CHANGED;
LONG res = SCardGetStatusChange( hSCardContext,
100,
&lReaderState,
1);
if ((SCARD_S_SUCCESS != res) || !( lReaderState.dwEventState & SCARD_STATE_PRESENT))
{
pSize =0;
return false;
}
else
{
memcpy(pszATR, lReaderState.rgbAtr, lReaderState.cbAtr);
*pSize = lReaderState.cbAtr;
return true;
}
}
bool CardConnect(LPCSTR pszReaderName, DWORD * pActiveProtocol, DWORD * phCard)
{
DWORD RefrenceProtocol = SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1 | SCARD_PROTOCOL_RAW;
DWORD resp = SCardConnect(hSCardContext, pszReaderName,
SCARD_SHARE_SHARED, RefrenceProtocol,
phCard, pActiveProtocol);
if (SCARD_S_SUCCESS != resp)
return false;
else
return true;
}
bool CardDisconnect(DWORD hCard)
{
if (0 != hCard)
{
SCardDisconnect(hCard, SCARD_EJECT_CARD);
}
return true;
}
bool ExchangeAPDU(DWORD hCard, DWORD ActiveProtocol, PAPDU_CMD CMD,
char * Response, DWORD * ResponseLen, DWORD * SW_State)
{
SCARD_IO_REQUEST * ScardIoRequest = new SCARD_IO_REQUEST();
ScardIoRequest->dwProtocol = ActiveProtocol;
ScardIoRequest->cbPciLength = sizeof(SCARD_IO_REQUEST);
char * CMDBuff;
DWORD CMDSize = 4;
if (NULL != CMD->APDU_Body)
{
CMDSize += CMD->APDU_Body->Length;
if (NULL != CMD->APDU_Body->Le)
CMDSize += 1;
}
CMDBuff = (char*)malloc(CMDSize);
CMDBuff[0] = CMD->CLS;
CMDBuff[1] = CMD->INS;
CMDBuff[2] = CMD->P1;
CMDBuff[3] = CMD->P2;
if (NULL != CMD->APDU_Body)
{
memcpy(&CMDBuff[4], CMD->APDU_Body->Data, CMD->APDU_Body->Length);
if (NULL != CMD->APDU_Body->Le)
CMDBuff[5 + CMD->APDU_Body->Length] = *(CMD->APDU_Body->Le);
}
DWORD resp = SCardTransmit(hCard, ScardIoRequest , CMDBuff, CMDSize, NULL, Response, ResponseLen);
free(CMDBuff);
if (SCARD_S_SUCCESS == resp)
{
*SW_State = Response[*ResponseLen-2];
*SW_State = *SW_State << 8;
*SW_State = *SW_State | Response[*ResponseLen-1];
return true;
}
else
return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -