FreeRDP
Loading...
Searching...
No Matches
smartcard.c
1
22#include <winpr/config.h>
23
24#include <winpr/crt.h>
25#include <winpr/library.h>
26#include <winpr/smartcard.h>
27#include <winpr/synch.h>
28#include <winpr/wlog.h>
29#include <winpr/assert.h>
30
31#include "../log.h"
32
33#include "smartcard.h"
34
35#if defined(WITH_SMARTCARD_INSPECT)
36#include "smartcard_inspect.h"
37#endif
38
39static INIT_ONCE g_Initialized = INIT_ONCE_STATIC_INIT;
40static const SCardApiFunctionTable* g_SCardApi = nullptr;
41
42#define TAG WINPR_TAG("smartcard")
43
44#define xstr(s) str(s)
45#define str(s) #s
46
47#define SCARDAPI_STUB_CALL_LONG(_name, ...) \
48 if (!InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, nullptr, nullptr)) \
49 return SCARD_E_NO_SERVICE; \
50 if (!g_SCardApi || !g_SCardApi->pfn##_name) \
51 { \
52 WLog_DBG( \
53 TAG, "Missing function pointer g_SCardApi=%p->" xstr(pfn##_name) "=%p", \
54 WINPR_CXX_COMPAT_CAST(const void*, g_SCardApi), \
55 WINPR_CXX_COMPAT_CAST(const void*, g_SCardApi ? g_SCardApi->pfn##_name : nullptr)); \
56 return SCARD_E_NO_SERVICE; \
57 } \
58 return g_SCardApi->pfn##_name(__VA_ARGS__)
59
60#define SCARDAPI_STUB_CALL_HANDLE(_name) \
61 if (!InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, nullptr, nullptr)) \
62 return nullptr; \
63 if (!g_SCardApi || !g_SCardApi->pfn##_name) \
64 { \
65 WLog_DBG( \
66 TAG, "Missing function pointer g_SCardApi=%p->" xstr(pfn##_name) "=%p", \
67 WINPR_CXX_COMPAT_CAST(const void*, g_SCardApi), \
68 WINPR_CXX_COMPAT_CAST(const void*, g_SCardApi ? g_SCardApi->pfn##_name : nullptr)); \
69 return nullptr; \
70 } \
71 return g_SCardApi->pfn##_name()
72
73#define SCARDAPI_STUB_CALL_VOID(_name) \
74 if (!InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, nullptr, nullptr)) \
75 return; \
76 if (!g_SCardApi || !g_SCardApi->pfn##_name) \
77 { \
78 WLog_DBG( \
79 TAG, "Missing function pointer g_SCardApi=%p->" xstr(pfn##_name) "=%p", \
80 WINPR_CXX_COMPAT_CAST(const void*, g_SCardApi), \
81 WINPR_CXX_COMPAT_CAST(const void*, g_SCardApi ? g_SCardApi->pfn##_name : nullptr)); \
82 return; \
83 } \
84 g_SCardApi->pfn##_name()
85
90const SCARD_IO_REQUEST g_rgSCardT0Pci = { SCARD_PROTOCOL_T0, 8 };
91const SCARD_IO_REQUEST g_rgSCardT1Pci = { SCARD_PROTOCOL_T1, 8 };
92const SCARD_IO_REQUEST g_rgSCardRawPci = { SCARD_PROTOCOL_RAW, 8 };
93
94static BOOL CALLBACK InitializeSCardApiStubs(WINPR_ATTR_UNUSED PINIT_ONCE once,
95 WINPR_ATTR_UNUSED PVOID param,
96 WINPR_ATTR_UNUSED PVOID* context)
97{
98#ifdef _WIN32
99 if (Windows_InitializeSCardApi() >= 0)
100 g_SCardApi = Windows_GetSCardApiFunctionTable();
101#else
102#if defined(WITH_SMARTCARD_PCSC)
103 if (PCSC_InitializeSCardApi() >= 0)
104 g_SCardApi = PCSC_GetSCardApiFunctionTable();
105#endif
106#endif
107
108#if defined(WITH_SMARTCARD_INSPECT)
109 g_SCardApi = Inspect_RegisterSCardApi(g_SCardApi);
110#endif
111 return TRUE;
112}
113
114WINSCARDAPI LONG WINAPI SCardEstablishContext(DWORD dwScope, LPCVOID pvReserved1,
115 LPCVOID pvReserved2, LPSCARDCONTEXT phContext)
116{
117 SCARDAPI_STUB_CALL_LONG(SCardEstablishContext, dwScope, pvReserved1, pvReserved2, phContext);
118}
119
120WINSCARDAPI LONG WINAPI SCardReleaseContext(SCARDCONTEXT hContext)
121{
122 SCARDAPI_STUB_CALL_LONG(SCardReleaseContext, hContext);
123}
124
125WINSCARDAPI LONG WINAPI SCardIsValidContext(SCARDCONTEXT hContext)
126{
127 SCARDAPI_STUB_CALL_LONG(SCardIsValidContext, hContext);
128}
129
130WINSCARDAPI LONG WINAPI SCardListReaderGroupsA(SCARDCONTEXT hContext, LPSTR mszGroups,
131 LPDWORD pcchGroups)
132{
133 SCARDAPI_STUB_CALL_LONG(SCardListReaderGroupsA, hContext, mszGroups, pcchGroups);
134}
135
136WINSCARDAPI LONG WINAPI SCardListReaderGroupsW(SCARDCONTEXT hContext, LPWSTR mszGroups,
137 LPDWORD pcchGroups)
138{
139 SCARDAPI_STUB_CALL_LONG(SCardListReaderGroupsW, hContext, mszGroups, pcchGroups);
140}
141
142WINSCARDAPI LONG WINAPI SCardListReadersA(SCARDCONTEXT hContext, LPCSTR mszGroups, LPSTR mszReaders,
143 LPDWORD pcchReaders)
144{
145 SCARDAPI_STUB_CALL_LONG(SCardListReadersA, hContext, mszGroups, mszReaders, pcchReaders);
146}
147
148WINSCARDAPI LONG WINAPI SCardListReadersW(SCARDCONTEXT hContext, LPCWSTR mszGroups,
149 LPWSTR mszReaders, LPDWORD pcchReaders)
150{
151 SCARDAPI_STUB_CALL_LONG(SCardListReadersW, hContext, mszGroups, mszReaders, pcchReaders);
152}
153
154WINSCARDAPI LONG WINAPI SCardListCardsA(SCARDCONTEXT hContext, LPCBYTE pbAtr,
155 LPCGUID rgquidInterfaces, DWORD cguidInterfaceCount,
156 CHAR* mszCards, LPDWORD pcchCards)
157{
158 SCARDAPI_STUB_CALL_LONG(SCardListCardsA, hContext, pbAtr, rgquidInterfaces, cguidInterfaceCount,
159 mszCards, pcchCards);
160}
161
162WINSCARDAPI LONG WINAPI SCardListCardsW(SCARDCONTEXT hContext, LPCBYTE pbAtr,
163 LPCGUID rgquidInterfaces, DWORD cguidInterfaceCount,
164 WCHAR* mszCards, LPDWORD pcchCards)
165{
166 SCARDAPI_STUB_CALL_LONG(SCardListCardsW, hContext, pbAtr, rgquidInterfaces, cguidInterfaceCount,
167 mszCards, pcchCards);
168}
169
170WINSCARDAPI LONG WINAPI SCardListInterfacesA(SCARDCONTEXT hContext, LPCSTR szCard,
171 LPGUID pguidInterfaces, LPDWORD pcguidInterfaces)
172{
173 SCARDAPI_STUB_CALL_LONG(SCardListInterfacesA, hContext, szCard, pguidInterfaces,
174 pcguidInterfaces);
175}
176
177WINSCARDAPI LONG WINAPI SCardListInterfacesW(SCARDCONTEXT hContext, LPCWSTR szCard,
178 LPGUID pguidInterfaces, LPDWORD pcguidInterfaces)
179{
180 SCARDAPI_STUB_CALL_LONG(SCardListInterfacesW, hContext, szCard, pguidInterfaces,
181 pcguidInterfaces);
182}
183
184WINSCARDAPI LONG WINAPI SCardGetProviderIdA(SCARDCONTEXT hContext, LPCSTR szCard,
185 LPGUID pguidProviderId)
186{
187 SCARDAPI_STUB_CALL_LONG(SCardGetProviderIdA, hContext, szCard, pguidProviderId);
188}
189
190WINSCARDAPI LONG WINAPI SCardGetProviderIdW(SCARDCONTEXT hContext, LPCWSTR szCard,
191 LPGUID pguidProviderId)
192{
193 SCARDAPI_STUB_CALL_LONG(SCardGetProviderIdW, hContext, szCard, pguidProviderId);
194}
195
196WINSCARDAPI LONG WINAPI SCardGetCardTypeProviderNameA(SCARDCONTEXT hContext, LPCSTR szCardName,
197 DWORD dwProviderId, CHAR* szProvider,
198 LPDWORD pcchProvider)
199{
200 SCARDAPI_STUB_CALL_LONG(SCardGetCardTypeProviderNameA, hContext, szCardName, dwProviderId,
201 szProvider, pcchProvider);
202}
203
204WINSCARDAPI LONG WINAPI SCardGetCardTypeProviderNameW(SCARDCONTEXT hContext, LPCWSTR szCardName,
205 DWORD dwProviderId, WCHAR* szProvider,
206 LPDWORD pcchProvider)
207{
208 SCARDAPI_STUB_CALL_LONG(SCardGetCardTypeProviderNameW, hContext, szCardName, dwProviderId,
209 szProvider, pcchProvider);
210}
211
212WINSCARDAPI LONG WINAPI SCardIntroduceReaderGroupA(SCARDCONTEXT hContext, LPCSTR szGroupName)
213{
214 SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderGroupA, hContext, szGroupName);
215}
216
217WINSCARDAPI LONG WINAPI SCardIntroduceReaderGroupW(SCARDCONTEXT hContext, LPCWSTR szGroupName)
218{
219 SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderGroupW, hContext, szGroupName);
220}
221
222WINSCARDAPI LONG WINAPI SCardForgetReaderGroupA(SCARDCONTEXT hContext, LPCSTR szGroupName)
223{
224 SCARDAPI_STUB_CALL_LONG(SCardForgetReaderGroupA, hContext, szGroupName);
225}
226
227WINSCARDAPI LONG WINAPI SCardForgetReaderGroupW(SCARDCONTEXT hContext, LPCWSTR szGroupName)
228{
229 SCARDAPI_STUB_CALL_LONG(SCardForgetReaderGroupW, hContext, szGroupName);
230}
231
232WINSCARDAPI LONG WINAPI SCardIntroduceReaderA(SCARDCONTEXT hContext, LPCSTR szReaderName,
233 LPCSTR szDeviceName)
234{
235 SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderA, hContext, szReaderName, szDeviceName);
236}
237
238WINSCARDAPI LONG WINAPI SCardIntroduceReaderW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
239 LPCWSTR szDeviceName)
240{
241 SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderW, hContext, szReaderName, szDeviceName);
242}
243
244WINSCARDAPI LONG WINAPI SCardForgetReaderA(SCARDCONTEXT hContext, LPCSTR szReaderName)
245{
246 SCARDAPI_STUB_CALL_LONG(SCardForgetReaderA, hContext, szReaderName);
247}
248
249WINSCARDAPI LONG WINAPI SCardForgetReaderW(SCARDCONTEXT hContext, LPCWSTR szReaderName)
250{
251 SCARDAPI_STUB_CALL_LONG(SCardForgetReaderW, hContext, szReaderName);
252}
253
254WINSCARDAPI LONG WINAPI SCardAddReaderToGroupA(SCARDCONTEXT hContext, LPCSTR szReaderName,
255 LPCSTR szGroupName)
256{
257 SCARDAPI_STUB_CALL_LONG(SCardAddReaderToGroupA, hContext, szReaderName, szGroupName);
258}
259
260WINSCARDAPI LONG WINAPI SCardAddReaderToGroupW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
261 LPCWSTR szGroupName)
262{
263 SCARDAPI_STUB_CALL_LONG(SCardAddReaderToGroupW, hContext, szReaderName, szGroupName);
264}
265
266WINSCARDAPI LONG WINAPI SCardRemoveReaderFromGroupA(SCARDCONTEXT hContext, LPCSTR szReaderName,
267 LPCSTR szGroupName)
268{
269 SCARDAPI_STUB_CALL_LONG(SCardRemoveReaderFromGroupA, hContext, szReaderName, szGroupName);
270}
271
272WINSCARDAPI LONG WINAPI SCardRemoveReaderFromGroupW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
273 LPCWSTR szGroupName)
274{
275 SCARDAPI_STUB_CALL_LONG(SCardRemoveReaderFromGroupW, hContext, szReaderName, szGroupName);
276}
277
278WINSCARDAPI LONG WINAPI SCardIntroduceCardTypeA(SCARDCONTEXT hContext, LPCSTR szCardName,
279 LPCGUID pguidPrimaryProvider,
280 LPCGUID rgguidInterfaces, DWORD dwInterfaceCount,
281 LPCBYTE pbAtr, LPCBYTE pbAtrMask, DWORD cbAtrLen)
282{
283 SCARDAPI_STUB_CALL_LONG(SCardIntroduceCardTypeA, hContext, szCardName, pguidPrimaryProvider,
284 rgguidInterfaces, dwInterfaceCount, pbAtr, pbAtrMask, cbAtrLen);
285}
286
287WINSCARDAPI LONG WINAPI SCardIntroduceCardTypeW(SCARDCONTEXT hContext, LPCWSTR szCardName,
288 LPCGUID pguidPrimaryProvider,
289 LPCGUID rgguidInterfaces, DWORD dwInterfaceCount,
290 LPCBYTE pbAtr, LPCBYTE pbAtrMask, DWORD cbAtrLen)
291{
292 SCARDAPI_STUB_CALL_LONG(SCardIntroduceCardTypeW, hContext, szCardName, pguidPrimaryProvider,
293 rgguidInterfaces, dwInterfaceCount, pbAtr, pbAtrMask, cbAtrLen);
294}
295
296WINSCARDAPI LONG WINAPI SCardSetCardTypeProviderNameA(SCARDCONTEXT hContext, LPCSTR szCardName,
297 DWORD dwProviderId, LPCSTR szProvider)
298{
299 SCARDAPI_STUB_CALL_LONG(SCardSetCardTypeProviderNameA, hContext, szCardName, dwProviderId,
300 szProvider);
301}
302
303WINSCARDAPI LONG WINAPI SCardSetCardTypeProviderNameW(SCARDCONTEXT hContext, LPCWSTR szCardName,
304 DWORD dwProviderId, LPCWSTR szProvider)
305{
306 SCARDAPI_STUB_CALL_LONG(SCardSetCardTypeProviderNameW, hContext, szCardName, dwProviderId,
307 szProvider);
308}
309
310WINSCARDAPI LONG WINAPI SCardForgetCardTypeA(SCARDCONTEXT hContext, LPCSTR szCardName)
311{
312 SCARDAPI_STUB_CALL_LONG(SCardForgetCardTypeA, hContext, szCardName);
313}
314
315WINSCARDAPI LONG WINAPI SCardForgetCardTypeW(SCARDCONTEXT hContext, LPCWSTR szCardName)
316{
317 SCARDAPI_STUB_CALL_LONG(SCardForgetCardTypeW, hContext, szCardName);
318}
319
320WINSCARDAPI LONG WINAPI SCardFreeMemory(SCARDCONTEXT hContext, LPVOID pvMem)
321{
322 SCARDAPI_STUB_CALL_LONG(SCardFreeMemory, hContext, pvMem);
323}
324
325WINSCARDAPI HANDLE WINAPI SCardAccessStartedEvent(void)
326{
327 SCARDAPI_STUB_CALL_HANDLE(SCardAccessStartedEvent);
328}
329
330WINSCARDAPI void WINAPI SCardReleaseStartedEvent(void)
331{
332 SCARDAPI_STUB_CALL_VOID(SCardReleaseStartedEvent);
333}
334
335WINSCARDAPI LONG WINAPI SCardLocateCardsA(SCARDCONTEXT hContext, LPCSTR mszCards,
336 LPSCARD_READERSTATEA rgReaderStates, DWORD cReaders)
337{
338 SCARDAPI_STUB_CALL_LONG(SCardLocateCardsA, hContext, mszCards, rgReaderStates, cReaders);
339}
340
341WINSCARDAPI LONG WINAPI SCardLocateCardsW(SCARDCONTEXT hContext, LPCWSTR mszCards,
342 LPSCARD_READERSTATEW rgReaderStates, DWORD cReaders)
343{
344 SCARDAPI_STUB_CALL_LONG(SCardLocateCardsW, hContext, mszCards, rgReaderStates, cReaders);
345}
346
347WINSCARDAPI LONG WINAPI SCardLocateCardsByATRA(SCARDCONTEXT hContext, LPSCARD_ATRMASK rgAtrMasks,
348 DWORD cAtrs, LPSCARD_READERSTATEA rgReaderStates,
349 DWORD cReaders)
350{
351 SCARDAPI_STUB_CALL_LONG(SCardLocateCardsByATRA, hContext, rgAtrMasks, cAtrs, rgReaderStates,
352 cReaders);
353}
354
355WINSCARDAPI LONG WINAPI SCardLocateCardsByATRW(SCARDCONTEXT hContext, LPSCARD_ATRMASK rgAtrMasks,
356 DWORD cAtrs, LPSCARD_READERSTATEW rgReaderStates,
357 DWORD cReaders)
358{
359 SCARDAPI_STUB_CALL_LONG(SCardLocateCardsByATRW, hContext, rgAtrMasks, cAtrs, rgReaderStates,
360 cReaders);
361}
362
363WINSCARDAPI LONG WINAPI SCardGetStatusChangeA(SCARDCONTEXT hContext, DWORD dwTimeout,
364 LPSCARD_READERSTATEA rgReaderStates, DWORD cReaders)
365{
366 SCARDAPI_STUB_CALL_LONG(SCardGetStatusChangeA, hContext, dwTimeout, rgReaderStates, cReaders);
367}
368
369WINSCARDAPI LONG WINAPI SCardGetStatusChangeW(SCARDCONTEXT hContext, DWORD dwTimeout,
370 LPSCARD_READERSTATEW rgReaderStates, DWORD cReaders)
371{
372 SCARDAPI_STUB_CALL_LONG(SCardGetStatusChangeW, hContext, dwTimeout, rgReaderStates, cReaders);
373}
374
375WINSCARDAPI LONG WINAPI SCardCancel(SCARDCONTEXT hContext)
376{
377 SCARDAPI_STUB_CALL_LONG(SCardCancel, hContext);
378}
379
380WINSCARDAPI LONG WINAPI SCardConnectA(SCARDCONTEXT hContext, LPCSTR szReader, DWORD dwShareMode,
381 DWORD dwPreferredProtocols, LPSCARDHANDLE phCard,
382 LPDWORD pdwActiveProtocol)
383{
384 SCARDAPI_STUB_CALL_LONG(SCardConnectA, hContext, szReader, dwShareMode, dwPreferredProtocols,
385 phCard, pdwActiveProtocol);
386}
387
388WINSCARDAPI LONG WINAPI SCardConnectW(SCARDCONTEXT hContext, LPCWSTR szReader, DWORD dwShareMode,
389 DWORD dwPreferredProtocols, LPSCARDHANDLE phCard,
390 LPDWORD pdwActiveProtocol)
391{
392 SCARDAPI_STUB_CALL_LONG(SCardConnectW, hContext, szReader, dwShareMode, dwPreferredProtocols,
393 phCard, pdwActiveProtocol);
394}
395
396WINSCARDAPI LONG WINAPI SCardReconnect(SCARDHANDLE hCard, DWORD dwShareMode,
397 DWORD dwPreferredProtocols, DWORD dwInitialization,
398 LPDWORD pdwActiveProtocol)
399{
400 SCARDAPI_STUB_CALL_LONG(SCardReconnect, hCard, dwShareMode, dwPreferredProtocols,
401 dwInitialization, pdwActiveProtocol);
402}
403
404WINSCARDAPI LONG WINAPI SCardDisconnect(SCARDHANDLE hCard, DWORD dwDisposition)
405{
406 SCARDAPI_STUB_CALL_LONG(SCardDisconnect, hCard, dwDisposition);
407}
408
409WINSCARDAPI LONG WINAPI SCardBeginTransaction(SCARDHANDLE hCard)
410{
411 SCARDAPI_STUB_CALL_LONG(SCardBeginTransaction, hCard);
412}
413
414WINSCARDAPI LONG WINAPI SCardEndTransaction(SCARDHANDLE hCard, DWORD dwDisposition)
415{
416 SCARDAPI_STUB_CALL_LONG(SCardEndTransaction, hCard, dwDisposition);
417}
418
419WINSCARDAPI LONG WINAPI SCardCancelTransaction(SCARDHANDLE hCard)
420{
421 SCARDAPI_STUB_CALL_LONG(SCardCancelTransaction, hCard);
422}
423
424WINSCARDAPI LONG WINAPI SCardState(SCARDHANDLE hCard, LPDWORD pdwState, LPDWORD pdwProtocol,
425 LPBYTE pbAtr, LPDWORD pcbAtrLen)
426{
427 SCARDAPI_STUB_CALL_LONG(SCardState, hCard, pdwState, pdwProtocol, pbAtr, pcbAtrLen);
428}
429
430WINSCARDAPI LONG WINAPI SCardStatusA(SCARDHANDLE hCard, LPSTR mszReaderNames, LPDWORD pcchReaderLen,
431 LPDWORD pdwState, LPDWORD pdwProtocol, LPBYTE pbAtr,
432 LPDWORD pcbAtrLen)
433{
434 SCARDAPI_STUB_CALL_LONG(SCardStatusA, hCard, mszReaderNames, pcchReaderLen, pdwState,
435 pdwProtocol, pbAtr, pcbAtrLen);
436}
437
438WINSCARDAPI LONG WINAPI SCardStatusW(SCARDHANDLE hCard, LPWSTR mszReaderNames,
439 LPDWORD pcchReaderLen, LPDWORD pdwState, LPDWORD pdwProtocol,
440 LPBYTE pbAtr, LPDWORD pcbAtrLen)
441{
442 SCARDAPI_STUB_CALL_LONG(SCardStatusW, hCard, mszReaderNames, pcchReaderLen, pdwState,
443 pdwProtocol, pbAtr, pcbAtrLen);
444}
445
446WINSCARDAPI LONG WINAPI SCardTransmit(SCARDHANDLE hCard, LPCSCARD_IO_REQUEST pioSendPci,
447 LPCBYTE pbSendBuffer, DWORD cbSendLength,
448 LPSCARD_IO_REQUEST pioRecvPci, LPBYTE pbRecvBuffer,
449 LPDWORD pcbRecvLength)
450{
451 SCARDAPI_STUB_CALL_LONG(SCardTransmit, hCard, pioSendPci, pbSendBuffer, cbSendLength,
452 pioRecvPci, pbRecvBuffer, pcbRecvLength);
453}
454
455WINSCARDAPI LONG WINAPI SCardGetTransmitCount(SCARDHANDLE hCard, LPDWORD pcTransmitCount)
456{
457 SCARDAPI_STUB_CALL_LONG(SCardGetTransmitCount, hCard, pcTransmitCount);
458}
459
460WINSCARDAPI LONG WINAPI SCardControl(SCARDHANDLE hCard, DWORD dwControlCode, LPCVOID lpInBuffer,
461 DWORD cbInBufferSize, LPVOID lpOutBuffer,
462 DWORD cbOutBufferSize, LPDWORD lpBytesReturned)
463{
464 SCARDAPI_STUB_CALL_LONG(SCardControl, hCard, dwControlCode, lpInBuffer, cbInBufferSize,
465 lpOutBuffer, cbOutBufferSize, lpBytesReturned);
466}
467
468WINSCARDAPI LONG WINAPI SCardGetAttrib(SCARDHANDLE hCard, DWORD dwAttrId, LPBYTE pbAttr,
469 LPDWORD pcbAttrLen)
470{
471 SCARDAPI_STUB_CALL_LONG(SCardGetAttrib, hCard, dwAttrId, pbAttr, pcbAttrLen);
472}
473
474WINSCARDAPI LONG WINAPI SCardSetAttrib(SCARDHANDLE hCard, DWORD dwAttrId, LPCBYTE pbAttr,
475 DWORD cbAttrLen)
476{
477 SCARDAPI_STUB_CALL_LONG(SCardSetAttrib, hCard, dwAttrId, pbAttr, cbAttrLen);
478}
479
480WINSCARDAPI LONG WINAPI SCardUIDlgSelectCardA(LPOPENCARDNAMEA_EX pDlgStruc)
481{
482 SCARDAPI_STUB_CALL_LONG(SCardUIDlgSelectCardA, pDlgStruc);
483}
484
485WINSCARDAPI LONG WINAPI SCardUIDlgSelectCardW(LPOPENCARDNAMEW_EX pDlgStruc)
486{
487 SCARDAPI_STUB_CALL_LONG(SCardUIDlgSelectCardW, pDlgStruc);
488}
489
490WINSCARDAPI LONG WINAPI GetOpenCardNameA(LPOPENCARDNAMEA pDlgStruc)
491{
492 SCARDAPI_STUB_CALL_LONG(GetOpenCardNameA, pDlgStruc);
493}
494
495WINSCARDAPI LONG WINAPI GetOpenCardNameW(LPOPENCARDNAMEW pDlgStruc)
496{
497 SCARDAPI_STUB_CALL_LONG(GetOpenCardNameW, pDlgStruc);
498}
499
500WINSCARDAPI LONG WINAPI SCardDlgExtendedError(void)
501{
502 SCARDAPI_STUB_CALL_LONG(SCardDlgExtendedError);
503}
504
505WINSCARDAPI LONG WINAPI SCardReadCacheA(SCARDCONTEXT hContext, UUID* CardIdentifier,
506 DWORD FreshnessCounter, LPSTR LookupName, PBYTE Data,
507 DWORD* DataLen)
508{
509 SCARDAPI_STUB_CALL_LONG(SCardReadCacheA, hContext, CardIdentifier, FreshnessCounter, LookupName,
510 Data, DataLen);
511}
512
513WINSCARDAPI LONG WINAPI SCardReadCacheW(SCARDCONTEXT hContext, UUID* CardIdentifier,
514 DWORD FreshnessCounter, LPWSTR LookupName, PBYTE Data,
515 DWORD* DataLen)
516{
517 SCARDAPI_STUB_CALL_LONG(SCardReadCacheW, hContext, CardIdentifier, FreshnessCounter, LookupName,
518 Data, DataLen);
519}
520
521WINSCARDAPI LONG WINAPI SCardWriteCacheA(SCARDCONTEXT hContext, UUID* CardIdentifier,
522 DWORD FreshnessCounter, LPSTR LookupName, PBYTE Data,
523 DWORD DataLen)
524{
525 SCARDAPI_STUB_CALL_LONG(SCardWriteCacheA, hContext, CardIdentifier, FreshnessCounter,
526 LookupName, Data, DataLen);
527}
528
529WINSCARDAPI LONG WINAPI SCardWriteCacheW(SCARDCONTEXT hContext, UUID* CardIdentifier,
530 DWORD FreshnessCounter, LPWSTR LookupName, PBYTE Data,
531 DWORD DataLen)
532{
533 SCARDAPI_STUB_CALL_LONG(SCardWriteCacheW, hContext, CardIdentifier, FreshnessCounter,
534 LookupName, Data, DataLen);
535}
536
537WINSCARDAPI LONG WINAPI SCardGetReaderIconA(SCARDCONTEXT hContext, LPCSTR szReaderName,
538 LPBYTE pbIcon, LPDWORD pcbIcon)
539{
540 SCARDAPI_STUB_CALL_LONG(SCardGetReaderIconA, hContext, szReaderName, pbIcon, pcbIcon);
541}
542
543WINSCARDAPI LONG WINAPI SCardGetReaderIconW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
544 LPBYTE pbIcon, LPDWORD pcbIcon)
545{
546 SCARDAPI_STUB_CALL_LONG(SCardGetReaderIconW, hContext, szReaderName, pbIcon, pcbIcon);
547}
548
549WINSCARDAPI LONG WINAPI SCardGetDeviceTypeIdA(SCARDCONTEXT hContext, LPCSTR szReaderName,
550 LPDWORD pdwDeviceTypeId)
551{
552 SCARDAPI_STUB_CALL_LONG(SCardGetDeviceTypeIdA, hContext, szReaderName, pdwDeviceTypeId);
553}
554
555WINSCARDAPI LONG WINAPI SCardGetDeviceTypeIdW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
556 LPDWORD pdwDeviceTypeId)
557{
558 SCARDAPI_STUB_CALL_LONG(SCardGetDeviceTypeIdW, hContext, szReaderName, pdwDeviceTypeId);
559}
560
561WINSCARDAPI LONG WINAPI SCardGetReaderDeviceInstanceIdA(SCARDCONTEXT hContext, LPCSTR szReaderName,
562 LPSTR szDeviceInstanceId,
563 LPDWORD pcchDeviceInstanceId)
564{
565 SCARDAPI_STUB_CALL_LONG(SCardGetReaderDeviceInstanceIdA, hContext, szReaderName,
566 szDeviceInstanceId, pcchDeviceInstanceId);
567}
568
569WINSCARDAPI LONG WINAPI SCardGetReaderDeviceInstanceIdW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
570 LPWSTR szDeviceInstanceId,
571 LPDWORD pcchDeviceInstanceId)
572{
573 SCARDAPI_STUB_CALL_LONG(SCardGetReaderDeviceInstanceIdW, hContext, szReaderName,
574 szDeviceInstanceId, pcchDeviceInstanceId);
575}
576
577WINSCARDAPI LONG WINAPI SCardListReadersWithDeviceInstanceIdA(SCARDCONTEXT hContext,
578 LPCSTR szDeviceInstanceId,
579 LPSTR mszReaders, LPDWORD pcchReaders)
580{
581 SCARDAPI_STUB_CALL_LONG(SCardListReadersWithDeviceInstanceIdA, hContext, szDeviceInstanceId,
582 mszReaders, pcchReaders);
583}
584
585WINSCARDAPI LONG WINAPI SCardListReadersWithDeviceInstanceIdW(SCARDCONTEXT hContext,
586 LPCWSTR szDeviceInstanceId,
587 LPWSTR mszReaders,
588 LPDWORD pcchReaders)
589{
590 SCARDAPI_STUB_CALL_LONG(SCardListReadersWithDeviceInstanceIdW, hContext, szDeviceInstanceId,
591 mszReaders, pcchReaders);
592}
593
594WINSCARDAPI LONG WINAPI SCardAudit(SCARDCONTEXT hContext, DWORD dwEvent)
595{
596 SCARDAPI_STUB_CALL_LONG(SCardAudit, hContext, dwEvent);
597}
598
603WINSCARDAPI const char* WINAPI SCardGetErrorString(LONG errorCode)
604{
605 switch (errorCode)
606 {
607 case SCARD_S_SUCCESS:
608 return "SCARD_S_SUCCESS";
609
610 case SCARD_F_INTERNAL_ERROR:
611 return "SCARD_F_INTERNAL_ERROR";
612
613 case SCARD_E_CANCELLED:
614 return "SCARD_E_CANCELLED";
615
616 case SCARD_E_INVALID_HANDLE:
617 return "SCARD_E_INVALID_HANDLE";
618
619 case SCARD_E_INVALID_PARAMETER:
620 return "SCARD_E_INVALID_PARAMETER";
621
622 case SCARD_E_INVALID_TARGET:
623 return "SCARD_E_INVALID_TARGET";
624
625 case SCARD_E_NO_MEMORY:
626 return "SCARD_E_NO_MEMORY";
627
628 case SCARD_F_WAITED_TOO_LONG:
629 return "SCARD_F_WAITED_TOO_LONG";
630
631 case SCARD_E_INSUFFICIENT_BUFFER:
632 return "SCARD_E_INSUFFICIENT_BUFFER";
633
634 case SCARD_E_UNKNOWN_READER:
635 return "SCARD_E_UNKNOWN_READER";
636
637 case SCARD_E_TIMEOUT:
638 return "SCARD_E_TIMEOUT";
639
640 case SCARD_E_SHARING_VIOLATION:
641 return "SCARD_E_SHARING_VIOLATION";
642
643 case SCARD_E_NO_SMARTCARD:
644 return "SCARD_E_NO_SMARTCARD";
645
646 case SCARD_E_UNKNOWN_CARD:
647 return "SCARD_E_UNKNOWN_CARD";
648
649 case SCARD_E_CANT_DISPOSE:
650 return "SCARD_E_CANT_DISPOSE";
651
652 case SCARD_E_PROTO_MISMATCH:
653 return "SCARD_E_PROTO_MISMATCH";
654
655 case SCARD_E_NOT_READY:
656 return "SCARD_E_NOT_READY";
657
658 case SCARD_E_INVALID_VALUE:
659 return "SCARD_E_INVALID_VALUE";
660
661 case SCARD_E_SYSTEM_CANCELLED:
662 return "SCARD_E_SYSTEM_CANCELLED";
663
664 case SCARD_F_COMM_ERROR:
665 return "SCARD_F_COMM_ERROR";
666
667 case SCARD_F_UNKNOWN_ERROR:
668 return "SCARD_F_UNKNOWN_ERROR";
669
670 case SCARD_E_INVALID_ATR:
671 return "SCARD_E_INVALID_ATR";
672
673 case SCARD_E_NOT_TRANSACTED:
674 return "SCARD_E_NOT_TRANSACTED";
675
676 case SCARD_E_READER_UNAVAILABLE:
677 return "SCARD_E_READER_UNAVAILABLE";
678
679 case SCARD_P_SHUTDOWN:
680 return "SCARD_P_SHUTDOWN";
681
682 case SCARD_E_PCI_TOO_SMALL:
683 return "SCARD_E_PCI_TOO_SMALL";
684
685 case SCARD_E_READER_UNSUPPORTED:
686 return "SCARD_E_READER_UNSUPPORTED";
687
688 case SCARD_E_DUPLICATE_READER:
689 return "SCARD_E_DUPLICATE_READER";
690
691 case SCARD_E_CARD_UNSUPPORTED:
692 return "SCARD_E_CARD_UNSUPPORTED";
693
694 case SCARD_E_NO_SERVICE:
695 return "SCARD_E_NO_SERVICE";
696
697 case SCARD_E_SERVICE_STOPPED:
698 return "SCARD_E_SERVICE_STOPPED";
699
700 case SCARD_E_UNEXPECTED:
701 return "SCARD_E_UNEXPECTED";
702
703 case SCARD_E_ICC_INSTALLATION:
704 return "SCARD_E_ICC_INSTALLATION";
705
706 case SCARD_E_ICC_CREATEORDER:
707 return "SCARD_E_ICC_CREATEORDER";
708
709 case SCARD_E_UNSUPPORTED_FEATURE:
710 return "SCARD_E_UNSUPPORTED_FEATURE";
711
712 case SCARD_E_DIR_NOT_FOUND:
713 return "SCARD_E_DIR_NOT_FOUND";
714
715 case SCARD_E_FILE_NOT_FOUND:
716 return "SCARD_E_FILE_NOT_FOUND";
717
718 case SCARD_E_NO_DIR:
719 return "SCARD_E_NO_DIR";
720
721 case SCARD_E_NO_FILE:
722 return "SCARD_E_NO_FILE";
723
724 case SCARD_E_NO_ACCESS:
725 return "SCARD_E_NO_ACCESS";
726
727 case SCARD_E_WRITE_TOO_MANY:
728 return "SCARD_E_WRITE_TOO_MANY";
729
730 case SCARD_E_BAD_SEEK:
731 return "SCARD_E_BAD_SEEK";
732
733 case SCARD_E_INVALID_CHV:
734 return "SCARD_E_INVALID_CHV";
735
736 case SCARD_E_UNKNOWN_RES_MNG:
737 return "SCARD_E_UNKNOWN_RES_MNG";
738
739 case SCARD_E_NO_SUCH_CERTIFICATE:
740 return "SCARD_E_NO_SUCH_CERTIFICATE";
741
742 case SCARD_E_CERTIFICATE_UNAVAILABLE:
743 return "SCARD_E_CERTIFICATE_UNAVAILABLE";
744
745 case SCARD_E_NO_READERS_AVAILABLE:
746 return "SCARD_E_NO_READERS_AVAILABLE";
747
748 case SCARD_E_COMM_DATA_LOST:
749 return "SCARD_E_COMM_DATA_LOST";
750
751 case SCARD_E_NO_KEY_CONTAINER:
752 return "SCARD_E_NO_KEY_CONTAINER";
753
754 case SCARD_E_SERVER_TOO_BUSY:
755 return "SCARD_E_SERVER_TOO_BUSY";
756
757 case SCARD_E_PIN_CACHE_EXPIRED:
758 return "SCARD_E_PIN_CACHE_EXPIRED";
759
760 case SCARD_E_NO_PIN_CACHE:
761 return "SCARD_E_NO_PIN_CACHE";
762
763 case SCARD_E_READ_ONLY_CARD:
764 return "SCARD_E_READ_ONLY_CARD";
765
766 case SCARD_W_UNSUPPORTED_CARD:
767 return "SCARD_W_UNSUPPORTED_CARD";
768
769 case SCARD_W_UNRESPONSIVE_CARD:
770 return "SCARD_W_UNRESPONSIVE_CARD";
771
772 case SCARD_W_UNPOWERED_CARD:
773 return "SCARD_W_UNPOWERED_CARD";
774
775 case SCARD_W_RESET_CARD:
776 return "SCARD_W_RESET_CARD";
777
778 case SCARD_W_REMOVED_CARD:
779 return "SCARD_W_REMOVED_CARD";
780
781 case SCARD_W_SECURITY_VIOLATION:
782 return "SCARD_W_SECURITY_VIOLATION";
783
784 case SCARD_W_WRONG_CHV:
785 return "SCARD_W_WRONG_CHV";
786
787 case SCARD_W_CHV_BLOCKED:
788 return "SCARD_W_CHV_BLOCKED";
789
790 case SCARD_W_EOF:
791 return "SCARD_W_EOF";
792
793 case SCARD_W_CANCELLED_BY_USER:
794 return "SCARD_W_CANCELLED_BY_USER";
795
796 case SCARD_W_CARD_NOT_AUTHENTICATED:
797 return "SCARD_W_CARD_NOT_AUTHENTICATED";
798
799 case SCARD_W_CACHE_ITEM_NOT_FOUND:
800 return "SCARD_W_CACHE_ITEM_NOT_FOUND";
801
802 case SCARD_W_CACHE_ITEM_STALE:
803 return "SCARD_W_CACHE_ITEM_STALE";
804
805 case SCARD_W_CACHE_ITEM_TOO_BIG:
806 return "SCARD_W_CACHE_ITEM_TOO_BIG";
807
808 default:
809 return "SCARD_E_UNKNOWN";
810 }
811}
812
813WINSCARDAPI const char* WINAPI SCardGetAttributeString(DWORD dwAttrId)
814{
815 switch (dwAttrId)
816 {
817 case SCARD_ATTR_VENDOR_NAME:
818 return "SCARD_ATTR_VENDOR_NAME";
819
820 case SCARD_ATTR_VENDOR_IFD_TYPE:
821 return "SCARD_ATTR_VENDOR_IFD_TYPE";
822
823 case SCARD_ATTR_VENDOR_IFD_VERSION:
824 return "SCARD_ATTR_VENDOR_IFD_VERSION";
825
826 case SCARD_ATTR_VENDOR_IFD_SERIAL_NO:
827 return "SCARD_ATTR_VENDOR_IFD_SERIAL_NO";
828
829 case SCARD_ATTR_CHANNEL_ID:
830 return "SCARD_ATTR_CHANNEL_ID";
831
832 case SCARD_ATTR_PROTOCOL_TYPES:
833 return "SCARD_ATTR_PROTOCOL_TYPES";
834
835 case SCARD_ATTR_DEFAULT_CLK:
836 return "SCARD_ATTR_DEFAULT_CLK";
837
838 case SCARD_ATTR_MAX_CLK:
839 return "SCARD_ATTR_MAX_CLK";
840
841 case SCARD_ATTR_DEFAULT_DATA_RATE:
842 return "SCARD_ATTR_DEFAULT_DATA_RATE";
843
844 case SCARD_ATTR_MAX_DATA_RATE:
845 return "SCARD_ATTR_MAX_DATA_RATE";
846
847 case SCARD_ATTR_MAX_IFSD:
848 return "SCARD_ATTR_MAX_IFSD";
849
850 case SCARD_ATTR_POWER_MGMT_SUPPORT:
851 return "SCARD_ATTR_POWER_MGMT_SUPPORT";
852
853 case SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE:
854 return "SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE";
855
856 case SCARD_ATTR_USER_AUTH_INPUT_DEVICE:
857 return "SCARD_ATTR_USER_AUTH_INPUT_DEVICE";
858
859 case SCARD_ATTR_CHARACTERISTICS:
860 return "SCARD_ATTR_CHARACTERISTICS";
861
862 case SCARD_ATTR_CURRENT_PROTOCOL_TYPE:
863 return "SCARD_ATTR_CURRENT_PROTOCOL_TYPE";
864
865 case SCARD_ATTR_CURRENT_CLK:
866 return "SCARD_ATTR_CURRENT_CLK";
867
868 case SCARD_ATTR_CURRENT_F:
869 return "SCARD_ATTR_CURRENT_F";
870
871 case SCARD_ATTR_CURRENT_D:
872 return "SCARD_ATTR_CURRENT_D";
873
874 case SCARD_ATTR_CURRENT_N:
875 return "SCARD_ATTR_CURRENT_N";
876
877 case SCARD_ATTR_CURRENT_W:
878 return "SCARD_ATTR_CURRENT_W";
879
880 case SCARD_ATTR_CURRENT_IFSC:
881 return "SCARD_ATTR_CURRENT_IFSC";
882
883 case SCARD_ATTR_CURRENT_IFSD:
884 return "SCARD_ATTR_CURRENT_IFSD";
885
886 case SCARD_ATTR_CURRENT_BWT:
887 return "SCARD_ATTR_CURRENT_BWT";
888
889 case SCARD_ATTR_CURRENT_CWT:
890 return "SCARD_ATTR_CURRENT_CWT";
891
892 case SCARD_ATTR_CURRENT_EBC_ENCODING:
893 return "SCARD_ATTR_CURRENT_EBC_ENCODING";
894
895 case SCARD_ATTR_EXTENDED_BWT:
896 return "SCARD_ATTR_EXTENDED_BWT";
897
898 case SCARD_ATTR_ICC_PRESENCE:
899 return "SCARD_ATTR_ICC_PRESENCE";
900
901 case SCARD_ATTR_ICC_INTERFACE_STATUS:
902 return "SCARD_ATTR_ICC_INTERFACE_STATUS";
903
904 case SCARD_ATTR_CURRENT_IO_STATE:
905 return "SCARD_ATTR_CURRENT_IO_STATE";
906
907 case SCARD_ATTR_ATR_STRING:
908 return "SCARD_ATTR_ATR_STRING";
909
910 case SCARD_ATTR_ICC_TYPE_PER_ATR:
911 return "SCARD_ATTR_ICC_TYPE_PER_ATR";
912
913 case SCARD_ATTR_ESC_RESET:
914 return "SCARD_ATTR_ESC_RESET";
915
916 case SCARD_ATTR_ESC_CANCEL:
917 return "SCARD_ATTR_ESC_CANCEL";
918
919 case SCARD_ATTR_ESC_AUTHREQUEST:
920 return "SCARD_ATTR_ESC_AUTHREQUEST";
921
922 case SCARD_ATTR_MAXINPUT:
923 return "SCARD_ATTR_MAXINPUT";
924
925 case SCARD_ATTR_DEVICE_UNIT:
926 return "SCARD_ATTR_DEVICE_UNIT";
927
928 case SCARD_ATTR_DEVICE_IN_USE:
929 return "SCARD_ATTR_DEVICE_IN_USE";
930
931 case SCARD_ATTR_DEVICE_FRIENDLY_NAME_A:
932 return "SCARD_ATTR_DEVICE_FRIENDLY_NAME_A";
933
934 case SCARD_ATTR_DEVICE_SYSTEM_NAME_A:
935 return "SCARD_ATTR_DEVICE_SYSTEM_NAME_A";
936
937 case SCARD_ATTR_DEVICE_FRIENDLY_NAME_W:
938 return "SCARD_ATTR_DEVICE_FRIENDLY_NAME_W";
939
940 case SCARD_ATTR_DEVICE_SYSTEM_NAME_W:
941 return "SCARD_ATTR_DEVICE_SYSTEM_NAME_W";
942
943 case SCARD_ATTR_SUPRESS_T1_IFS_REQUEST:
944 return "SCARD_ATTR_SUPRESS_T1_IFS_REQUEST";
945
946 default:
947 return "SCARD_ATTR_UNKNOWN";
948 }
949}
950
951WINSCARDAPI const char* WINAPI SCardGetProtocolString(DWORD dwProtocols)
952{
953 if (dwProtocols == SCARD_PROTOCOL_UNDEFINED)
954 return "SCARD_PROTOCOL_UNDEFINED";
955
956 if (dwProtocols == SCARD_PROTOCOL_T0)
957 return "SCARD_PROTOCOL_T0";
958
959 if (dwProtocols == SCARD_PROTOCOL_T1)
960 return "SCARD_PROTOCOL_T1";
961
962 if (dwProtocols == SCARD_PROTOCOL_Tx)
963 return "SCARD_PROTOCOL_Tx";
964
965 if (dwProtocols == SCARD_PROTOCOL_RAW)
966 return "SCARD_PROTOCOL_RAW";
967
968 if (dwProtocols == SCARD_PROTOCOL_DEFAULT)
969 return "SCARD_PROTOCOL_DEFAULT";
970
971 if (dwProtocols == (SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_RAW))
972 return "SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_RAW";
973
974 if (dwProtocols == (SCARD_PROTOCOL_T1 | SCARD_PROTOCOL_RAW))
975 return "SCARD_PROTOCOL_T1 | SCARD_PROTOCOL_RAW";
976
977 if (dwProtocols == (SCARD_PROTOCOL_Tx | SCARD_PROTOCOL_RAW))
978 return "SCARD_PROTOCOL_Tx | SCARD_PROTOCOL_RAW";
979
980 return "SCARD_PROTOCOL_UNKNOWN";
981}
982
983WINSCARDAPI const char* WINAPI SCardGetShareModeString(DWORD dwShareMode)
984{
985 switch (dwShareMode)
986 {
987 case SCARD_SHARE_EXCLUSIVE:
988 return "SCARD_SHARE_EXCLUSIVE";
989
990 case SCARD_SHARE_SHARED:
991 return "SCARD_SHARE_SHARED";
992
993 case SCARD_SHARE_DIRECT:
994 return "SCARD_SHARE_DIRECT";
995
996 default:
997 return "SCARD_SHARE_UNKNOWN";
998 }
999}
1000
1001WINSCARDAPI const char* WINAPI SCardGetDispositionString(DWORD dwDisposition)
1002{
1003 switch (dwDisposition)
1004 {
1005 case SCARD_LEAVE_CARD:
1006 return "SCARD_LEAVE_CARD";
1007
1008 case SCARD_RESET_CARD:
1009 return "SCARD_RESET_CARD";
1010
1011 case SCARD_UNPOWER_CARD:
1012 return "SCARD_UNPOWER_CARD";
1013
1014 default:
1015 return "SCARD_UNKNOWN_CARD";
1016 }
1017}
1018
1019WINSCARDAPI const char* WINAPI SCardGetScopeString(DWORD dwScope)
1020{
1021 switch (dwScope)
1022 {
1023 case SCARD_SCOPE_USER:
1024 return "SCARD_SCOPE_USER";
1025
1026 case SCARD_SCOPE_TERMINAL:
1027 return "SCARD_SCOPE_TERMINAL";
1028
1029 case SCARD_SCOPE_SYSTEM:
1030 return "SCARD_SCOPE_SYSTEM";
1031
1032 default:
1033 return "SCARD_SCOPE_UNKNOWN";
1034 }
1035}
1036
1037WINSCARDAPI const char* WINAPI SCardGetCardStateString(DWORD dwCardState)
1038{
1039 switch (dwCardState)
1040 {
1041 case SCARD_UNKNOWN:
1042 return "SCARD_UNKNOWN";
1043
1044 case SCARD_ABSENT:
1045 return "SCARD_ABSENT";
1046
1047 case SCARD_PRESENT:
1048 return "SCARD_PRESENT";
1049
1050 case SCARD_SWALLOWED:
1051 return "SCARD_SWALLOWED";
1052
1053 case SCARD_POWERED:
1054 return "SCARD_POWERED";
1055
1056 case SCARD_NEGOTIABLE:
1057 return "SCARD_NEGOTIABLE";
1058
1059 case SCARD_SPECIFIC:
1060 return "SCARD_SPECIFIC";
1061
1062 default:
1063 return "SCARD_UNKNOWN";
1064 }
1065}
1066
1067WINSCARDAPI char* WINAPI SCardGetReaderStateString(DWORD dwReaderState)
1068{
1069 const size_t size = 512;
1070 char* buffer = calloc(size, sizeof(char));
1071
1072 if (!buffer)
1073 return nullptr;
1074
1075 if (dwReaderState & SCARD_STATE_IGNORE)
1076 winpr_str_append("SCARD_STATE_IGNORE", buffer, size, "|");
1077
1078 if (dwReaderState & SCARD_STATE_CHANGED)
1079 winpr_str_append("SCARD_STATE_CHANGED", buffer, size, "|");
1080
1081 if (dwReaderState & SCARD_STATE_UNKNOWN)
1082 winpr_str_append("SCARD_STATE_UNKNOWN", buffer, size, "|");
1083
1084 if (dwReaderState & SCARD_STATE_UNAVAILABLE)
1085 winpr_str_append("SCARD_STATE_UNAVAILABLE", buffer, size, "|");
1086
1087 if (dwReaderState & SCARD_STATE_EMPTY)
1088 winpr_str_append("SCARD_STATE_EMPTY", buffer, size, "|");
1089
1090 if (dwReaderState & SCARD_STATE_PRESENT)
1091 winpr_str_append("SCARD_STATE_PRESENT", buffer, size, "|");
1092
1093 if (dwReaderState & SCARD_STATE_ATRMATCH)
1094 winpr_str_append("SCARD_STATE_ATRMATCH", buffer, size, "|");
1095
1096 if (dwReaderState & SCARD_STATE_EXCLUSIVE)
1097 winpr_str_append("SCARD_STATE_EXCLUSIVE", buffer, size, "|");
1098
1099 if (dwReaderState & SCARD_STATE_INUSE)
1100 winpr_str_append("SCARD_STATE_INUSE", buffer, size, "|");
1101
1102 if (dwReaderState & SCARD_STATE_MUTE)
1103 winpr_str_append("SCARD_STATE_MUTE", buffer, size, "|");
1104
1105 if (dwReaderState & SCARD_STATE_UNPOWERED)
1106 winpr_str_append("SCARD_STATE_UNPOWERED", buffer, size, "|");
1107
1108 if (!buffer[0])
1109 winpr_str_append("SCARD_STATE_UNAWARE", buffer, size, "|");
1110
1111 return buffer;
1112}
1113
1114#define WINSCARD_LOAD_PROC(_name) \
1115 do \
1116 { \
1117 WINPR_PRAGMA_DIAG_PUSH \
1118 WINPR_PRAGMA_DIAG_IGNORED_PEDANTIC \
1119 pWinSCardApiTable->pfn##_name = GetProcAddressAs(hWinSCardLibrary, #_name, fn##_name); \
1120 WINPR_PRAGMA_DIAG_POP \
1121 } while (0)
1122
1123BOOL WinSCard_LoadApiTableFunctions(PSCardApiFunctionTable pWinSCardApiTable,
1124 HMODULE hWinSCardLibrary)
1125{
1126 WINPR_ASSERT(pWinSCardApiTable);
1127 WINPR_ASSERT(hWinSCardLibrary);
1128
1129 WINSCARD_LOAD_PROC(SCardEstablishContext);
1130 WINSCARD_LOAD_PROC(SCardReleaseContext);
1131 WINSCARD_LOAD_PROC(SCardIsValidContext);
1132 WINSCARD_LOAD_PROC(SCardListReaderGroupsA);
1133 WINSCARD_LOAD_PROC(SCardListReaderGroupsW);
1134 WINSCARD_LOAD_PROC(SCardListReadersA);
1135 WINSCARD_LOAD_PROC(SCardListReadersW);
1136 WINSCARD_LOAD_PROC(SCardListCardsA);
1137 WINSCARD_LOAD_PROC(SCardListCardsW);
1138 WINSCARD_LOAD_PROC(SCardListInterfacesA);
1139 WINSCARD_LOAD_PROC(SCardListInterfacesW);
1140 WINSCARD_LOAD_PROC(SCardGetProviderIdA);
1141 WINSCARD_LOAD_PROC(SCardGetProviderIdW);
1142 WINSCARD_LOAD_PROC(SCardGetCardTypeProviderNameA);
1143 WINSCARD_LOAD_PROC(SCardGetCardTypeProviderNameW);
1144 WINSCARD_LOAD_PROC(SCardIntroduceReaderGroupA);
1145 WINSCARD_LOAD_PROC(SCardIntroduceReaderGroupW);
1146 WINSCARD_LOAD_PROC(SCardForgetReaderGroupA);
1147 WINSCARD_LOAD_PROC(SCardForgetReaderGroupW);
1148 WINSCARD_LOAD_PROC(SCardIntroduceReaderA);
1149 WINSCARD_LOAD_PROC(SCardIntroduceReaderW);
1150 WINSCARD_LOAD_PROC(SCardForgetReaderA);
1151 WINSCARD_LOAD_PROC(SCardForgetReaderW);
1152 WINSCARD_LOAD_PROC(SCardAddReaderToGroupA);
1153 WINSCARD_LOAD_PROC(SCardAddReaderToGroupW);
1154 WINSCARD_LOAD_PROC(SCardRemoveReaderFromGroupA);
1155 WINSCARD_LOAD_PROC(SCardRemoveReaderFromGroupW);
1156 WINSCARD_LOAD_PROC(SCardIntroduceCardTypeA);
1157 WINSCARD_LOAD_PROC(SCardIntroduceCardTypeW);
1158 WINSCARD_LOAD_PROC(SCardSetCardTypeProviderNameA);
1159 WINSCARD_LOAD_PROC(SCardSetCardTypeProviderNameW);
1160 WINSCARD_LOAD_PROC(SCardForgetCardTypeA);
1161 WINSCARD_LOAD_PROC(SCardForgetCardTypeW);
1162 WINSCARD_LOAD_PROC(SCardFreeMemory);
1163 WINSCARD_LOAD_PROC(SCardAccessStartedEvent);
1164 WINSCARD_LOAD_PROC(SCardReleaseStartedEvent);
1165 WINSCARD_LOAD_PROC(SCardLocateCardsA);
1166 WINSCARD_LOAD_PROC(SCardLocateCardsW);
1167 WINSCARD_LOAD_PROC(SCardLocateCardsByATRA);
1168 WINSCARD_LOAD_PROC(SCardLocateCardsByATRW);
1169 WINSCARD_LOAD_PROC(SCardGetStatusChangeA);
1170 WINSCARD_LOAD_PROC(SCardGetStatusChangeW);
1171 WINSCARD_LOAD_PROC(SCardCancel);
1172 WINSCARD_LOAD_PROC(SCardConnectA);
1173 WINSCARD_LOAD_PROC(SCardConnectW);
1174 WINSCARD_LOAD_PROC(SCardReconnect);
1175 WINSCARD_LOAD_PROC(SCardDisconnect);
1176 WINSCARD_LOAD_PROC(SCardBeginTransaction);
1177 WINSCARD_LOAD_PROC(SCardEndTransaction);
1178 WINSCARD_LOAD_PROC(SCardCancelTransaction);
1179 WINSCARD_LOAD_PROC(SCardState);
1180 WINSCARD_LOAD_PROC(SCardStatusA);
1181 WINSCARD_LOAD_PROC(SCardStatusW);
1182 WINSCARD_LOAD_PROC(SCardTransmit);
1183 WINSCARD_LOAD_PROC(SCardGetTransmitCount);
1184 WINSCARD_LOAD_PROC(SCardControl);
1185 WINSCARD_LOAD_PROC(SCardGetAttrib);
1186 WINSCARD_LOAD_PROC(SCardSetAttrib);
1187 WINSCARD_LOAD_PROC(SCardUIDlgSelectCardA);
1188 WINSCARD_LOAD_PROC(SCardUIDlgSelectCardW);
1189 WINSCARD_LOAD_PROC(GetOpenCardNameA);
1190 WINSCARD_LOAD_PROC(GetOpenCardNameW);
1191 WINSCARD_LOAD_PROC(SCardDlgExtendedError);
1192 WINSCARD_LOAD_PROC(SCardReadCacheA);
1193 WINSCARD_LOAD_PROC(SCardReadCacheW);
1194 WINSCARD_LOAD_PROC(SCardWriteCacheA);
1195 WINSCARD_LOAD_PROC(SCardWriteCacheW);
1196 WINSCARD_LOAD_PROC(SCardGetReaderIconA);
1197 WINSCARD_LOAD_PROC(SCardGetReaderIconW);
1198 WINSCARD_LOAD_PROC(SCardGetDeviceTypeIdA);
1199 WINSCARD_LOAD_PROC(SCardGetDeviceTypeIdW);
1200 WINSCARD_LOAD_PROC(SCardGetReaderDeviceInstanceIdA);
1201 WINSCARD_LOAD_PROC(SCardGetReaderDeviceInstanceIdW);
1202 WINSCARD_LOAD_PROC(SCardListReadersWithDeviceInstanceIdA);
1203 WINSCARD_LOAD_PROC(SCardListReadersWithDeviceInstanceIdW);
1204 WINSCARD_LOAD_PROC(SCardAudit);
1205
1206 return TRUE;
1207}
1208
1209static const SCardApiFunctionTable WinPR_SCardApiFunctionTable = {
1210 0, /* dwVersion */
1211 0, /* dwFlags */
1212
1213 SCardEstablishContext, /* SCardEstablishContext */
1214 SCardReleaseContext, /* SCardReleaseContext */
1215 SCardIsValidContext, /* SCardIsValidContext */
1216 SCardListReaderGroupsA, /* SCardListReaderGroupsA */
1217 SCardListReaderGroupsW, /* SCardListReaderGroupsW */
1218 SCardListReadersA, /* SCardListReadersA */
1219 SCardListReadersW, /* SCardListReadersW */
1220 SCardListCardsA, /* SCardListCardsA */
1221 SCardListCardsW, /* SCardListCardsW */
1222 SCardListInterfacesA, /* SCardListInterfacesA */
1223 SCardListInterfacesW, /* SCardListInterfacesW */
1224 SCardGetProviderIdA, /* SCardGetProviderIdA */
1225 SCardGetProviderIdW, /* SCardGetProviderIdW */
1226 SCardGetCardTypeProviderNameA, /* SCardGetCardTypeProviderNameA */
1227 SCardGetCardTypeProviderNameW, /* SCardGetCardTypeProviderNameW */
1228 SCardIntroduceReaderGroupA, /* SCardIntroduceReaderGroupA */
1229 SCardIntroduceReaderGroupW, /* SCardIntroduceReaderGroupW */
1230 SCardForgetReaderGroupA, /* SCardForgetReaderGroupA */
1231 SCardForgetReaderGroupW, /* SCardForgetReaderGroupW */
1232 SCardIntroduceReaderA, /* SCardIntroduceReaderA */
1233 SCardIntroduceReaderW, /* SCardIntroduceReaderW */
1234 SCardForgetReaderA, /* SCardForgetReaderA */
1235 SCardForgetReaderW, /* SCardForgetReaderW */
1236 SCardAddReaderToGroupA, /* SCardAddReaderToGroupA */
1237 SCardAddReaderToGroupW, /* SCardAddReaderToGroupW */
1238 SCardRemoveReaderFromGroupA, /* SCardRemoveReaderFromGroupA */
1239 SCardRemoveReaderFromGroupW, /* SCardRemoveReaderFromGroupW */
1240 SCardIntroduceCardTypeA, /* SCardIntroduceCardTypeA */
1241 SCardIntroduceCardTypeW, /* SCardIntroduceCardTypeW */
1242 SCardSetCardTypeProviderNameA, /* SCardSetCardTypeProviderNameA */
1243 SCardSetCardTypeProviderNameW, /* SCardSetCardTypeProviderNameW */
1244 SCardForgetCardTypeA, /* SCardForgetCardTypeA */
1245 SCardForgetCardTypeW, /* SCardForgetCardTypeW */
1246 SCardFreeMemory, /* SCardFreeMemory */
1247 SCardAccessStartedEvent, /* SCardAccessStartedEvent */
1248 SCardReleaseStartedEvent, /* SCardReleaseStartedEvent */
1249 SCardLocateCardsA, /* SCardLocateCardsA */
1250 SCardLocateCardsW, /* SCardLocateCardsW */
1251 SCardLocateCardsByATRA, /* SCardLocateCardsByATRA */
1252 SCardLocateCardsByATRW, /* SCardLocateCardsByATRW */
1253 SCardGetStatusChangeA, /* SCardGetStatusChangeA */
1254 SCardGetStatusChangeW, /* SCardGetStatusChangeW */
1255 SCardCancel, /* SCardCancel */
1256 SCardConnectA, /* SCardConnectA */
1257 SCardConnectW, /* SCardConnectW */
1258 SCardReconnect, /* SCardReconnect */
1259 SCardDisconnect, /* SCardDisconnect */
1260 SCardBeginTransaction, /* SCardBeginTransaction */
1261 SCardEndTransaction, /* SCardEndTransaction */
1262 SCardCancelTransaction, /* SCardCancelTransaction */
1263 SCardState, /* SCardState */
1264 SCardStatusA, /* SCardStatusA */
1265 SCardStatusW, /* SCardStatusW */
1266 SCardTransmit, /* SCardTransmit */
1267 SCardGetTransmitCount, /* SCardGetTransmitCount */
1268 SCardControl, /* SCardControl */
1269 SCardGetAttrib, /* SCardGetAttrib */
1270 SCardSetAttrib, /* SCardSetAttrib */
1271 SCardUIDlgSelectCardA, /* SCardUIDlgSelectCardA */
1272 SCardUIDlgSelectCardW, /* SCardUIDlgSelectCardW */
1273 GetOpenCardNameA, /* GetOpenCardNameA */
1274 GetOpenCardNameW, /* GetOpenCardNameW */
1275 SCardDlgExtendedError, /* SCardDlgExtendedError */
1276 SCardReadCacheA, /* SCardReadCacheA */
1277 SCardReadCacheW, /* SCardReadCacheW */
1278 SCardWriteCacheA, /* SCardWriteCacheA */
1279 SCardWriteCacheW, /* SCardWriteCacheW */
1280 SCardGetReaderIconA, /* SCardGetReaderIconA */
1281 SCardGetReaderIconW, /* SCardGetReaderIconW */
1282 SCardGetDeviceTypeIdA, /* SCardGetDeviceTypeIdA */
1283 SCardGetDeviceTypeIdW, /* SCardGetDeviceTypeIdW */
1284 SCardGetReaderDeviceInstanceIdA, /* SCardGetReaderDeviceInstanceIdA */
1285 SCardGetReaderDeviceInstanceIdW, /* SCardGetReaderDeviceInstanceIdW */
1286 SCardListReadersWithDeviceInstanceIdA, /* SCardListReadersWithDeviceInstanceIdA */
1287 SCardListReadersWithDeviceInstanceIdW, /* SCardListReadersWithDeviceInstanceIdW */
1288 SCardAudit /* SCardAudit */
1289};
1290
1291const SCardApiFunctionTable* WinPR_GetSCardApiFunctionTable(void)
1292{
1293 return &WinPR_SCardApiFunctionTable;
1294}
Definition wtypes.h:254