36static const WCHAR* listW[] = { 
nullptr, L
"SCard$AllReaders\000", L
"SCard$DefaultReaders\000",
 
   37                              L
"SCard$LocalReaders\000", L
"SCard$SystemReaders\000" };
 
   38static const char* listA[] = { 
nullptr, 
"SCard$AllReaders\000", 
"SCard$DefaultReaders\000",
 
   39                             "SCard$LocalReaders\000", 
"SCard$SystemReaders\000" };
 
   41static std::string scope2str(DWORD scope)
 
   45    case SCARD_SCOPE_USER:
 
   46      return "SCARD_SCOPE_USER";
 
   47    case SCARD_SCOPE_TERMINAL:
 
   48      return "SCARD_SCOPE_TERMINAL";
 
   49    case SCARD_SCOPE_SYSTEM:
 
   50      return "SCARD_SCOPE_SYSTEM";
 
   56static std::string err2str(LONG code)
 
   60    case ERROR_BROKEN_PIPE:
 
   61      return "ERROR_BROKEN_PIPE";
 
   62    case SCARD_E_BAD_SEEK:
 
   63      return "SCARD_E_BAD_SEEK";
 
   64    case SCARD_E_CANCELLED:
 
   65      return "SCARD_E_CANCELLED";
 
   66    case SCARD_E_CANT_DISPOSE:
 
   67      return "SCARD_E_CANT_DISPOSE";
 
   68    case SCARD_E_CARD_UNSUPPORTED:
 
   69      return "SCARD_E_CARD_UNSUPPORTED";
 
   70    case SCARD_E_CERTIFICATE_UNAVAILABLE:
 
   71      return "SCARD_E_CERTIFICATE_UNAVAILABLE";
 
   72    case SCARD_E_COMM_DATA_LOST:
 
   73      return "SCARD_E_COMM_DATA_LOST";
 
   74    case SCARD_E_DIR_NOT_FOUND:
 
   75      return "SCARD_E_DIR_NOT_FOUND";
 
   76    case SCARD_E_DUPLICATE_READER:
 
   77      return "SCARD_E_DUPLICATE_READER";
 
   78    case SCARD_E_FILE_NOT_FOUND:
 
   79      return "SCARD_E_FILE_NOT_FOUND";
 
   80    case SCARD_E_ICC_CREATEORDER:
 
   81      return "SCARD_E_ICC_CREATEORDER";
 
   82    case SCARD_E_ICC_INSTALLATION:
 
   83      return "SCARD_E_ICC_INSTALLATION";
 
   84    case SCARD_E_INSUFFICIENT_BUFFER:
 
   85      return "SCARD_E_INSUFFICIENT_BUFFER";
 
   86    case SCARD_E_INVALID_ATR:
 
   87      return "SCARD_E_INVALID_ATR";
 
   88    case SCARD_E_INVALID_CHV:
 
   89      return "SCARD_E_INVALID_CHV";
 
   90    case SCARD_E_INVALID_HANDLE:
 
   91      return "SCARD_E_INVALID_HANDLE";
 
   92    case SCARD_E_INVALID_PARAMETER:
 
   93      return "SCARD_E_INVALID_PARAMETER";
 
   94    case SCARD_E_INVALID_TARGET:
 
   95      return "SCARD_E_INVALID_TARGET";
 
   96    case SCARD_E_INVALID_VALUE:
 
   97      return "SCARD_E_INVALID_VALUE";
 
   98    case SCARD_E_NO_ACCESS:
 
   99      return "SCARD_E_NO_ACCESS";
 
  101      return "SCARD_E_NO_DIR";
 
  102    case SCARD_E_NO_FILE:
 
  103      return "SCARD_E_NO_FILE";
 
  104    case SCARD_E_NO_KEY_CONTAINER:
 
  105      return "SCARD_E_NO_KEY_CONTAINER";
 
  106    case SCARD_E_NO_MEMORY:
 
  107      return "SCARD_E_NO_MEMORY";
 
  108    case SCARD_E_NO_PIN_CACHE:
 
  109      return "SCARD_E_NO_PIN_CACHE";
 
  110    case SCARD_E_NO_READERS_AVAILABLE:
 
  111      return "SCARD_E_NO_READERS_AVAILABLE";
 
  112    case SCARD_E_NO_SERVICE:
 
  113      return "SCARD_E_NO_SERVICE";
 
  114    case SCARD_E_NO_SMARTCARD:
 
  115      return "SCARD_E_NO_SMARTCARD";
 
  116    case SCARD_E_NO_SUCH_CERTIFICATE:
 
  117      return "SCARD_E_NO_SUCH_CERTIFICATE";
 
  118    case SCARD_E_NOT_READY:
 
  119      return "SCARD_E_NOT_READY";
 
  120    case SCARD_E_NOT_TRANSACTED:
 
  121      return "SCARD_E_NOT_TRANSACTED";
 
  122    case SCARD_E_PCI_TOO_SMALL:
 
  123      return "SCARD_E_PCI_TOO_SMALL";
 
  124    case SCARD_E_PIN_CACHE_EXPIRED:
 
  125      return "SCARD_E_PIN_CACHE_EXPIRED";
 
  126    case SCARD_E_PROTO_MISMATCH:
 
  127      return "SCARD_E_PROTO_MISMATCH";
 
  128    case SCARD_E_READ_ONLY_CARD:
 
  129      return "SCARD_E_READ_ONLY_CARD";
 
  130    case SCARD_E_READER_UNAVAILABLE:
 
  131      return "SCARD_E_READER_UNAVAILABLE";
 
  132    case SCARD_E_READER_UNSUPPORTED:
 
  133      return "SCARD_E_READER_UNSUPPORTED";
 
  134    case SCARD_E_SERVER_TOO_BUSY:
 
  135      return "SCARD_E_SERVER_TOO_BUSY";
 
  136    case SCARD_E_SERVICE_STOPPED:
 
  137      return "SCARD_E_SERVICE_STOPPED";
 
  138    case SCARD_E_SHARING_VIOLATION:
 
  139      return "SCARD_E_SHARING_VIOLATION";
 
  140    case SCARD_E_SYSTEM_CANCELLED:
 
  141      return "SCARD_E_SYSTEM_CANCELLED";
 
  142    case SCARD_E_TIMEOUT:
 
  143      return "SCARD_E_TIMEOUT";
 
  144    case SCARD_E_UNEXPECTED:
 
  145      return "SCARD_E_UNEXPECTED";
 
  146    case SCARD_E_UNKNOWN_CARD:
 
  147      return "SCARD_E_UNKNOWN_CARD";
 
  148    case SCARD_E_UNKNOWN_READER:
 
  149      return "SCARD_E_UNKNOWN_READER";
 
  150    case SCARD_E_UNKNOWN_RES_MNG:
 
  151      return "SCARD_E_UNKNOWN_RES_MNG";
 
  152    case SCARD_E_UNSUPPORTED_FEATURE:
 
  153      return "SCARD_E_UNSUPPORTED_FEATURE";
 
  154    case SCARD_E_WRITE_TOO_MANY:
 
  155      return "SCARD_E_WRITE_TOO_MANY";
 
  156    case SCARD_F_COMM_ERROR:
 
  157      return "SCARD_F_COMM_ERROR";
 
  158    case SCARD_F_INTERNAL_ERROR:
 
  159      return "SCARD_F_INTERNAL_ERROR";
 
  160    case SCARD_F_UNKNOWN_ERROR:
 
  161      return "SCARD_F_UNKNOWN_ERROR";
 
  162    case SCARD_F_WAITED_TOO_LONG:
 
  163      return "SCARD_F_WAITED_TOO_LONG";
 
  164    case SCARD_P_SHUTDOWN:
 
  165      return "SCARD_P_SHUTDOWN";
 
  166    case SCARD_S_SUCCESS:
 
  167      return "SCARD_S_SUCCESS";
 
  168    case SCARD_W_CANCELLED_BY_USER:
 
  169      return "SCARD_W_CANCELLED_BY_USER";
 
  170    case SCARD_W_CACHE_ITEM_NOT_FOUND:
 
  171      return "SCARD_W_CACHE_ITEM_NOT_FOUND";
 
  172    case SCARD_W_CACHE_ITEM_STALE:
 
  173      return "SCARD_W_CACHE_ITEM_STALE";
 
  174    case SCARD_W_CACHE_ITEM_TOO_BIG:
 
  175      return "SCARD_W_CACHE_ITEM_TOO_BIG";
 
  176    case SCARD_W_CARD_NOT_AUTHENTICATED:
 
  177      return "SCARD_W_CARD_NOT_AUTHENTICATED";
 
  178    case SCARD_W_CHV_BLOCKED:
 
  179      return "SCARD_W_CHV_BLOCKED";
 
  181      return "SCARD_W_EOF";
 
  182    case SCARD_W_REMOVED_CARD:
 
  183      return "SCARD_W_REMOVED_CARD";
 
  184    case SCARD_W_RESET_CARD:
 
  185      return "SCARD_W_RESET_CARD";
 
  186    case SCARD_W_SECURITY_VIOLATION:
 
  187      return "SCARD_W_SECURITY_VIOLATION";
 
  188    case SCARD_W_UNPOWERED_CARD:
 
  189      return "SCARD_W_UNPOWERED_CARD";
 
  190    case SCARD_W_UNRESPONSIVE_CARD:
 
  191      return "SCARD_W_UNRESPONSIVE_CARD";
 
  192    case SCARD_W_UNSUPPORTED_CARD:
 
  193      return "SCARD_W_UNSUPPORTED_CARD";
 
  194    case SCARD_W_WRONG_CHV:
 
  195      return "SCARD_W_WRONG_CHV";
 
  201static std::wstring err2wstr(LONG code)
 
  203  auto str = err2str(code);
 
  204  std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
 
  205  return converter.from_bytes(str);
 
  208static bool test_valid(SCARDCONTEXT context)
 
  210  auto rc = SCardIsValidContext(context);
 
  212    std::cerr << 
"SCardIsValidContext failed with " << err2str(rc) << std::endl;
 
  216static bool test_list_readers_a(SCARDCONTEXT context)
 
  218  for (
auto cur : listA)
 
  220    LPSTR mszReaders = 
nullptr;
 
  221    DWORD chReaders = SCARD_AUTOALLOCATE;
 
  222    auto rc = SCardListReadersA(context, cur, 
reinterpret_cast<LPSTR
>(&mszReaders), &chReaders);
 
  227    if (rc != SCARD_S_SUCCESS)
 
  229      std::cerr << 
"SCardListReadersA [" << cur << 
"] failed with " << err2str(rc)
 
  234      auto start = mszReaders;
 
  235      auto end = &mszReaders[chReaders];
 
  237      std::cout << 
"SCardListReadersA [" << cur << 
"] " << chReaders << 
" [";
 
  240        std::cout << start << 
", ";
 
  241        start += strnlen(start, chReaders) + 2;
 
  243      std::cout << 
"]" << std::endl;
 
  245    SCardFreeMemory(context, mszReaders);
 
  251static bool test_list_readers_w(SCARDCONTEXT context)
 
  253  for (
auto cur : listW)
 
  255    LPWSTR mszReaders = 
nullptr;
 
  256    DWORD chReaders = SCARD_AUTOALLOCATE;
 
  258        SCardListReadersW(context, cur, 
reinterpret_cast<LPWSTR
>(&mszReaders), &chReaders);
 
  263    if (rc != SCARD_S_SUCCESS)
 
  265      std::wcerr << L
"SCardListReadersW [" << cur << L
"] failed with " << err2wstr(rc)
 
  270      auto start = mszReaders;
 
  271      auto end = &mszReaders[chReaders];
 
  273      std::wcout << L
"SCardListReadersW [" << cur << L
"] " << chReaders << L
" [";
 
  276        std::wcout << start << L
", ";
 
  277        start += wcsnlen(start, chReaders) + 2;
 
  279      std::wcout << L
"]" << std::endl;
 
  281    SCardFreeMemory(context, mszReaders);
 
  287static bool test_list_reader_groups_a(SCARDCONTEXT context)
 
  289  LPSTR mszReaders = 
nullptr;
 
  290  DWORD chReaders = SCARD_AUTOALLOCATE;
 
  291  auto rc = SCardListReaderGroupsA(context, 
reinterpret_cast<LPSTR
>(&mszReaders), &chReaders);
 
  292  if (rc != SCARD_S_SUCCESS)
 
  294    std::cerr << 
"SCardListReaderGroupsA failed with " << err2str(rc) << std::endl;
 
  298    auto start = mszReaders;
 
  299    auto end = &mszReaders[chReaders];
 
  301    std::cout << 
"SCardListReaderGroupsA " << chReaders << 
" [";
 
  304      std::cout << start << 
", ";
 
  305      start += strnlen(start, chReaders) + 2;
 
  307    std::cout << 
"]" << std::endl;
 
  309  SCardFreeMemory(context, mszReaders);
 
  314static bool test_list_reader_groups_w(SCARDCONTEXT context)
 
  316  LPWSTR mszReaders = 
nullptr;
 
  317  DWORD chReaders = SCARD_AUTOALLOCATE;
 
  318  auto rc = SCardListReaderGroupsW(context, 
reinterpret_cast<LPWSTR
>(&mszReaders), &chReaders);
 
  319  if (rc != SCARD_S_SUCCESS)
 
  321    std::wcerr << L
"SCardListReaderGroupsW failed with " << err2wstr(rc) << std::endl;
 
  325    auto start = mszReaders;
 
  326    auto end = &mszReaders[chReaders];
 
  328    std::wcout << L
"SCardListReaderGroupsW " << chReaders << L
" [";
 
  331      std::wcout << start << L
", ";
 
  332      start += wcsnlen(start, chReaders) + 2;
 
  334    std::wcout << L
"]" << std::endl;
 
  336  SCardFreeMemory(context, mszReaders);
 
  341static bool test_introduce_forget_reader_groups_a(SCARDCONTEXT context)
 
  343  LPSTR group = 
"somefancygroup";
 
  345  auto rc = SCardIntroduceReaderGroupA(context, group);
 
  346  if (rc != SCARD_S_SUCCESS)
 
  348    std::cerr << 
"SCardIntroduceReaderGroupA failed with " << err2str(rc) << std::endl;
 
  353    rc = SCardForgetReaderGroupA(context, group);
 
  354    if (rc != SCARD_S_SUCCESS)
 
  356      std::cerr << 
"SCardForgetReaderGroupA failed with " << err2str(rc) << std::endl;
 
  363static bool test_introduce_forget_reader_groups_w(SCARDCONTEXT context)
 
  365  LPWSTR group = L
"somefancygroup";
 
  367  auto rc = SCardIntroduceReaderGroupW(context, group);
 
  368  if (rc != SCARD_S_SUCCESS)
 
  370    std::cerr << 
"SCardIntroduceReaderGroupW failed with " << err2str(rc) << std::endl;
 
  375    rc = SCardForgetReaderGroupW(context, group);
 
  376    if (rc != SCARD_S_SUCCESS)
 
  378      std::cerr << 
"SCardForgetReaderGroupW failed with " << err2str(rc) << std::endl;
 
  385static bool test_introduce_forget_reader_a(SCARDCONTEXT context)
 
  387  LPSTR reader = 
"somefancygroup";
 
  388  LPSTR device = 
"otherfancy";
 
  390  auto rc = SCardIntroduceReaderA(context, reader, device);
 
  391  if (rc != SCARD_S_SUCCESS)
 
  393    std::cerr << 
"SCardIntroduceReaderA failed with " << err2str(rc) << std::endl;
 
  398    rc = SCardForgetReaderA(context, reader);
 
  399    if (rc != SCARD_S_SUCCESS)
 
  401      std::cerr << 
"SCardForgetReaderA failed with " << err2str(rc) << std::endl;
 
  408static bool test_introduce_forget_reader_w(SCARDCONTEXT context)
 
  410  LPWSTR reader = L
"somefancygroup";
 
  411  LPWSTR device = L
"otherfancy";
 
  413  auto rc = SCardIntroduceReaderW(context, reader, device);
 
  414  if (rc != SCARD_S_SUCCESS)
 
  416    std::cerr << 
"SCardIntroduceReaderW failed with " << err2str(rc) << std::endl;
 
  421    rc = SCardForgetReaderW(context, reader);
 
  422    if (rc != SCARD_S_SUCCESS)
 
  424      std::cerr << 
"SCardForgetReaderW failed with " << err2str(rc) << std::endl;
 
  431static bool test_list_cards_a(SCARDCONTEXT context)
 
  433  DWORD chCards = SCARD_AUTOALLOCATE;
 
  434  LPSTR mszCards = 
nullptr;
 
  436      SCardListCardsA(context, 
nullptr, 
nullptr, 0, 
reinterpret_cast<LPSTR
>(&mszCards), &chCards);
 
  437  if (rc != SCARD_S_SUCCESS)
 
  439    std::cerr << 
"SCardListCardsA failed with " << err2str(rc) << std::endl;
 
  443    auto start = mszCards;
 
  444    auto end = &mszCards[chCards];
 
  445    std::cout << 
"SCardListCardsA " << chCards << 
" [";
 
  448      std::cout << start << 
", ";
 
  449      start += strnlen(start, chCards) + 2;
 
  451    std::cout << 
"]" << std::endl;
 
  456static bool test_list_cards_w(SCARDCONTEXT context)
 
  458  DWORD chCards = SCARD_AUTOALLOCATE;
 
  459  LPWSTR mszCards = 
nullptr;
 
  460  auto rc = SCardListCardsW(context, 
nullptr, 
nullptr, 0, 
reinterpret_cast<LPWSTR
>(&mszCards),
 
  462  if (rc != SCARD_S_SUCCESS)
 
  464    std::cerr << 
"SCardListCardsW failed with " << err2str(rc) << std::endl;
 
  468    auto start = mszCards;
 
  469    auto end = &mszCards[chCards];
 
  470    std::cout << 
"SCardListCardsW " << chCards << 
" [";
 
  473      std::wcout << start << L
", ";
 
  474      start += wcsnlen(start, chCards) + 2;
 
  476    std::cout << 
"]" << std::endl;
 
  481static bool test_cache_a(SCARDCONTEXT context)
 
  483  BYTE wdata[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
 
  484  const DWORD wdatalen = 
sizeof(wdata);
 
  486  DWORD datalen = 
sizeof(data);
 
  487  LPSTR name = 
"testdata";
 
  490  auto rc = SCardWriteCacheA(context, &
id, 0, name, wdata, wdatalen);
 
  491  if (rc != SCARD_S_SUCCESS)
 
  493    std::cerr << 
"SCardWriteCacheA failed with " << err2str(rc) << std::endl;
 
  497  rc = SCardReadCacheA(context, &
id, 0, name, data, &datalen);
 
  498  if (rc != SCARD_S_SUCCESS)
 
  500    std::cerr << 
"SCardReadCacheA failed with " << err2str(rc) << std::endl;
 
  504  if (wdatalen != datalen)
 
  506    std::cerr << 
"SCardWriteCacheA wrote " << wdatalen << 
"bytes, SCardReadCacheA read " 
  507              << datalen << 
"bytes" << std::endl;
 
  511  if (memcmp(wdata, data, wdatalen) != 0)
 
  513    std::cerr << 
"SCardWriteCacheA / SCardReadCacheA data corruption detected" << std::endl;
 
  520static bool test_cache_w(SCARDCONTEXT context)
 
  522  BYTE wdata[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
 
  523  const DWORD wdatalen = 
sizeof(wdata);
 
  525  DWORD datalen = 
sizeof(data);
 
  526  LPWSTR name = L
"testdata";
 
  529  auto rc = SCardWriteCacheW(context, &
id, 0, name, wdata, wdatalen);
 
  530  if (rc != SCARD_S_SUCCESS)
 
  532    std::cerr << 
"SCardWriteCacheW failed with " << err2str(rc) << std::endl;
 
  536  rc = SCardReadCacheW(context, &
id, 0, name, data, &datalen);
 
  537  if (rc != SCARD_S_SUCCESS)
 
  539    std::cerr << 
"SCardReadCacheW failed with " << err2str(rc) << std::endl;
 
  543  if (wdatalen != datalen)
 
  545    std::cerr << 
"SCardReadCacheW wrote " << wdatalen << 
"bytes, SCardReadCacheW read " 
  546              << datalen << 
"bytes" << std::endl;
 
  550  if (memcmp(wdata, data, wdatalen) != 0)
 
  552    std::cerr << 
"SCardReadCacheW / SCardReadCacheW data corruption detected" << std::endl;
 
  559static bool test_reader_icon_a(SCARDCONTEXT context)
 
  561  LPSTR name = 
"Gemalto PC Twin Reader 00 00\0\0";
 
  562  LPBYTE pbIcon = 
nullptr;
 
  563  DWORD cbIcon = SCARD_AUTOALLOCATE;
 
  565  auto rc = SCardGetReaderIconA(context, name, 
reinterpret_cast<LPBYTE
>(&pbIcon), &cbIcon);
 
  566  SCardFreeMemory(context, pbIcon);
 
  567  if (rc != SCARD_S_SUCCESS)
 
  569    std::cerr << 
"SCardGetReaderIconA failed with " << err2str(rc) << std::endl;
 
  576static bool test_reader_icon_w(SCARDCONTEXT context)
 
  578  LPWSTR name = L
"Gemalto PC Twin Reader 00 00\0\0";
 
  579  LPBYTE pbIcon = 
nullptr;
 
  580  DWORD cbIcon = SCARD_AUTOALLOCATE;
 
  582  auto rc = SCardGetReaderIconW(context, name, 
reinterpret_cast<LPBYTE
>(&pbIcon), &cbIcon);
 
  583  SCardFreeMemory(context, pbIcon);
 
  584  if (rc != SCARD_S_SUCCESS)
 
  586    std::cerr << 
"SCardGetReaderIconW failed with " << err2str(rc) << std::endl;
 
  593static bool test_locate_cards_a(SCARDCONTEXT context)
 
  595  LPSTR name = 
"Gemalto PC Twin Reader 00 00\0\0";
 
  598  auto rc = SCardLocateCardsA(context, name, rgReaderStates, ARRAYSIZE(rgReaderStates));
 
  599  if (rc != SCARD_S_SUCCESS)
 
  601    std::cerr << 
"SCardLocateCardsA failed with " << err2str(rc) << std::endl;
 
  608static bool test_locate_cards_w(SCARDCONTEXT context)
 
  610  LPWSTR name = L
"Gemalto PC Twin Reader 00 00\0\0";
 
  613  auto rc = SCardLocateCardsW(context, name, rgReaderStates, ARRAYSIZE(rgReaderStates));
 
  614  if (rc != SCARD_S_SUCCESS)
 
  616    std::cerr << 
"SCardLocateCardsW failed with " << err2str(rc) << std::endl;
 
  623static bool test_locate_cards_by_atr_a(SCARDCONTEXT context)
 
  628  auto rc = SCardLocateCardsByATRA(context, rgAtrMasks, ARRAYSIZE(rgAtrMasks), rgReaderStates,
 
  629                                   ARRAYSIZE(rgReaderStates));
 
  630  if (rc != SCARD_S_SUCCESS)
 
  632    std::cerr << 
"SCardLocateCardsByATRA failed with " << err2str(rc) << std::endl;
 
  639static bool test_locate_cards_by_atr_w(SCARDCONTEXT context)
 
  644  auto rc = SCardLocateCardsByATRW(context, rgAtrMasks, ARRAYSIZE(rgAtrMasks), rgReaderStates,
 
  645                                   ARRAYSIZE(rgReaderStates));
 
  646  if (rc != SCARD_S_SUCCESS)
 
  648    std::cerr << 
"SCardLocateCardsByATRW failed with " << err2str(rc) << std::endl;
 
  655static bool test_devicetype_id_a(SCARDCONTEXT context)
 
  658  LPSTR name = 
"testdata";
 
  661  auto rc = SCardGetDeviceTypeIdA(context, name, &type);
 
  662  if (rc != SCARD_S_SUCCESS)
 
  664    std::cerr << 
"SCardGetDeviceTypeIdA failed with " << err2str(rc) << std::endl;
 
  671static bool test_devicetype_id_w(SCARDCONTEXT context)
 
  674  LPWSTR name = L
"testdata";
 
  677  auto rc = SCardGetDeviceTypeIdW(context, name, &type);
 
  678  if (rc != SCARD_S_SUCCESS)
 
  680    std::cerr << 
"SCardGetDeviceTypeIdW failed with " << err2str(rc) << std::endl;
 
  687static bool test_transmitcount(SCARDHANDLE handle)
 
  690  LPWSTR name = L
"testdata";
 
  693  auto rc = SCardGetTransmitCount(handle, &count);
 
  694  if (rc != SCARD_S_SUCCESS)
 
  696    std::cerr << 
"SCardGetTransmitCount failed with " << err2str(rc) << std::endl;
 
  699  std::cout << 
"SCardGetTransmitCount() " << count << std::endl;
 
  703static bool test_status_a(SCARDHANDLE handle)
 
  706  LPWSTR name = L
"testdata";
 
  718static bool test_status_w(SCARDHANDLE handle)
 
  721  LPWSTR name = L
"testdata";
 
  733static bool test_get_attrib(SCARDCONTEXT context, SCARDHANDLE handle)
 
  735  DWORD attrlen = SCARD_AUTOALLOCATE;
 
  736  LPBYTE attr = 
nullptr;
 
  739      SCardGetAttrib(handle, SCARD_ATTR_ATR_STRING, 
reinterpret_cast<LPBYTE
>(&attr), &attrlen);
 
  740  if (rc != SCARD_S_SUCCESS)
 
  742    std::cerr << 
"SCardGetAttrib failed with " << err2str(rc) << std::endl;
 
  745  std::cout << 
"SCardGetAttrib [" << attrlen << 
"]: " << (
char*)attr << std::endl;
 
  746  SCardFreeMemory(context, attr);
 
  751static bool test_set_attrib(SCARDCONTEXT context, SCARDHANDLE handle)
 
  753  DWORD attrlen = SCARD_AUTOALLOCATE;
 
  754  BYTE attr[] = 
"0123456789";
 
  756  auto rc = SCardSetAttrib(handle, SCARD_ATTR_SUPRESS_T1_IFS_REQUEST, attr, ARRAYSIZE(attr));
 
  757  if (rc != SCARD_S_SUCCESS)
 
  759    std::cerr << 
"SCardSetAttrib failed with " << err2str(rc) << std::endl;
 
  762  std::cout << 
"SCardSetAttrib [" << attrlen << 
"]: " << (
char*)attr << std::endl;
 
  763  SCardFreeMemory(context, attr);
 
  770  std::cout << 
"Hello World!" << std::endl;
 
  773    auto scopes = { SCARD_SCOPE_USER, SCARD_SCOPE_SYSTEM };
 
  774    for (
auto scope : scopes)
 
  776      SCARDCONTEXT context;
 
  777      auto rc = SCardEstablishContext(scope, 
nullptr, 
nullptr, &context);
 
  778      if (rc != SCARD_S_SUCCESS)
 
  780        std::cerr << 
"SCardEstablishContext [" << scope2str(scope) << 
"] failed with " 
  781                  << err2str(rc) << std::endl;
 
  785        std::cerr << 
"SCardEstablishContext [" << scope2str(scope) << 
"] success" 
  790        test_list_reader_groups_a(context);
 
  791        test_list_reader_groups_w(context);
 
  793        test_list_readers_a(context);
 
  794        test_list_readers_w(context);
 
  796        test_list_cards_a(context);
 
  797        test_list_cards_w(context);
 
  799        test_introduce_forget_reader_groups_a(context);
 
  800        test_introduce_forget_reader_groups_w(context);
 
  802        test_introduce_forget_reader_a(context);
 
  803        test_introduce_forget_reader_w(context);
 
  806        test_locate_cards_a(context);
 
  807        test_locate_cards_w(context);
 
  809        test_locate_cards_by_atr_a(context);
 
  810        test_locate_cards_by_atr_w(context);
 
  812        test_cache_a(context);
 
  813        test_cache_w(context);
 
  815        test_reader_icon_a(context);
 
  816        test_reader_icon_w(context);
 
  818        test_devicetype_id_a(context);
 
  819        test_devicetype_id_w(context);
 
  829          SCARDHANDLE handle = 0;
 
  831          DWORD chReaders = SCARD_AUTOALLOCATE;
 
  833          LONG status = SCardListReadersA(
 
  834              context, 
nullptr, 
reinterpret_cast<LPSTR
>(&mszReaders), &chReaders);
 
  835          if (status == SCARD_S_SUCCESS)
 
  836            status = SCardConnectA(context, mszReaders, SCARD_SHARE_SHARED,
 
  837                                   SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1 |
 
  838                                       SCARD_PROTOCOL_Tx | SCARD_PROTOCOL_RAW,
 
  840          SCardFreeMemory(context, mszReaders);
 
  841          if (status != SCARD_S_SUCCESS)
 
  843            std::cerr << 
"SCardConnectA [" 
  844                      << 
"] failed with " << err2str(status) << std::endl;
 
  848            test_status_a(handle);
 
  849            test_status_w(handle);
 
  850            test_get_attrib(context, handle);
 
  851            test_set_attrib(context, handle);
 
  852            test_transmitcount(handle);
 
  854            status = SCardDisconnect(handle, 0);
 
  857              std::cerr << 
"SCardDisconnect [" 
  858                        << 
"] failed with " << err2str(status) << std::endl;
 
  864          SCARDHANDLE handle = 0;
 
  866          DWORD chReaders = SCARD_AUTOALLOCATE;
 
  868          LONG status = SCardListReadersW(
 
  869              context, 
nullptr, 
reinterpret_cast<LPWSTR
>(&mszReaders), &chReaders);
 
  870          if (status == SCARD_S_SUCCESS)
 
  871            status = SCardConnectW(context, mszReaders, SCARD_SHARE_SHARED,
 
  872                                   SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1 |
 
  873                                       SCARD_PROTOCOL_Tx | SCARD_PROTOCOL_RAW,
 
  875          SCardFreeMemory(context, mszReaders);
 
  877          if (status != SCARD_S_SUCCESS)
 
  879            std::cerr << 
"SCardConnectW [" 
  880                      << 
"] failed with " << err2str(status) << std::endl;
 
  884            test_status_a(handle);
 
  885            test_status_w(handle);
 
  886            test_get_attrib(context, handle);
 
  887            test_set_attrib(context, handle);
 
  888            test_transmitcount(handle);
 
  890            status = SCardDisconnect(handle, 0);
 
  893              std::cerr << 
"SCardDisconnect [" 
  894                        << 
"] failed with " << err2str(status) << std::endl;
 
  899        rc = SCardReleaseContext(context);
 
  900        if (rc != SCARD_S_SUCCESS)
 
  902          std::cerr << 
"SCardReleaseContext [" << scope2str(scope) << 
"] failed with " 
  903                    << err2str(rc) << std::endl;
 
  910    std::cerr << 
"exception!!!!" << std::endl;