Получение серийного номера считывателя PCSC с WinSCard - PullRequest
5 голосов
/ 04 августа 2011

У меня проблема с получением серийного номера ридера PCSC, если в ридере нет карты.Я использую winscard.dll и c ++.

Следующий код будет работать только в том случае, если в ридере присутствует карта.В противном случае SCardHandle не восстанавливается.Я не нашел другого способа получить SCardHandle.

SCARDHANDLE hCardHandle;
SCARDCONTEXT    hSC;
WCHAR   pCardReaderName[256];
LONG lReturn;

lReturn = SCardEstablishContext(SCARD_SCOPE_USER, 0, 0, &hSC);

if (lReturn != SCARD_S_SUCCESS)
{
    Console::WriteLine("SCardEstablishContext() failed\n");
    return;
}

my_select_reader(hSC, pCardReaderName); // just shows reader names in console and requires you to pick one

// connect to smart card
DWORD   dwAP;

lReturn = SCardConnect( hSC,
                (LPCWSTR)pCardReaderName,
                SCARD_SHARE_SHARED,
                SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1 | SCARD_PROTOCOL_RAW,
                &hCardHandle,
                &dwAP );

if ( SCARD_S_SUCCESS != lReturn )
{
    Console::WriteLine("Failed SCardConnect\n");
    exit(1);  // Or other appropriate action.
}

// get reader serial no
LPBYTE   pbAttr = NULL;
DWORD    cByte = SCARD_AUTOALLOCATE;

lReturn = SCardGetAttrib(hCardHandle,
                SCARD_ATTR_VENDOR_IFD_SERIAL_NO,
                (LPBYTE)&pbAttr,
                &cByte);

if ( SCARD_S_SUCCESS != lReturn )
{
    Console::WriteLine("Failed to retrieve Reader Serial\n");
    exit(1);  // Or other appropriate action.
}

printf("serial no: %s", pbAttr);

Можно ли получить серийный номер считывателя без подключения к карте?

Ответы [ 2 ]

5 голосов
/ 15 октября 2011

Может быть, я немного опоздал - но в любом случае ...

Вы можете напрямую подключиться к кард-ридеру, используя флаг SCARD_SHARE_DIRECT в SCardConnect. По крайней мере, у нас это работает нормально .. (мы используем флаг протокола "0x00")

4 голосов
/ 12 июля 2012

Вы должны использовать:

lReturn = SCardConnect(hResManager,szAvailRdr,SCARD_SHARE_SHARED,SCARD_PROTOCOL_T1,
                            &hCardHandle,
                            &dwActProtocol);

Вместо этого попробуйте использовать:

lReturn = SCardConnect(hResManager,szAvailRdr,SCARD_SHARE_DIRECT,
                      NULL,
                      &hCardHandle,
                      NULL);

, где szAvailRdr относится к имени читателя (readername смарт-карты), а hCardHandle - дескриптор, полученный до использования scardconnect.

Это должно держать вас в курсе!

...