获取SCardGetCardTypeProviderName()的智能卡“名称”

时间:2013-09-03 14:43:59

标签: smartcard winscard

为了从CryptAcquireContext()获取加密上下文,我需要知道插槽中当前智能卡的提供商名称。

根据文档,SCardGetCardTypeProviderName()将执行此操作,但参数2是卡名称,我无法看到如何以非交互方式确定此名称。我见过的所有文档/示例都要么对名称进行编码,要么依赖SCardUIDlgSelectCard()来显示UI。

同样阅读SCardLocateCards(),虽然它需要一个智能卡名称列表(我正在为SCardListCards()填充),它似乎没有传回任何标识智能卡名称的内容插入

我怀疑我错过了一些明显的东西,但我看不清楚。

1 个答案:

答案 0 :(得分:0)

我错过了一些东西。 SCardLocateCards作为结构的一部分返回智能卡的ATR,然后可以在SCardListCards中使用:

SCARD_READERSTATE smartcardState[MAXIMUM_SMARTCARD_READERS];

result = SCardLocateCards (context, cardsList, smartcardState, readerCount);
if (result == SCARD_S_SUCCESS) {
    int i;
    for (i = 0; i < readerCount; i++)
    {
        if (SCARD_STATE_ATRMATCH & smartcardState[i].dwEventState) {
            break;
        }
    }

    result = SCardListCards (NULL, smartcardState[i].rgbAtr, NULL, NULL, cardName, &count);
    if (result == SCARD_S_SUCCESS) {
        // Cardname for CryptAquireContext in cardName
    }
}

如果有人有更好的前进路线让我知道 - 我认为这是我能看到的唯一途径。