-1

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

根据文档,SCardGetCardTypeProviderName()会这样做,但参数 2 是卡名,我看不出如何以非交互方式确定这一点。我见过的所有文档/示例都对名称进行了编码或依赖SCardUIDlgSelectCard(),它显示了一个 UI。

类似地阅读SCardLocateCards(),虽然它需要一个智能卡名称列表(我从中填充SCardListCards()它,但它似乎没有传回任何标识插入的智能卡名称的内容。

我怀疑我遗漏了一些明显的东西,但我看不出是什么。

4

1 回答 1

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
    }
}

如果有人有更好的前进路线,请告诉我 - 我认为这是我所看到的唯一方法。

于 2013-09-04T07:53:54.913 回答