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