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

📄 pcsc.~cpp

📁 Microsoft PCSC Example
💻 ~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 + -