Немного справочной информации:
Для чтения/записи на карты памяти SLE4442 в моем приложении в настоящее время используется USB-кардридер Omnikey Cardman 3021, API смарт-карт Sumbsembly (внешняя dll), способный обертывать вызовы CT-API (направленные в dll omnikey), поэтому что я могу читать/записывать карту памяти в свое приложение С#. Единственная проблема здесь в том, что Omnikey предоставляет только 32-битную DLL своего CT-API. Я спросил, будут ли они создавать 64-битную версию, но они не могут быть обеспокоены.
Текущая ситуация:
Чтобы сделать мое приложение 64-разрядным, я должен переписать его с помощью Windows WinSCard API. Проблема здесь в том, что в Интернете нет конкретных примеров, как это сделать. Также получить контроль над рабочими командами APDU почти невозможно, но мне удалось получить две несколько разные версии, которые работают. Я столкнулся со сто раз в течение многих месяцев и с тем, что мне удалось сожрать, я наконец могу прочитать карту памяти SLE4442. Но для жизни я не могу писать на работу.
Код:
Я не буду публиковать весь код в этом первом сообщении (если нужно, я могу сделать это позже или предоставить ссылку на исходный код). Но я опишу основные этапы.
1) SCardEstablishContext
2) Получить имя читателя через SCardListReaders
3) SCardConnect
4) Прочитайте всю память с помощью SCardTransmit и APDU new byte [] {0xFF, 0xB0, 0, 0, 0};
5) Подтвердите вывод с новым байтом SCardTransmit и APDU [] {0xFF, 0x20, 0, 0, 3, 0xFF, 0xFF, 0xFF}; (Обратите внимание, что это возвращает 0x90; 0x00 в качестве ответа, что означает, что проверка должна была быть успешной)
6) Попробуйте написать с помощью ScardTransmit и APDU new byte [] {0xFF, 0xD6, 0, 0, 50, 1}; (попробуйте записать значение 1 в ячейку памяти 50). Я также попытался использовать APDU с первым параметром 0x00 и/или вторым байтом 0xD0. Ответ никогда не был 0x90, 0x00, поэтому я предполагаю, что во время записи есть ошибка, но я не смог найти никакого смысла для возвращаемых кодов ошибок.
Возможные причины:
Поскольку я могу читать карту памяти с помощью WinSCard API, тогда ее можно также записать в одну (боковая записка - карта памяти, в которую я пытаюсь писать, находится в рабочем состоянии, у меня нет заблокировали их, не проверив PIN-код 3 раза).
1) Возможно, запись команды APDU неверна. Может быть, байт инструкции (второй байт) неверен, или в ячейке памяти используется какая-то расширенная схема кодирования.
2) Возможно, команда проверки фактически не проверила. Как и в самой команде, все хорошо, поэтому 0x90 был возвращен, но я должен сначала вызвать или настроить.
3) Просто догадайтесь, но я думаю, что это настоящий преступник. В то время как googling я нашел некоторые неопределенные ссылки на необходимость вызова метода SCardControl с параметром IOCTL_SMARTCARD_SET_CARD_TYPE и установки типа карты на SLE4442. Но снова никаких рабочих примеров нигде и мое пробное тестирование не привело к сбоям. Я получил: "Один или несколько из представленных параметров не могут быть правильно интерпретированы". и некоторые другие сообщения об ошибках, не могут вспомнить, кем они были. Предполагая, что код, который я скопировал в код google, имеет правильные описания кодов ошибок.
Что мне нужно:
Мне нужно, чтобы кто-то опубликовал или направил меня на сайт с полным + рабочим кодом в С# для чтения/записи SLE4442 с использованием WinSCard API, и он должен работать как в 32-битной, так и в 64-разрядной среде. Код не должен быть надежным - например. обрабатывая все возможные ошибки. Я должен сам это сделать. Но если это так (включая описания результатов команды APDU - например, 0x90; 0x00 - успех, но 0x6B; 0x4D - это... и т.д.), То все лучше.