Skip to content

Instantly share code, notes, and snippets.

@ArpegiusWhooves
Created April 20, 2017 07:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ArpegiusWhooves/6c90031a19acf560d6f4341d9a4f782d to your computer and use it in GitHub Desktop.
Save ArpegiusWhooves/6c90031a19acf560d6f4341d9a4f782d to your computer and use it in GitHub Desktop.
LONG lRet = 0;
SCARDCONTEXT hContext = 0;
SCARDHANDLE hCard = 0;
DWORD dwAP = 0;
DWORD dwReaders = 0;
BYTE pbSend[MAX_APDU_SIZE];
BYTE pbRecv[MAX_APDU_SIZE];
DWORD cbSend = 0;
DWORD cbRecv = 0;
if ((lRet = SCardEstablishContext(SCARD_SCOPE_USER, 0, 0, &hContext)) != SCARD_S_SUCCESS) {
printf("Error initializing SCard context (0x%08X)\n", lRet);
return;
}
switch (lRet = SCardListReaders(hContext, NULL, NULL, &dwReaders)) {
case SCARD_S_SUCCESS:
break;
default:
printf("Error checking card readers (0x%08X)\n", lRet);
case SCARD_E_NO_READERS_AVAILABLE:
printf("No device found.\n");
return;
}
WCHAR* mszReaders = new WCHAR[dwReaders];
if((lRet = SCardListReaders(hContext, NULL, mszReaders.data(), &dwReaders))!=SCARD_S_SUCCESS) {
printf("Error listing card readers (0x%08X)\n", lRet);
return;
}
for(int i= 0; i< (int)dwReaders; i+= wcslen(mszReaders.data()+i)+1) {
if(mszReaders[i] == '\0') continue;
switch((lRet = SCardConnect(hContext, mszReaders+i, SCARD_SHARE_SHARED, SCARD_PROTOCOL_Tx, &hCard, &dwAP)))
{
case SCARD_W_REMOVED_CARD:
continue;
case SCARD_S_SUCCESS:
break;
default:
printf("Error connecting to the card (0x%08X)\n", lRet);
continue;
}
printf("Reading card from device: %S\n",mmszReaders+i);
// Get Data - Read card serial number
memcpy(pbSend, "\xFF\xCA\x00\x00\x00", 5);
cbSend = 5;
cbRecv = MAX_APDU_SIZE;
if ((lRet = SCardTransmit(hCard, SCARD_PCI_T1, pbSend, cbSend, NULL, pbRecv, &cbRecv)) != SCARD_S_SUCCESS)
continue;
printf("Card UID: ");
for (DWORD i = 0; i < cbRecv - 2; i++)
{
printf("%02X", pbRecv[i]);
if (i == cbRecv - 3) printf("\n");
}
SCardDisconnect(hCard, SCARD_LEAVE_CARD);
}
SCardReleaseContext(hContext);
delete[] mszReaders;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment