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;