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