В един от последните ми проекти се наложи да работя със memory карти , по-специално SLE4428.
Защо? Ами евтини са, лесно се доставят и вярвах, че лесно се работи с тях – в крайна сметка – като голяма магнитна карта.
Да, ама не – след 3 дневно проучване и четене в google се оказа, че последното хич не е вярно.
Тъй наречените memory карти или карти със синхронен достъп се оказаха костелив орех и PS/SC спецификацията не важи за тях (PS/SC била само за карти с протоколи T=0 и Т=1, но откъде да го знам това…). В крайна сметка всеки модел картов четец си има собствен начин за достъп до синхронни карти!
Частта по инициализирането със SCardEstablishContext и SCardConnect е същата и идва от стандартния Windows winscard интерфейс, но самото четене и писане е специфично за конкретния четец.
С две думи – в зависимост от vendor-a на четеца се използват различни команди за достъп до паметта на картата. Мнооого неприятно. Това в комбинация с нуждата за поддръжка на няколко различни типове memory карти – още по-неприятно.
Все пак – решение има. За ACS има описание на командите в SDK-a (не знам дали е публично достъпен, но със сигурност може да се намери в Интернет),
за OMNIKEY има достъпно SDK на http://www.omnikey.com/ като трябва да се търси Synchronous API като цялата функционалност е затворена в scardsyn.dll и има готови функции за четене/запис.
За GemPlus (вече Gemalto) нужната библиотека е GSC.dll като идва с кратко описание от сайта на Gemalto.
Update: Ако се използва четец на Omnikey, за да сработи API-то за работа със синхронни карти е необходимо да се инсталират драйверите за Omnikey, тъй като стандартния драйвер по подразбиране от Windows не работи правилно.
Update2: ACS произвеждат USB картови четци, които не поддържат memory cards. Например такива са ACS ACR38C (C идва от CCID). За тези четци драйвери не са необходими, но за съжаление поддържат само карти с микропроцесор.