Ответы пользователя по тегу Смарт-карты
  • Как отследить появление смарт-карты в кард-ридере по протоколу PC/SC?

    @Mingun Автор вопроса
    Разобрался. Необходимо с каждым витком ожидания заносить в dwCurrentState значение из dwEventState. Правда, понять, из-за чего были глюки с возвращаемым значением, не удалось. Короче, такой код работает:
    // Начальное состояние dwCurrentState будет SCARD_STATE_UNAWARE, т.к. числом это значение 0.
    SCARD_READERSTATE reader = {0};
    reader.szName = ...;
    do {
        LONG st = SCardGetStatusChange(hContext, INFINITE, &reader, 1);
        // Делаем новое состояние текущим.
        reader.dwCurrentState = reader.dwEventState;
        // прочие дела.
        ...
    } while (true);

    Цикл лучше сделать даже для одиночного ожидания, т.к. первый раз он наверняка провернется вхолостую -- т.к. первый вызов сразу заполнит текущее состояние, а второй уже будет ждать изменений.
    Ответ написан
    Комментировать
  • Как получить ATR со смарткарты по протоколу PC/SC?

    @Mingun Автор вопроса
    Так, вопрос отменяется. Не обратил внимание, что можно получать различные атрибуты, в том числе ATR, либо специальной функцией:
    LONG rv;
    SCARDCONTEXT hContext;
    SCARDHANDLE hCard;
    DWORD dwActiveProtocol;
    unsigned char *pbAttr;
    DWORD dwAttrLen;
    ...
    rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
    rv = SCardConnect(hContext, "Reader X", SCARD_SHARE_SHARED,
             SCARD_PROTOCOL_RAW, &hCard, &dwActiveProtocol);
    dwAttrLen = SCARD_AUTOALLOCATE;
    // Вот как раз получение ATR в pbAttr.
    rv = SCardGetAttrib(hCard, SCARD_ATTR_ATR_STRING, (unsigned char *)&pbAttr, &dwAttrLen);

    либо вместе с прочим статусом:
    SCARDCONTEXT hContext;
    SCARDHANDLE hCard;
    DWORD dwActiveProtocol;
    DWORD dwState, dwProtocol, dwAtrLen, dwReaderLen;
    BYTE pbAtr[MAX_ATR_SIZE];
    ...
    rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
    rv = SCardConnect(hContext, "Reader X", SCARD_SHARE_SHARED,
             SCARD_PROTOCOL_T0, &hCard, &dwActiveProtocol);
    ...
    dwAtrLen = sizeof(pbAtr);
    rv = SCardStatus(hCard, NULL, &dwReaderLen, &dwState, &dwProtocol, pbAtr, &dwAtrLen);

    Аббревиатура Atr в названии у меня прочно проассоциировалась с атрибутами, а не ATR :)
    Ответ написан
    Комментировать