使用WinSCard获取PCSC阅读器序列号

vel*_*tis 6 windows serial-number pcsc winscard

如果读卡器中没有卡,我在获取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   pbAtr = NULL;
DWORD    cByte = SCARD_AUTOALLOCATE;

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

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

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

SCardFreeMemory(hCardHandle, pbAtr); 
Run Code Online (Sandbox Code Playgroud)

有没有办法在不连接卡的情况下获取读者序列号?

mtr*_*aut 5

也许我有点迟了 - 但无论如何......

您可以使用带有SCardConnect的SCARD_SHARE_DIRECT标志直接连接到读卡器.至少和我们一起工作正常..(我们使用协议标志"0x00")