📄 main.cpp
字号:
//The following example shows locating smart cards.
//THIS SAMPLE CODE IS COPY FORM PLATFROM SDK -- SCardLocateCards SESSION
// MODIFY BY ANDY HUA.
//History: 2005/04/18 add the G&D STARCOS SPK 2.3 MOICA card testing command.
#include <stdio.h>
#include <conio.h>
#include <winscard.h>
#include <tchar.h>
#include "SCcommand.h"
HRESULT __cdecl main()
{
HRESULT hr = S_OK;
LPTSTR szReaders, szRdr;
DWORD cchReaders = SCARD_AUTOALLOCATE;
DWORD dwI, dwRdrCount;
SCARD_READERSTATE rgscState[MAXIMUM_SMARTCARD_READERS];
TCHAR szCard[MAX_PATH];
SCARDCONTEXT hSC;
SCARDHANDLE hCardHandle; //Handle pointer for Smart card library
DWORD dwActiveProtocol; //connect to smart card used active protocol
LONG lReturn;
// Establish the card to watch for.
// Multiple cards can be looked for, but
// this sample looks for only one card.
//======CHANGE YOUR INSERT CARD FRIENDLY NAME IN REGISTRY!!========
//lstrcpy( szCard, TEXT("GemSAFE"));
//lstrcpy( szCard, TEXT("Schlumberger Cyberflex Palmera 32K"));
lstrcpy( szCard, TEXT("STARCOS SPK 2.3"));
//======CHANGE YOUR INSERT CARD FRIENDLY NAME IN REGISTRY!!========
szCard[lstrlen(szCard) + 1] = 0; // Double trailing zero.
// Establish a context.
lReturn = SCardEstablishContext(SCARD_SCOPE_USER,
NULL,
NULL,
&hSC );
if ( SCARD_S_SUCCESS != lReturn )
{
printf("Failed SCardEstablishContext\n");
exit(1);
}
// Determine which readers are available.
lReturn = SCardListReaders(hSC,
NULL,
(LPTSTR)&szReaders,
&cchReaders );
if ( SCARD_S_SUCCESS != lReturn )
{
printf("Failed SCardListReaders\n");
exit(1);
}
// Place the readers into the state array.
szRdr = szReaders;
for ( dwI = 0; dwI < MAXIMUM_SMARTCARD_READERS; dwI++ )
{
if ( 0 == *szRdr )
break;
rgscState[dwI].szReader = szRdr;
rgscState[dwI].dwCurrentState = SCARD_STATE_UNAWARE;
szRdr += lstrlen(szRdr) + 1;
}
dwRdrCount = dwI;
// If any readers are available, proceed.
if ( 0 != dwRdrCount )
{
for (;;)
{
//wait until there is a change
_tprintf( TEXT("Waiting for Card : '%s'.\n"),
szCard );
// Card not found yet; wait until there is a change.
lReturn = SCardGetStatusChange(hSC,
INFINITE, // infinite wait
rgscState,
dwRdrCount );
if ( SCARD_S_SUCCESS != lReturn )
{
printf("Failed SCardGetStatusChange\n");
exit(1);
}
// Look for the card.
lReturn = SCardLocateCards(hSC,
szCard,
rgscState,
dwRdrCount );
if ( SCARD_S_SUCCESS != lReturn )
{
printf("Failed SCardLocateCards\n");
//exit(1);
}
// Look through the array of readers.
for ( dwI=0; dwI < dwRdrCount; dwI++)
{
if ( 0 != ( SCARD_STATE_ATRMATCH &
rgscState[dwI].dwEventState))
{
_tprintf( TEXT("Card '%s' found in reader '%s'.\n"),
szCard,
rgscState[dwI].szReader );
SCardFreeMemory( hSC,
szReaders );
goto SEND_SCCOMMAND;
//return 0; // Context will be release automatically.
}
// Update the state.
rgscState[dwI].dwCurrentState = rgscState[dwI].dwEventState;
}
} // for (;;)
}
else
printf("No readers available\n");
//==================================================================================
//append the Smart Card APDU command used SCardTransmit API
//used the MOICA PKI card API, see CardApi.cpp
SEND_SCCOMMAND:
// Connect to SmartCard
lReturn = SCardConnect ( hSC,
_T("O2 O2Micro CCID SC Reader 0"),
SCARD_SHARE_SHARED,
SCARD_PROTOCOL_T1|SCARD_PROTOCOL_T0,
&hCardHandle,
&dwActiveProtocol
);
if ( lReturn != SCARD_S_SUCCESS )
{
printf("Failed SCardConnect!\n");
exit(1);
}
//read MOICA card SN
BYTE MOICAserialNumber[16];
int MOICAserialNumberLen;
lReturn = Getcardserialnumber( hCardHandle,
MOICAserialNumber,
&MOICAserialNumberLen);
if ( lReturn != SCARD_S_SUCCESS )
{
printf("Failed Get MOICA card serialnumber!\n");
exit(1);
}
_tprintf( TEXT("Your MOICA Card SN : '%s'\n"), MOICAserialNumber);
printf(" --> Press any key to continue\n");
getch();
//read MOICA card signature
BYTE certificate[1500];
lReturn = Readcertificate( hCardHandle,
certificate);
if ( lReturn != SCARD_S_SUCCESS )
{
printf("Failed Read MOICA card certificate!\n");
exit(1);
}
printf(" --> End Read your MOICA card certificate EF, totally 1500 bytes.\n");
//==================================================================================
// Release the context.
lReturn = SCardReleaseContext(hSC);
if ( SCARD_S_SUCCESS != lReturn )
{
printf("Failed SCardReleaseContext\n");
exit(1);
}
SCardFreeMemory( hSC,
szReaders );
return hr;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -