|
Projektbeispiel 5, CardManager PRO - V2.x Das nachfolgende Projektbeispiel zeigt ein Standardverfahren, mit dem sich ein simpler Lese/Schreibzugriff (MemoryRead, MemoryWrite) auf einer Chipkarte durchführen läßt. Jeder Zugriff ist flexibel ausführbar, da sich die erforderlichen Parameter: (Zone, Offset, ByteArray, Size) individuell übergeben lassen. |
|
|
Private Sub Template() '- PC/SC Dienst: SCardSvr prüfen - If SCARD1.Services("SCardSvr", TASK_SERVICE, False) <> 1 then Debug.Print "Der Dienst 'SCardSvr' wird nicht ausgeführt !" Exit Sub End If '- Evtl. Kollisionsdienste suchen + beenden - SCARD1.Services "SCM_Smart_Card_Office_Kernel", TASK_SERVICE, True SCARD1.Services "SCMgr.exe", TASK_APPLICATION, True SCARD1.Services "sokscmpn.exe", TASK_APPLICATION, True '- Schnittstelle initialisieren - With SCARD1 If .GetReaderCount >0 then .CardReader = .GetReaderList .DisconnectFlag = SCARD_UNPOWER_CARD .AutoDetect False .Initialize Else Debug.Print "Es konnte kein Terminal ermittelt werden !" End If End With End Sub Private Sub SCARD1_OnMCARDInit() With SCARD1 Debug.Print "SDK Version = " & .Version Debug.Print "MCARD-Version = " & .CardDLL Debug.Print "ChannelID :" & .ChannelID Debug.Print "IFDSerialID :" & .IFDSerialID Debug.Print "IFDVersion :" & .IFDVersion End With '- AutoDetect aktivieren - SCARD1.AutoDetect True, 50 End Sub Private Sub SCARD1_OnMCARDError() Debug.Print "MCARD-API Initialisierung/Fehler: " & SCARD1.CardERR End Sub Private Sub SCARD1_OnInsert() With SCARD1 .ShowTrayIcon True .Connect End With End Sub Private Sub SCARD1_OnConnect() With SCARD1.INFO Debug.Print "BitOrder :" & .BitOrder Debug.Print "CardCompany :" & .CardCompany Debug.Print "ChipCompany :" & .ChipCompany Debug.Print "ChipAttrID :" & .ChipAttrID Debug.Print "ChipType :" & .ChipType Debug.Print "Clockrate :" & .Clockrate Debug.Print "Counter :" & .Counter Debug.Print "CR's :" & .CR Debug.Print "MemoryZone :" & .CardZone Debug.Print "MemorySize :" & .CardSize Debug.Print "PIN :" & .PIN Debug.Print "Protocol :" & .Protocol Debug.Print "SerialNr. :" & .SerialNr End With '- Lesezugriff, Zone:0, Offset:32, 16 Byte - Dim szData as String Dim byBytes() as Byte Dim nLoop as Integer Redim byBytes(15) If SCARD1.MemoryRead(&H0, 32, byBytes(), 16) then For nLoop = 0 to 15 Debug.Print Right("0" & Hex(byBytes(nLoop)), 2); Next nLoop szData = StrConv(byBytes, vbUnicode) Debug.Print "= " & szData End If '- Chipkarte mit Schreibschutz/PIN ? - With SCARD1 If .INFO.PIN >0 then '<- PIN-Zone vorhanden ! '- Fehlbedienungszähler prüfen - If .PINRetries =0 then Debug.Print "Die Chipkarte ist irreversibel gesperrt !" Exit Sub End If '- PIN:0 Authentifizierung - .CardPIN = String$(.PINSize * 2, "F") '<- Standard PIN setzen If Not .VerifyPIN(&H0, .CardPIN) then Debug.Print "Authentifizierung fehlgeschlagen !" Exit Sub End If End If End With '- Chipkarte mit Write/Protection ? (optionale Prüfroutine) SLE - ' ' Je nach Chipkarte werden unterschiedliche Offsetbereiche der Chipkarte ' mit einem WriteProtection Flag unterstützt. Ist ein solches Flag gesetzt, ' kann der hiervon betroffene Offset nicht erneut beschrieben werden. ' ' Offset: 0 - 31 : SLE 4432, 4442, 5532, 5542, ChipAttrID 4 + 6 ' Offset: 0 - 1021 : SLE 4418, 4428, 5518, 5528, ChipAttrID 2 + 3 ' ' Über die ChipAttrID läßt sich der Chiptyp ermitteln, so das sich ' MemoryWrite Zugriffe in Verbindung mit den Write/Protection Flags ' vorab auf plausibilität prüfen lassen. With SCARD1 If .INFO.ChipAttrID = 2 or .INFO.ChipAttrID = 3 then For nLoop = 32 to (32 + 16) -1 If .ProtectFlag(&H0, nLoop) then Debug.Print "Offset: " & CStr(nLoop) & " ist protected !" Exit Sub End If Next nLoop End If End With '- Schreibzugriff, Zone:0, Offset:32, 16 Byte - byBytes = StrConv("Card/Manager PRO", vbFromUnicode) If SCARD1.MemoryWrite(&H0, 32, byBytes(), 16) then Debug.Print "Neue Daten wurden zurückgeschrieben !" End If End Sub Private Sub SCARD1_OnConnectError() Debug.Print "Verbindungsfehler: " & SCARD1.CardERR End Sub Private Sub SCARD1_OnReadError() Debug.Print "Lesefehler: " & SCARD1.CardERR End Sub Private Sub SCARD1_OnVerifyPIN() Debug.Print "Die Chipkarte ist für Schreibzugriffe freigeschaltet !" Debug.Print "Sie haben wieder " & SCARD1.PINRetries & " gültige Versuche." End Sub Private Sub SCARD1_OnVerifyPINError() With SCARD1 If .PINRetries = 0 then Debug.Print "Die Chipkarte ist für Schreibzugriffe irreversibel gesperrt !" Else Debug.Print "Sie haben noch " & .PINRetries & " gültige(n) Versuch(e)." End If End With End Sub Private Sub SCARD1_OnWriteError() Debug.Print "Schreibfehler: " & SCARD1.CardERR End Sub Private Sub SCARD1_OnRemoved() SCARD1.ShowTrayIcon False End Sub Private Sub SCARD1_OnMCARDClose() Debug.Print "Verbindung PC/SC <-> MCARD API, Kartenleser getrennt !" End Sub Private Sub Form_Unload(Cancel as Integer) SCARD1.Shutdown End Sub |
|
| ©2011 by ProScan Elektronische Systeme, Buchholzer Weg 2, 42897 Remscheid, www.smartcardtools.de | |