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