PureBasic
PureBasic
PC/SC Find Inserted Smart Cards
See more SCard Examples
Get detailed information about each reader including whether or not a smart card is currently inserted in the reader. (Also includes USB tokens.)Note: This functionality was introduced in Chilkat v9.5.0.87.
Chilkat PureBasic Downloads
IncludeFile "CkSCard.pb"
IncludeFile "CkJsonObject.pb"
Procedure ChilkatExample()
success.i = 0
; This example requires the Chilkat API to have been previously unlocked.
; See Global Unlock Sample for sample code.
scard.i = CkSCard::ckCreate()
If scard.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
; First establish a context to the PC/SC Resource Manager
success = CkSCard::ckEstablishContext(scard,"user")
If success = 0
Debug CkSCard::ckLastErrorText(scard)
CkSCard::ckDispose(scard)
ProcedureReturn
EndIf
; Get JSON containing information about the smartcards currently inserted into readers.
; This also includes information about USB security tokens.
json.i = CkJsonObject::ckCreate()
If json.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkSCard::ckFindSmartcards(scard,json)
If success = 0
Debug CkSCard::ckLastErrorText(scard)
CkSCard::ckDispose(scard)
CkJsonObject::ckDispose(json)
ProcedureReturn
EndIf
CkJsonObject::setCkEmitCompact(json, 0)
Debug CkJsonObject::ckEmit(json)
; Here is sample output:
; See below for sample code to parse the JSON.
; You can see which readers have a card inserted by the "state".
; If the state contains "present", then a card is inserted into the reader.
; (USB tokens will typically always have a state containing "present")
; Also, the ATR of the card inserted into the reader is indicated by "atr".
; {
; "reader": [
; {
; "name": "Alcor Micro USB Smart Card Reader 0",
; "state": "present,inuse",
; "vendorName": "Alcor Micro",
; "systemName": "Alcor Micro USB Smart Card Reader 0",
; "card": {
; "atr": "3B7F96000080318065B0855956FB120FFE829000",
; "windows": {
; "miniDriver": "AxaltoCM.dll",
; "cryptoProvider": "Microsoft Base Smart Card Crypto Provider",
; "keyStorageProvider": "Microsoft Smart Card Key Storage Provider"
; }
; }
; },
; {
; "name": "FS USB Token 0",
; "state": "present,inuse",
; "vendorName": "FS",
; "serialNumber": "3F",
; "systemName": "FS USB Token 0",
; "card": {
; "atr": "3B9F958131FE9F006646530534002571DF000000000012",
; "windows": {
; "miniDriver": "eps2003csp11",
; "cryptoProvider": "Microsoft Base Smart Card Crypto Provider",
; "keyStorageProvider": "Microsoft Smart Card Key Storage Provider"
; }
; }
; },
; {
; "name": "FT Java Token 0",
; "state": "present",
; "vendorName": "FT",
; "serialNumber": "3F",
; "systemName": "FT Java Token 0",
; "card": {
; "atr": "3BFC180000813180459067464A00642D70C172FEE0FE",
; "windows": {
; "miniDriver": "tagliov70px.dll",
; "cryptoProvider": "Microsoft Base Smart Card Crypto Provider",
; "keyStorageProvider": "Microsoft Smart Card Key Storage Provider"
; }
; }
; },
; {
; "name": "SCM Microsystems Inc. SCR33x USB Smart Card Reader 0",
; "state": "present",
; "vendorName": "SCM Microsystems Inc.",
; "serialNumber": "333130303330",
; "systemName": "SCM Microsystems Inc. SCR33x USB Smart Card Reader 0",
; "card": {
; "atr": "3BFC180000813180459067464A00641606F2727E00E0",
; "windows": {
; "miniDriver": "tagliov70px.dll",
; "cryptoProvider": "Microsoft Base Smart Card Crypto Provider",
; "keyStorageProvider": "Microsoft Smart Card Key Storage Provider"
; }
; }
; },
; {
; "name": "Yubico YubiKey OTP+FIDO+CCID 0",
; "state": "present",
; "vendorName": "Yubico",
; "serialNumber": "3F",
; "systemName": "Yubico YubiKey OTP+FIDO+CCID 0",
; "card": {
; "atr": "3BFD1300008131FE158073C021C057597562694B657940",
; "windows": {
; "miniDriver": "msclmd.dll",
; "cryptoProvider": "Microsoft Base Smart Card Crypto Provider",
; "keyStorageProvider": "Microsoft Smart Card Key Storage Provider"
; }
; }
; }
; ]
; }
; Use this online tool to generate parsing code from sample JSON:
; Generate Parsing Code from JSON
name.s
state.s
vendorName.s
systemName.s
cardAtr.s
cardWindowsMiniDriver.s
cardWindowsCryptoProvider.s
cardWindowsKeyStorageProvider.s
serialNumber.s
i.i = 0
count_i.i = CkJsonObject::ckSizeOfArray(json,"reader")
While i < count_i
CkJsonObject::setCkI(json, i)
name = CkJsonObject::ckStringOf(json,"reader[i].name")
state = CkJsonObject::ckStringOf(json,"reader[i].state")
vendorName = CkJsonObject::ckStringOf(json,"reader[i].vendorName")
systemName = CkJsonObject::ckStringOf(json,"reader[i].systemName")
cardAtr = CkJsonObject::ckStringOf(json,"reader[i].card.atr")
cardWindowsMiniDriver = CkJsonObject::ckStringOf(json,"reader[i].card.windows.miniDriver")
cardWindowsCryptoProvider = CkJsonObject::ckStringOf(json,"reader[i].card.windows.cryptoProvider")
cardWindowsKeyStorageProvider = CkJsonObject::ckStringOf(json,"reader[i].card.windows.keyStorageProvider")
serialNumber = CkJsonObject::ckStringOf(json,"reader[i].serialNumber")
i = i + 1
Wend
; Applications should always release the context when finished.
success = CkSCard::ckReleaseContext(scard)
If success = 0
Debug CkSCard::ckLastErrorText(scard)
EndIf
CkSCard::ckDispose(scard)
CkJsonObject::ckDispose(json)
ProcedureReturn
EndProcedure