📄 test.cpp
字号:
if (pmszReaders)
{
dwReturn = SCardListReaders(hSC, NULL, pmszReaders, &dwLength);
//at least two first readers in the system will be shown
VASSERT(dwReturn == SCARD_S_SUCCESS);
switch (dwReturn)
{
case SCARD_E_NO_READERS_AVAILABLE:
{
printf("Reader is not in groups.\n");
break;
}
case SCARD_S_SUCCESS:
{
printf("List of inroduced readers :\n");
pReader = pmszReaders;
VASSERT(pReader);
while ('\0' != *pReader)
{ // Display the value.
if (strstr(pReader,chWork_Reader) != NULL)
{
bOurReaderIsInstalled = true;
}
printf("\tReader: %s\n", pReader);
// Advance to the next value.
pReader = pReader + strlen(pReader) + 1;
VASSERT(pReader);
}
break;
}
default:
printf("Failed SCardListReaders, error %#X\n",dwReturn);
break;
}
//let's check if our reader is in the list of installed readers
if (bOurReaderIsInstalled == true)
{
printf("Reader %s was found\n",chWork_Reader);
pmszCards = NULL;
// Retrieve the list of cards.
dwLength = 0;
if (((dwReturn = SCardListCards(NULL, NULL, NULL, NULL,
(LPTSTR)pmszCards, &dwLength)) == SCARD_S_SUCCESS) &&
(dwLength > 0))
{
if ((pmszCards =(LPTSTR)malloc(dwLength+2)) != NULL)
{
if ((dwReturn = SCardListCards(NULL, NULL, NULL, NULL,
(LPTSTR)pmszCards, &dwLength)) == SCARD_S_SUCCESS)
{
VASSERT(pmszCards != NULL);
VASSERT(dwLength != 0);
pCard = pmszCards;
printf("List of inroduced Smartcards :\n");
while ('\0' != *pCard)
{
// Display the value.
printf("\t%s\n", pCard);
pCard = pCard + strlen(pCard) + 1;
VASSERT(pCard != NULL);
}
// Connect to the reader. hSC is a SCARDCONTEXT, previously set by
// a call to SCardEstablishContext.
// I will point our pseudo reader DIRECTLY
// Our card support T0 ISO 7816 protocol ONLY
VASSERT(hSC != NULL);
if ((dwReturn = SCardConnect(hSC, (LPCSTR)chWork_Reader,
SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0, &hCardHandle,
&dwAP)) == SCARD_S_SUCCESS)
{
VASSERT(hCardHandle != NULL);
if (dwAP == SCARD_PROTOCOL_T0)
{ // Let's get SC attributes
VAS_VERIFY(GetAttr(SCARD_ATTR_VENDOR_NAME, "SCARD_ATTR_VENDOR_NAME") == SCARD_S_SUCCESS);
VAS_VERIFY(GetAttr(SCARD_ATTR_DEVICE_FRIENDLY_NAME, "SCARD_ATTR_DEVICE_FRIENDLY_NAME") == SCARD_S_SUCCESS);
VAS_VERIFY(GetAttr(SCARD_ATTR_ICC_PRESENCE, "SCARD_ATTR_ICC_PRESENCE", false) == SCARD_S_SUCCESS);
VAS_VERIFY(GetAttr(SCARD_ATTR_ICC_TYPE_PER_ATR, "SCARD_ATTR_ICC_TYPE_PER_ATR", false) == SCARD_S_SUCCESS);
VAS_VERIFY(GetAttr(SCARD_ATTR_MAX_CLK, "SCARD_ATTR_MAX_CLK", false) == SCARD_S_SUCCESS);
ZeroMemory(bRecv, sizeof(bRecv));
// Let's prepare header accordingly to ISO 7816 for SELECT operation
_CmdBytes.bCla = 0xA0;
_CmdBytes.bIns = 0xA4;
_CmdBytes.bP1 = 0;
_CmdBytes.bP2 = 0;
_CmdBytes.bP3 = 0;
dwSend = sizeof(_CmdBytes) - 1;
dwRecv = 2;
if ((dwReturn = SCardTransmit(hCardHandle, SCARD_PCI_T0, (PUCHAR)&_CmdBytes, dwSend,
NULL, bRecv, &dwRecv)) == SCARD_S_SUCCESS)
{
printf("Status of operation SELECT : %#X%02X\n",bRecv[0],bRecv[1]);
// Let's prepare header accordingly to ISO 7816 for WRITE_BINARY operation
ZeroMemory(bRecv, sizeof(bRecv));
ZeroMemory(bSend, sizeof(bSend));
_CmdBytes.bCla = 0x00;
_CmdBytes.bIns = 0xD0;
_CmdBytes.bP1 = 0;
_CmdBytes.bP2 = 0;
_CmdBytes.bP3 = LOBYTE(LOWORD(strlen(pmszTest_Data)));
dwRecv = 2;
dwSend = sizeof(_CmdBytes) + _CmdBytes.bP3;
// Let's prepare output array
VAS_VERIFY(memcpy(bSend, &_CmdBytes, sizeof(_CmdBytes)) != NULL);
VAS_VERIFY(memcpy((PCHAR)&bSend[5], pmszTest_Data, _CmdBytes.bP3));
if ((dwReturn = SCardTransmit(hCardHandle, SCARD_PCI_T0, (PUCHAR)bSend,
dwSend, NULL, bRecv, &dwRecv)) == SCARD_S_SUCCESS)
{
printf("Status of operation WRITE BINARY : %#X%02X\n",bRecv[0],bRecv[1]);
// Let's prepare header accordingly to ISO 7816 for READ_BINARY operation
ZeroMemory(bRecv, sizeof(bRecv));
_CmdBytes.bCla = 0x00;
_CmdBytes.bIns = 0xB0;
_CmdBytes.bP1 = 0;
_CmdBytes.bP2 = 0;
_CmdBytes.bP3 = LOBYTE(LOWORD(strlen(pmszTest_Data)));
dwRecv = _CmdBytes.bP3 + 2;
dwSend = sizeof(_CmdBytes);
if ((dwReturn = SCardTransmit(hCardHandle, SCARD_PCI_T0, (PUCHAR)&_CmdBytes, dwSend,
NULL, bRecv, &dwRecv)) == SCARD_S_SUCCESS)
{
printf("Status of operation READ BINARY : %#X%02X\n",bRecv[dwRecv - 2],bRecv[dwRecv - 1]);
printf("\tReturned data of operation READ BINARY as a string: %s\n", bRecv);
if (dwRecv < 2)
printf(" UKNOWN !!!\n");
else
{
printf("\tReturned data of operation READ BINARY as a HEX: ");
for (dwTemp = 0; dwTemp < dwRecv; dwTemp++)
{
printf("%02X", bRecv[dwTemp]);
}
printf("\n");
}
}
else
printf("Failed SCardTransmit, command : READ_BINARY, error %#X\n",dwReturn);
}
else
printf("Failed SCardTransmit, command : WRITE_BINARY, error %#X\n",dwReturn);
}
else
printf("Failed SCardTransmit, command : SELECT, error %#X\n",dwReturn);
}
else
printf("Failed SCardConnect, unsupported protocol,error %#X\n",dwReturn);
SCardDisconnect(hSC, SCARD_LEAVE_CARD);
}
else
{
if (dwReturn == SCARD_W_REMOVED_CARD)
printf("Failed SCardConnect, virtual smartcard was removed, error %#X\n",dwReturn);
else
printf("Failed SCardConnect, error %#X\n",dwReturn);
}
}
else
printf("Failed SCardListCards, error %#X\n",dwReturn);
if(pmszCards) free(pmszCards);
}
else
VASSERT(pmszCards != NULL);
}
else
printf("Failed SCardListCards, error %#X\n",dwReturn);
}
else
printf("Reader %s is not installed properly\n",chWork_Reader);
if (pmszReaders) free(pmszReaders);
}
else
VASSERT(pmszReaders != NULL);
}
else
printf("Failed SCardListReaders, error %#X\n",dwReturn);
}
else
printf("Failed SCardListReaderGroups, error %#X\n",dwReturn);
if (hSC != NULL) VAS_VERIFY(SCardReleaseContext(hSC) == SCARD_S_SUCCESS);
}
else
printf("Failed SCardEstablishContext, error %#X\n",dwReturn);
#ifdef _CRT_DEBUG
_CrtMemCheckpoint( &s2 );
if ( _CrtMemDifference( &s3, &s1, &s2) )
_CrtMemDumpStatistics( &s3 );
//_CrtMemDumpAllObjectsSince( NULL );
_CrtDumpMemoryLeaks( );
#endif
}
#else
#error Modification required for this type of OS
#endif
//----------------------------------------------------------------------------------------------
#endif // TEST_SC_CPP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -