22#include <winpr/config.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>
35#if defined(WITH_SMARTCARD_INSPECT)
36#include "smartcard_inspect.h"
39static INIT_ONCE g_Initialized = INIT_ONCE_STATIC_INIT;
42#define TAG WINPR_TAG("smartcard")
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) \
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; \
56 fkt = WINPR_FUNC_PTR_CAST(sc->pfn##_name, const void*); \
58 WLog_DBG(TAG, "Missing function pointer g_SCardApi=%p->" xstr(pfn##_name) "=%p", inst, \
60 return SCARD_E_NO_SERVICE; \
62 return g_SCardApi->pfn##_name(__VA_ARGS__)
64#define SCARDAPI_STUB_CALL_HANDLE(_name) \
65 if (!InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, nullptr, nullptr)) \
67 if (!g_SCardApi || !g_SCardApi->pfn##_name) \
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; \
73 fkt = WINPR_FUNC_PTR_CAST(sc->pfn##_name, const void*); \
75 WLog_DBG(TAG, "Missing function pointer g_SCardApi=%p->" xstr(pfn##_name) "=%p", inst, \
79 return g_SCardApi->pfn##_name()
81#define SCARDAPI_STUB_CALL_VOID(_name) \
82 if (!InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, nullptr, nullptr)) \
84 if (!g_SCardApi || !g_SCardApi->pfn##_name) \
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; \
90 fkt = WINPR_FUNC_PTR_CAST(sc->pfn##_name, const void*); \
92 WLog_DBG(TAG, "Missing function pointer g_SCardApi=%p->" xstr(pfn##_name) "=%p", inst, \
96 g_SCardApi->pfn##_name()
106static BOOL CALLBACK InitializeSCardApiStubs(WINPR_ATTR_UNUSED
PINIT_ONCE once,
107 WINPR_ATTR_UNUSED PVOID param,
108 WINPR_ATTR_UNUSED PVOID* context)
111 if (Windows_InitializeSCardApi() >= 0)
112 g_SCardApi = Windows_GetSCardApiFunctionTable();
114#if defined(WITH_SMARTCARD_PCSC)
115 if (PCSC_InitializeSCardApi() >= 0)
116 g_SCardApi = PCSC_GetSCardApiFunctionTable();
120#if defined(WITH_SMARTCARD_INSPECT)
121 g_SCardApi = Inspect_RegisterSCardApi(g_SCardApi);
126WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardEstablishContext(DWORD dwScope,
129 LPSCARDCONTEXT phContext)
131 SCARDAPI_STUB_CALL_LONG(SCardEstablishContext, dwScope, pvReserved1, pvReserved2, phContext);
134WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardReleaseContext(SCARDCONTEXT hContext)
136 SCARDAPI_STUB_CALL_LONG(SCardReleaseContext, hContext);
139WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardIsValidContext(SCARDCONTEXT hContext)
141 SCARDAPI_STUB_CALL_LONG(SCardIsValidContext, hContext);
144WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardListReaderGroupsA(SCARDCONTEXT hContext,
148 SCARDAPI_STUB_CALL_LONG(SCardListReaderGroupsA, hContext, mszGroups, pcchGroups);
151WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardListReaderGroupsW(SCARDCONTEXT hContext,
155 SCARDAPI_STUB_CALL_LONG(SCardListReaderGroupsW, hContext, mszGroups, pcchGroups);
158WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardListReadersA(SCARDCONTEXT hContext,
159 LPCSTR mszGroups, LPSTR mszReaders,
162 SCARDAPI_STUB_CALL_LONG(SCardListReadersA, hContext, mszGroups, mszReaders, pcchReaders);
165WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardListReadersW(SCARDCONTEXT hContext,
166 LPCWSTR mszGroups, LPWSTR mszReaders,
169 SCARDAPI_STUB_CALL_LONG(SCardListReadersW, hContext, mszGroups, mszReaders, pcchReaders);
172WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardListCardsA(SCARDCONTEXT hContext, LPCBYTE pbAtr,
173 LPCGUID rgquidInterfaces,
174 DWORD cguidInterfaceCount,
175 CHAR* mszCards, LPDWORD pcchCards)
177 SCARDAPI_STUB_CALL_LONG(SCardListCardsA, hContext, pbAtr, rgquidInterfaces, cguidInterfaceCount,
178 mszCards, pcchCards);
181WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardListCardsW(SCARDCONTEXT hContext, LPCBYTE pbAtr,
182 LPCGUID rgquidInterfaces,
183 DWORD cguidInterfaceCount,
184 WCHAR* mszCards, LPDWORD pcchCards)
186 SCARDAPI_STUB_CALL_LONG(SCardListCardsW, hContext, pbAtr, rgquidInterfaces, cguidInterfaceCount,
187 mszCards, pcchCards);
190WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardListInterfacesA(SCARDCONTEXT hContext,
192 LPGUID pguidInterfaces,
193 LPDWORD pcguidInterfaces)
195 SCARDAPI_STUB_CALL_LONG(SCardListInterfacesA, hContext, szCard, pguidInterfaces,
199WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardListInterfacesW(SCARDCONTEXT hContext,
201 LPGUID pguidInterfaces,
202 LPDWORD pcguidInterfaces)
204 SCARDAPI_STUB_CALL_LONG(SCardListInterfacesW, hContext, szCard, pguidInterfaces,
208WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardGetProviderIdA(SCARDCONTEXT hContext,
210 LPGUID pguidProviderId)
212 SCARDAPI_STUB_CALL_LONG(SCardGetProviderIdA, hContext, szCard, pguidProviderId);
215WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardGetProviderIdW(SCARDCONTEXT hContext,
217 LPGUID pguidProviderId)
219 SCARDAPI_STUB_CALL_LONG(SCardGetProviderIdW, hContext, szCard, pguidProviderId);
222WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardGetCardTypeProviderNameA(SCARDCONTEXT hContext,
226 LPDWORD pcchProvider)
228 SCARDAPI_STUB_CALL_LONG(SCardGetCardTypeProviderNameA, hContext, szCardName, dwProviderId,
229 szProvider, pcchProvider);
232WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardGetCardTypeProviderNameW(SCARDCONTEXT hContext,
236 LPDWORD pcchProvider)
238 SCARDAPI_STUB_CALL_LONG(SCardGetCardTypeProviderNameW, hContext, szCardName, dwProviderId,
239 szProvider, pcchProvider);
242WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardIntroduceReaderGroupA(SCARDCONTEXT hContext,
245 SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderGroupA, hContext, szGroupName);
248WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardIntroduceReaderGroupW(SCARDCONTEXT hContext,
251 SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderGroupW, hContext, szGroupName);
254WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardForgetReaderGroupA(SCARDCONTEXT hContext,
257 SCARDAPI_STUB_CALL_LONG(SCardForgetReaderGroupA, hContext, szGroupName);
260WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardForgetReaderGroupW(SCARDCONTEXT hContext,
263 SCARDAPI_STUB_CALL_LONG(SCardForgetReaderGroupW, hContext, szGroupName);
266WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardIntroduceReaderA(SCARDCONTEXT hContext,
270 SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderA, hContext, szReaderName, szDeviceName);
273WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardIntroduceReaderW(SCARDCONTEXT hContext,
274 LPCWSTR szReaderName,
275 LPCWSTR szDeviceName)
277 SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderW, hContext, szReaderName, szDeviceName);
280WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardForgetReaderA(SCARDCONTEXT hContext,
283 SCARDAPI_STUB_CALL_LONG(SCardForgetReaderA, hContext, szReaderName);
286WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardForgetReaderW(SCARDCONTEXT hContext,
287 LPCWSTR szReaderName)
289 SCARDAPI_STUB_CALL_LONG(SCardForgetReaderW, hContext, szReaderName);
292WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardAddReaderToGroupA(SCARDCONTEXT hContext,
296 SCARDAPI_STUB_CALL_LONG(SCardAddReaderToGroupA, hContext, szReaderName, szGroupName);
299WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardAddReaderToGroupW(SCARDCONTEXT hContext,
300 LPCWSTR szReaderName,
303 SCARDAPI_STUB_CALL_LONG(SCardAddReaderToGroupW, hContext, szReaderName, szGroupName);
306WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardRemoveReaderFromGroupA(SCARDCONTEXT hContext,
310 SCARDAPI_STUB_CALL_LONG(SCardRemoveReaderFromGroupA, hContext, szReaderName, szGroupName);
313WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardRemoveReaderFromGroupW(SCARDCONTEXT hContext,
314 LPCWSTR szReaderName,
317 SCARDAPI_STUB_CALL_LONG(SCardRemoveReaderFromGroupW, hContext, szReaderName, szGroupName);
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)
325 SCARDAPI_STUB_CALL_LONG(SCardIntroduceCardTypeA, hContext, szCardName, pguidPrimaryProvider,
326 rgguidInterfaces, dwInterfaceCount, pbAtr, pbAtrMask, cbAtrLen);
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)
334 SCARDAPI_STUB_CALL_LONG(SCardIntroduceCardTypeW, hContext, szCardName, pguidPrimaryProvider,
335 rgguidInterfaces, dwInterfaceCount, pbAtr, pbAtrMask, cbAtrLen);
338WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardSetCardTypeProviderNameA(SCARDCONTEXT hContext,
343 SCARDAPI_STUB_CALL_LONG(SCardSetCardTypeProviderNameA, hContext, szCardName, dwProviderId,
347WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardSetCardTypeProviderNameW(SCARDCONTEXT hContext,
352 SCARDAPI_STUB_CALL_LONG(SCardSetCardTypeProviderNameW, hContext, szCardName, dwProviderId,
356WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardForgetCardTypeA(SCARDCONTEXT hContext,
359 SCARDAPI_STUB_CALL_LONG(SCardForgetCardTypeA, hContext, szCardName);
362WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardForgetCardTypeW(SCARDCONTEXT hContext,
365 SCARDAPI_STUB_CALL_LONG(SCardForgetCardTypeW, hContext, szCardName);
368WINSCARDAPI LONG WINAPI SCardFreeMemory(SCARDCONTEXT hContext, LPVOID pvMem)
370 SCARDAPI_STUB_CALL_LONG(SCardFreeMemory, hContext, pvMem);
373WINSCARDAPI HANDLE WINAPI SCardAccessStartedEvent(
void)
375 SCARDAPI_STUB_CALL_HANDLE(SCardAccessStartedEvent);
378WINSCARDAPI
void WINAPI SCardReleaseStartedEvent(
void)
380 SCARDAPI_STUB_CALL_VOID(SCardReleaseStartedEvent);
383WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardLocateCardsA(SCARDCONTEXT hContext,
388 SCARDAPI_STUB_CALL_LONG(SCardLocateCardsA, hContext, mszCards, rgReaderStates, cReaders);
391WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardLocateCardsW(SCARDCONTEXT hContext,
396 SCARDAPI_STUB_CALL_LONG(SCardLocateCardsW, hContext, mszCards, rgReaderStates, cReaders);
399WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI
400SCardLocateCardsByATRA(SCARDCONTEXT hContext,
LPSCARD_ATRMASK rgAtrMasks, DWORD cAtrs,
403 SCARDAPI_STUB_CALL_LONG(SCardLocateCardsByATRA, hContext, rgAtrMasks, cAtrs, rgReaderStates,
407WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI
408SCardLocateCardsByATRW(SCARDCONTEXT hContext,
LPSCARD_ATRMASK rgAtrMasks, DWORD cAtrs,
411 SCARDAPI_STUB_CALL_LONG(SCardLocateCardsByATRW, hContext, rgAtrMasks, cAtrs, rgReaderStates,
415WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardGetStatusChangeA(
418 SCARDAPI_STUB_CALL_LONG(SCardGetStatusChangeA, hContext, dwTimeout, rgReaderStates, cReaders);
421WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardGetStatusChangeW(
424 SCARDAPI_STUB_CALL_LONG(SCardGetStatusChangeW, hContext, dwTimeout, rgReaderStates, cReaders);
427WINSCARDAPI LONG WINAPI SCardCancel(SCARDCONTEXT hContext)
429 SCARDAPI_STUB_CALL_LONG(SCardCancel, hContext);
432WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardConnectA(SCARDCONTEXT hContext, LPCSTR szReader,
434 DWORD dwPreferredProtocols,
435 LPSCARDHANDLE phCard,
436 LPDWORD pdwActiveProtocol)
438 SCARDAPI_STUB_CALL_LONG(SCardConnectA, hContext, szReader, dwShareMode, dwPreferredProtocols,
439 phCard, pdwActiveProtocol);
442WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardConnectW(SCARDCONTEXT hContext, LPCWSTR szReader,
444 DWORD dwPreferredProtocols,
445 LPSCARDHANDLE phCard,
446 LPDWORD pdwActiveProtocol)
448 SCARDAPI_STUB_CALL_LONG(SCardConnectW, hContext, szReader, dwShareMode, dwPreferredProtocols,
449 phCard, pdwActiveProtocol);
452WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardReconnect(SCARDHANDLE hCard, DWORD dwShareMode,
453 DWORD dwPreferredProtocols,
454 DWORD dwInitialization,
455 LPDWORD pdwActiveProtocol)
457 SCARDAPI_STUB_CALL_LONG(SCardReconnect, hCard, dwShareMode, dwPreferredProtocols,
458 dwInitialization, pdwActiveProtocol);
461WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardDisconnect(SCARDHANDLE hCard, DWORD dwDisposition)
463 SCARDAPI_STUB_CALL_LONG(SCardDisconnect, hCard, dwDisposition);
466WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardBeginTransaction(SCARDHANDLE hCard)
468 SCARDAPI_STUB_CALL_LONG(SCardBeginTransaction, hCard);
471WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardEndTransaction(SCARDHANDLE hCard,
474 SCARDAPI_STUB_CALL_LONG(SCardEndTransaction, hCard, dwDisposition);
477WINSCARDAPI LONG WINAPI SCardCancelTransaction(SCARDHANDLE hCard)
479 SCARDAPI_STUB_CALL_LONG(SCardCancelTransaction, hCard);
482WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardState(SCARDHANDLE hCard, LPDWORD pdwState,
483 LPDWORD pdwProtocol, LPBYTE pbAtr,
486 SCARDAPI_STUB_CALL_LONG(SCardState, hCard, pdwState, pdwProtocol, pbAtr, pcbAtrLen);
489WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardStatusA(SCARDHANDLE hCard, LPSTR mszReaderNames,
490 LPDWORD pcchReaderLen, LPDWORD pdwState,
491 LPDWORD pdwProtocol, LPBYTE pbAtr,
494 SCARDAPI_STUB_CALL_LONG(SCardStatusA, hCard, mszReaderNames, pcchReaderLen, pdwState,
495 pdwProtocol, pbAtr, pcbAtrLen);
498WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardStatusW(SCARDHANDLE hCard, LPWSTR mszReaderNames,
499 LPDWORD pcchReaderLen, LPDWORD pdwState,
500 LPDWORD pdwProtocol, LPBYTE pbAtr,
503 SCARDAPI_STUB_CALL_LONG(SCardStatusW, hCard, mszReaderNames, pcchReaderLen, pdwState,
504 pdwProtocol, pbAtr, pcbAtrLen);
507WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardTransmit(
508 SCARDHANDLE hCard,
LPCSCARD_IO_REQUEST pioSendPci, LPCBYTE pbSendBuffer, DWORD cbSendLength,
511 SCARDAPI_STUB_CALL_LONG(SCardTransmit, hCard, pioSendPci, pbSendBuffer, cbSendLength,
512 pioRecvPci, pbRecvBuffer, pcbRecvLength);
515WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardGetTransmitCount(SCARDHANDLE hCard,
516 LPDWORD pcTransmitCount)
518 SCARDAPI_STUB_CALL_LONG(SCardGetTransmitCount, hCard, pcTransmitCount);
521WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardControl(SCARDHANDLE hCard, DWORD dwControlCode,
522 LPCVOID lpInBuffer, DWORD cbInBufferSize,
523 LPVOID lpOutBuffer, DWORD cbOutBufferSize,
524 LPDWORD lpBytesReturned)
526 SCARDAPI_STUB_CALL_LONG(SCardControl, hCard, dwControlCode, lpInBuffer, cbInBufferSize,
527 lpOutBuffer, cbOutBufferSize, lpBytesReturned);
530WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardGetAttrib(SCARDHANDLE hCard, DWORD dwAttrId,
531 LPBYTE pbAttr, LPDWORD pcbAttrLen)
533 SCARDAPI_STUB_CALL_LONG(SCardGetAttrib, hCard, dwAttrId, pbAttr, pcbAttrLen);
536WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardSetAttrib(SCARDHANDLE hCard, DWORD dwAttrId,
537 LPCBYTE pbAttr, DWORD cbAttrLen)
539 SCARDAPI_STUB_CALL_LONG(SCardSetAttrib, hCard, dwAttrId, pbAttr, cbAttrLen);
542WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardUIDlgSelectCardA(LPOPENCARDNAMEA_EX pDlgStruc)
544 SCARDAPI_STUB_CALL_LONG(SCardUIDlgSelectCardA, pDlgStruc);
547WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardUIDlgSelectCardW(LPOPENCARDNAMEW_EX pDlgStruc)
549 SCARDAPI_STUB_CALL_LONG(SCardUIDlgSelectCardW, pDlgStruc);
552WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI GetOpenCardNameA(
LPOPENCARDNAMEA pDlgStruc)
554 SCARDAPI_STUB_CALL_LONG(GetOpenCardNameA, pDlgStruc);
557WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI GetOpenCardNameW(
LPOPENCARDNAMEW pDlgStruc)
559 SCARDAPI_STUB_CALL_LONG(GetOpenCardNameW, pDlgStruc);
562WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardDlgExtendedError(
void)
564 SCARDAPI_STUB_CALL_LONG(SCardDlgExtendedError);
567WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardReadCacheA(SCARDCONTEXT hContext,
568 UUID* CardIdentifier,
569 DWORD FreshnessCounter,
570 LPSTR LookupName, PBYTE Data,
573 SCARDAPI_STUB_CALL_LONG(SCardReadCacheA, hContext, CardIdentifier, FreshnessCounter, LookupName,
577WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardReadCacheW(SCARDCONTEXT hContext,
578 UUID* CardIdentifier,
579 DWORD FreshnessCounter,
580 LPWSTR LookupName, PBYTE Data,
583 SCARDAPI_STUB_CALL_LONG(SCardReadCacheW, hContext, CardIdentifier, FreshnessCounter, LookupName,
587WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardWriteCacheA(SCARDCONTEXT hContext,
588 UUID* CardIdentifier,
589 DWORD FreshnessCounter,
590 LPSTR LookupName, PBYTE Data,
593 SCARDAPI_STUB_CALL_LONG(SCardWriteCacheA, hContext, CardIdentifier, FreshnessCounter,
594 LookupName, Data, DataLen);
597WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardWriteCacheW(SCARDCONTEXT hContext,
598 UUID* CardIdentifier,
599 DWORD FreshnessCounter,
600 LPWSTR LookupName, PBYTE Data,
603 SCARDAPI_STUB_CALL_LONG(SCardWriteCacheW, hContext, CardIdentifier, FreshnessCounter,
604 LookupName, Data, DataLen);
607WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardGetReaderIconA(SCARDCONTEXT hContext,
608 LPCSTR szReaderName, LPBYTE pbIcon,
611 SCARDAPI_STUB_CALL_LONG(SCardGetReaderIconA, hContext, szReaderName, pbIcon, pcbIcon);
614WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardGetReaderIconW(SCARDCONTEXT hContext,
615 LPCWSTR szReaderName,
616 LPBYTE pbIcon, LPDWORD pcbIcon)
618 SCARDAPI_STUB_CALL_LONG(SCardGetReaderIconW, hContext, szReaderName, pbIcon, pcbIcon);
621WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardGetDeviceTypeIdA(SCARDCONTEXT hContext,
623 LPDWORD pdwDeviceTypeId)
625 SCARDAPI_STUB_CALL_LONG(SCardGetDeviceTypeIdA, hContext, szReaderName, pdwDeviceTypeId);
628WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardGetDeviceTypeIdW(SCARDCONTEXT hContext,
629 LPCWSTR szReaderName,
630 LPDWORD pdwDeviceTypeId)
632 SCARDAPI_STUB_CALL_LONG(SCardGetDeviceTypeIdW, hContext, szReaderName, pdwDeviceTypeId);
635WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI
636SCardGetReaderDeviceInstanceIdA(SCARDCONTEXT hContext, LPCSTR szReaderName,
637 LPSTR szDeviceInstanceId, LPDWORD pcchDeviceInstanceId)
639 SCARDAPI_STUB_CALL_LONG(SCardGetReaderDeviceInstanceIdA, hContext, szReaderName,
640 szDeviceInstanceId, pcchDeviceInstanceId);
643WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI
644SCardGetReaderDeviceInstanceIdW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
645 LPWSTR szDeviceInstanceId, LPDWORD pcchDeviceInstanceId)
647 SCARDAPI_STUB_CALL_LONG(SCardGetReaderDeviceInstanceIdW, hContext, szReaderName,
648 szDeviceInstanceId, pcchDeviceInstanceId);
651WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardListReadersWithDeviceInstanceIdA(
652 SCARDCONTEXT hContext, LPCSTR szDeviceInstanceId, LPSTR mszReaders, LPDWORD pcchReaders)
654 SCARDAPI_STUB_CALL_LONG(SCardListReadersWithDeviceInstanceIdA, hContext, szDeviceInstanceId,
655 mszReaders, pcchReaders);
658WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardListReadersWithDeviceInstanceIdW(
659 SCARDCONTEXT hContext, LPCWSTR szDeviceInstanceId, LPWSTR mszReaders, LPDWORD pcchReaders)
661 SCARDAPI_STUB_CALL_LONG(SCardListReadersWithDeviceInstanceIdW, hContext, szDeviceInstanceId,
662 mszReaders, pcchReaders);
665WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardAudit(SCARDCONTEXT hContext, DWORD dwEvent)
667 SCARDAPI_STUB_CALL_LONG(SCardAudit, hContext, dwEvent);
674WINSCARDAPI
const char* WINAPI SCardGetErrorString(LONG errorCode)
678 case SCARD_S_SUCCESS:
679 return "SCARD_S_SUCCESS";
681 case SCARD_F_INTERNAL_ERROR:
682 return "SCARD_F_INTERNAL_ERROR";
684 case SCARD_E_CANCELLED:
685 return "SCARD_E_CANCELLED";
687 case SCARD_E_INVALID_HANDLE:
688 return "SCARD_E_INVALID_HANDLE";
690 case SCARD_E_INVALID_PARAMETER:
691 return "SCARD_E_INVALID_PARAMETER";
693 case SCARD_E_INVALID_TARGET:
694 return "SCARD_E_INVALID_TARGET";
696 case SCARD_E_NO_MEMORY:
697 return "SCARD_E_NO_MEMORY";
699 case SCARD_F_WAITED_TOO_LONG:
700 return "SCARD_F_WAITED_TOO_LONG";
702 case SCARD_E_INSUFFICIENT_BUFFER:
703 return "SCARD_E_INSUFFICIENT_BUFFER";
705 case SCARD_E_UNKNOWN_READER:
706 return "SCARD_E_UNKNOWN_READER";
708 case SCARD_E_TIMEOUT:
709 return "SCARD_E_TIMEOUT";
711 case SCARD_E_SHARING_VIOLATION:
712 return "SCARD_E_SHARING_VIOLATION";
714 case SCARD_E_NO_SMARTCARD:
715 return "SCARD_E_NO_SMARTCARD";
717 case SCARD_E_UNKNOWN_CARD:
718 return "SCARD_E_UNKNOWN_CARD";
720 case SCARD_E_CANT_DISPOSE:
721 return "SCARD_E_CANT_DISPOSE";
723 case SCARD_E_PROTO_MISMATCH:
724 return "SCARD_E_PROTO_MISMATCH";
726 case SCARD_E_NOT_READY:
727 return "SCARD_E_NOT_READY";
729 case SCARD_E_INVALID_VALUE:
730 return "SCARD_E_INVALID_VALUE";
732 case SCARD_E_SYSTEM_CANCELLED:
733 return "SCARD_E_SYSTEM_CANCELLED";
735 case SCARD_F_COMM_ERROR:
736 return "SCARD_F_COMM_ERROR";
738 case SCARD_F_UNKNOWN_ERROR:
739 return "SCARD_F_UNKNOWN_ERROR";
741 case SCARD_E_INVALID_ATR:
742 return "SCARD_E_INVALID_ATR";
744 case SCARD_E_NOT_TRANSACTED:
745 return "SCARD_E_NOT_TRANSACTED";
747 case SCARD_E_READER_UNAVAILABLE:
748 return "SCARD_E_READER_UNAVAILABLE";
750 case SCARD_P_SHUTDOWN:
751 return "SCARD_P_SHUTDOWN";
753 case SCARD_E_PCI_TOO_SMALL:
754 return "SCARD_E_PCI_TOO_SMALL";
756 case SCARD_E_READER_UNSUPPORTED:
757 return "SCARD_E_READER_UNSUPPORTED";
759 case SCARD_E_DUPLICATE_READER:
760 return "SCARD_E_DUPLICATE_READER";
762 case SCARD_E_CARD_UNSUPPORTED:
763 return "SCARD_E_CARD_UNSUPPORTED";
765 case SCARD_E_NO_SERVICE:
766 return "SCARD_E_NO_SERVICE";
768 case SCARD_E_SERVICE_STOPPED:
769 return "SCARD_E_SERVICE_STOPPED";
771 case SCARD_E_UNEXPECTED:
772 return "SCARD_E_UNEXPECTED";
774 case SCARD_E_ICC_INSTALLATION:
775 return "SCARD_E_ICC_INSTALLATION";
777 case SCARD_E_ICC_CREATEORDER:
778 return "SCARD_E_ICC_CREATEORDER";
780 case SCARD_E_UNSUPPORTED_FEATURE:
781 return "SCARD_E_UNSUPPORTED_FEATURE";
783 case SCARD_E_DIR_NOT_FOUND:
784 return "SCARD_E_DIR_NOT_FOUND";
786 case SCARD_E_FILE_NOT_FOUND:
787 return "SCARD_E_FILE_NOT_FOUND";
790 return "SCARD_E_NO_DIR";
792 case SCARD_E_NO_FILE:
793 return "SCARD_E_NO_FILE";
795 case SCARD_E_NO_ACCESS:
796 return "SCARD_E_NO_ACCESS";
798 case SCARD_E_WRITE_TOO_MANY:
799 return "SCARD_E_WRITE_TOO_MANY";
801 case SCARD_E_BAD_SEEK:
802 return "SCARD_E_BAD_SEEK";
804 case SCARD_E_INVALID_CHV:
805 return "SCARD_E_INVALID_CHV";
807 case SCARD_E_UNKNOWN_RES_MNG:
808 return "SCARD_E_UNKNOWN_RES_MNG";
810 case SCARD_E_NO_SUCH_CERTIFICATE:
811 return "SCARD_E_NO_SUCH_CERTIFICATE";
813 case SCARD_E_CERTIFICATE_UNAVAILABLE:
814 return "SCARD_E_CERTIFICATE_UNAVAILABLE";
816 case SCARD_E_NO_READERS_AVAILABLE:
817 return "SCARD_E_NO_READERS_AVAILABLE";
819 case SCARD_E_COMM_DATA_LOST:
820 return "SCARD_E_COMM_DATA_LOST";
822 case SCARD_E_NO_KEY_CONTAINER:
823 return "SCARD_E_NO_KEY_CONTAINER";
825 case SCARD_E_SERVER_TOO_BUSY:
826 return "SCARD_E_SERVER_TOO_BUSY";
828 case SCARD_E_PIN_CACHE_EXPIRED:
829 return "SCARD_E_PIN_CACHE_EXPIRED";
831 case SCARD_E_NO_PIN_CACHE:
832 return "SCARD_E_NO_PIN_CACHE";
834 case SCARD_E_READ_ONLY_CARD:
835 return "SCARD_E_READ_ONLY_CARD";
837 case SCARD_W_UNSUPPORTED_CARD:
838 return "SCARD_W_UNSUPPORTED_CARD";
840 case SCARD_W_UNRESPONSIVE_CARD:
841 return "SCARD_W_UNRESPONSIVE_CARD";
843 case SCARD_W_UNPOWERED_CARD:
844 return "SCARD_W_UNPOWERED_CARD";
846 case SCARD_W_RESET_CARD:
847 return "SCARD_W_RESET_CARD";
849 case SCARD_W_REMOVED_CARD:
850 return "SCARD_W_REMOVED_CARD";
852 case SCARD_W_SECURITY_VIOLATION:
853 return "SCARD_W_SECURITY_VIOLATION";
855 case SCARD_W_WRONG_CHV:
856 return "SCARD_W_WRONG_CHV";
858 case SCARD_W_CHV_BLOCKED:
859 return "SCARD_W_CHV_BLOCKED";
862 return "SCARD_W_EOF";
864 case SCARD_W_CANCELLED_BY_USER:
865 return "SCARD_W_CANCELLED_BY_USER";
867 case SCARD_W_CARD_NOT_AUTHENTICATED:
868 return "SCARD_W_CARD_NOT_AUTHENTICATED";
870 case SCARD_W_CACHE_ITEM_NOT_FOUND:
871 return "SCARD_W_CACHE_ITEM_NOT_FOUND";
873 case SCARD_W_CACHE_ITEM_STALE:
874 return "SCARD_W_CACHE_ITEM_STALE";
876 case SCARD_W_CACHE_ITEM_TOO_BIG:
877 return "SCARD_W_CACHE_ITEM_TOO_BIG";
880 return "SCARD_E_UNKNOWN";
884WINSCARDAPI
const char* WINAPI SCardGetAttributeString(DWORD dwAttrId)
888 case SCARD_ATTR_VENDOR_NAME:
889 return "SCARD_ATTR_VENDOR_NAME";
891 case SCARD_ATTR_VENDOR_IFD_TYPE:
892 return "SCARD_ATTR_VENDOR_IFD_TYPE";
894 case SCARD_ATTR_VENDOR_IFD_VERSION:
895 return "SCARD_ATTR_VENDOR_IFD_VERSION";
897 case SCARD_ATTR_VENDOR_IFD_SERIAL_NO:
898 return "SCARD_ATTR_VENDOR_IFD_SERIAL_NO";
900 case SCARD_ATTR_CHANNEL_ID:
901 return "SCARD_ATTR_CHANNEL_ID";
903 case SCARD_ATTR_PROTOCOL_TYPES:
904 return "SCARD_ATTR_PROTOCOL_TYPES";
906 case SCARD_ATTR_DEFAULT_CLK:
907 return "SCARD_ATTR_DEFAULT_CLK";
909 case SCARD_ATTR_MAX_CLK:
910 return "SCARD_ATTR_MAX_CLK";
912 case SCARD_ATTR_DEFAULT_DATA_RATE:
913 return "SCARD_ATTR_DEFAULT_DATA_RATE";
915 case SCARD_ATTR_MAX_DATA_RATE:
916 return "SCARD_ATTR_MAX_DATA_RATE";
918 case SCARD_ATTR_MAX_IFSD:
919 return "SCARD_ATTR_MAX_IFSD";
921 case SCARD_ATTR_POWER_MGMT_SUPPORT:
922 return "SCARD_ATTR_POWER_MGMT_SUPPORT";
924 case SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE:
925 return "SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE";
927 case SCARD_ATTR_USER_AUTH_INPUT_DEVICE:
928 return "SCARD_ATTR_USER_AUTH_INPUT_DEVICE";
930 case SCARD_ATTR_CHARACTERISTICS:
931 return "SCARD_ATTR_CHARACTERISTICS";
933 case SCARD_ATTR_CURRENT_PROTOCOL_TYPE:
934 return "SCARD_ATTR_CURRENT_PROTOCOL_TYPE";
936 case SCARD_ATTR_CURRENT_CLK:
937 return "SCARD_ATTR_CURRENT_CLK";
939 case SCARD_ATTR_CURRENT_F:
940 return "SCARD_ATTR_CURRENT_F";
942 case SCARD_ATTR_CURRENT_D:
943 return "SCARD_ATTR_CURRENT_D";
945 case SCARD_ATTR_CURRENT_N:
946 return "SCARD_ATTR_CURRENT_N";
948 case SCARD_ATTR_CURRENT_W:
949 return "SCARD_ATTR_CURRENT_W";
951 case SCARD_ATTR_CURRENT_IFSC:
952 return "SCARD_ATTR_CURRENT_IFSC";
954 case SCARD_ATTR_CURRENT_IFSD:
955 return "SCARD_ATTR_CURRENT_IFSD";
957 case SCARD_ATTR_CURRENT_BWT:
958 return "SCARD_ATTR_CURRENT_BWT";
960 case SCARD_ATTR_CURRENT_CWT:
961 return "SCARD_ATTR_CURRENT_CWT";
963 case SCARD_ATTR_CURRENT_EBC_ENCODING:
964 return "SCARD_ATTR_CURRENT_EBC_ENCODING";
966 case SCARD_ATTR_EXTENDED_BWT:
967 return "SCARD_ATTR_EXTENDED_BWT";
969 case SCARD_ATTR_ICC_PRESENCE:
970 return "SCARD_ATTR_ICC_PRESENCE";
972 case SCARD_ATTR_ICC_INTERFACE_STATUS:
973 return "SCARD_ATTR_ICC_INTERFACE_STATUS";
975 case SCARD_ATTR_CURRENT_IO_STATE:
976 return "SCARD_ATTR_CURRENT_IO_STATE";
978 case SCARD_ATTR_ATR_STRING:
979 return "SCARD_ATTR_ATR_STRING";
981 case SCARD_ATTR_ICC_TYPE_PER_ATR:
982 return "SCARD_ATTR_ICC_TYPE_PER_ATR";
984 case SCARD_ATTR_ESC_RESET:
985 return "SCARD_ATTR_ESC_RESET";
987 case SCARD_ATTR_ESC_CANCEL:
988 return "SCARD_ATTR_ESC_CANCEL";
990 case SCARD_ATTR_ESC_AUTHREQUEST:
991 return "SCARD_ATTR_ESC_AUTHREQUEST";
993 case SCARD_ATTR_MAXINPUT:
994 return "SCARD_ATTR_MAXINPUT";
996 case SCARD_ATTR_DEVICE_UNIT:
997 return "SCARD_ATTR_DEVICE_UNIT";
999 case SCARD_ATTR_DEVICE_IN_USE:
1000 return "SCARD_ATTR_DEVICE_IN_USE";
1002 case SCARD_ATTR_DEVICE_FRIENDLY_NAME_A:
1003 return "SCARD_ATTR_DEVICE_FRIENDLY_NAME_A";
1005 case SCARD_ATTR_DEVICE_SYSTEM_NAME_A:
1006 return "SCARD_ATTR_DEVICE_SYSTEM_NAME_A";
1008 case SCARD_ATTR_DEVICE_FRIENDLY_NAME_W:
1009 return "SCARD_ATTR_DEVICE_FRIENDLY_NAME_W";
1011 case SCARD_ATTR_DEVICE_SYSTEM_NAME_W:
1012 return "SCARD_ATTR_DEVICE_SYSTEM_NAME_W";
1014 case SCARD_ATTR_SUPRESS_T1_IFS_REQUEST:
1015 return "SCARD_ATTR_SUPRESS_T1_IFS_REQUEST";
1018 return "SCARD_ATTR_UNKNOWN";
1022WINSCARDAPI
const char* WINAPI SCardGetProtocolString(DWORD dwProtocols)
1024 if (dwProtocols == SCARD_PROTOCOL_UNDEFINED)
1025 return "SCARD_PROTOCOL_UNDEFINED";
1027 if (dwProtocols == SCARD_PROTOCOL_T0)
1028 return "SCARD_PROTOCOL_T0";
1030 if (dwProtocols == SCARD_PROTOCOL_T1)
1031 return "SCARD_PROTOCOL_T1";
1033 if (dwProtocols == SCARD_PROTOCOL_Tx)
1034 return "SCARD_PROTOCOL_Tx";
1036 if (dwProtocols == SCARD_PROTOCOL_RAW)
1037 return "SCARD_PROTOCOL_RAW";
1039 if (dwProtocols == SCARD_PROTOCOL_DEFAULT)
1040 return "SCARD_PROTOCOL_DEFAULT";
1042 if (dwProtocols == (SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_RAW))
1043 return "SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_RAW";
1045 if (dwProtocols == (SCARD_PROTOCOL_T1 | SCARD_PROTOCOL_RAW))
1046 return "SCARD_PROTOCOL_T1 | SCARD_PROTOCOL_RAW";
1048 if (dwProtocols == (SCARD_PROTOCOL_Tx | SCARD_PROTOCOL_RAW))
1049 return "SCARD_PROTOCOL_Tx | SCARD_PROTOCOL_RAW";
1051 return "SCARD_PROTOCOL_UNKNOWN";
1054WINSCARDAPI
const char* WINAPI SCardGetShareModeString(DWORD dwShareMode)
1056 switch (dwShareMode)
1058 case SCARD_SHARE_EXCLUSIVE:
1059 return "SCARD_SHARE_EXCLUSIVE";
1061 case SCARD_SHARE_SHARED:
1062 return "SCARD_SHARE_SHARED";
1064 case SCARD_SHARE_DIRECT:
1065 return "SCARD_SHARE_DIRECT";
1068 return "SCARD_SHARE_UNKNOWN";
1072WINSCARDAPI
const char* WINAPI SCardGetDispositionString(DWORD dwDisposition)
1074 switch (dwDisposition)
1076 case SCARD_LEAVE_CARD:
1077 return "SCARD_LEAVE_CARD";
1079 case SCARD_RESET_CARD:
1080 return "SCARD_RESET_CARD";
1082 case SCARD_UNPOWER_CARD:
1083 return "SCARD_UNPOWER_CARD";
1086 return "SCARD_UNKNOWN_CARD";
1090WINSCARDAPI
const char* WINAPI SCardGetScopeString(DWORD dwScope)
1094 case SCARD_SCOPE_USER:
1095 return "SCARD_SCOPE_USER";
1097 case SCARD_SCOPE_TERMINAL:
1098 return "SCARD_SCOPE_TERMINAL";
1100 case SCARD_SCOPE_SYSTEM:
1101 return "SCARD_SCOPE_SYSTEM";
1104 return "SCARD_SCOPE_UNKNOWN";
1108WINSCARDAPI
const char* WINAPI SCardGetCardStateString(DWORD dwCardState)
1110 switch (dwCardState)
1113 return "SCARD_UNKNOWN";
1116 return "SCARD_ABSENT";
1119 return "SCARD_PRESENT";
1121 case SCARD_SWALLOWED:
1122 return "SCARD_SWALLOWED";
1125 return "SCARD_POWERED";
1127 case SCARD_NEGOTIABLE:
1128 return "SCARD_NEGOTIABLE";
1130 case SCARD_SPECIFIC:
1131 return "SCARD_SPECIFIC";
1134 return "SCARD_UNKNOWN";
1138WINSCARDAPI
char* WINAPI SCardGetReaderStateString(DWORD dwReaderState)
1140 const size_t size = 512;
1141 char* buffer = calloc(size,
sizeof(
char));
1146 if (dwReaderState & SCARD_STATE_IGNORE)
1147 winpr_str_append(
"SCARD_STATE_IGNORE", buffer, size,
"|");
1149 if (dwReaderState & SCARD_STATE_CHANGED)
1150 winpr_str_append(
"SCARD_STATE_CHANGED", buffer, size,
"|");
1152 if (dwReaderState & SCARD_STATE_UNKNOWN)
1153 winpr_str_append(
"SCARD_STATE_UNKNOWN", buffer, size,
"|");
1155 if (dwReaderState & SCARD_STATE_UNAVAILABLE)
1156 winpr_str_append(
"SCARD_STATE_UNAVAILABLE", buffer, size,
"|");
1158 if (dwReaderState & SCARD_STATE_EMPTY)
1159 winpr_str_append(
"SCARD_STATE_EMPTY", buffer, size,
"|");
1161 if (dwReaderState & SCARD_STATE_PRESENT)
1162 winpr_str_append(
"SCARD_STATE_PRESENT", buffer, size,
"|");
1164 if (dwReaderState & SCARD_STATE_ATRMATCH)
1165 winpr_str_append(
"SCARD_STATE_ATRMATCH", buffer, size,
"|");
1167 if (dwReaderState & SCARD_STATE_EXCLUSIVE)
1168 winpr_str_append(
"SCARD_STATE_EXCLUSIVE", buffer, size,
"|");
1170 if (dwReaderState & SCARD_STATE_INUSE)
1171 winpr_str_append(
"SCARD_STATE_INUSE", buffer, size,
"|");
1173 if (dwReaderState & SCARD_STATE_MUTE)
1174 winpr_str_append(
"SCARD_STATE_MUTE", buffer, size,
"|");
1176 if (dwReaderState & SCARD_STATE_UNPOWERED)
1177 winpr_str_append(
"SCARD_STATE_UNPOWERED", buffer, size,
"|");
1180 winpr_str_append(
"SCARD_STATE_UNAWARE", buffer, size,
"|");
1185#define WINSCARD_LOAD_PROC(_name) \
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 \
1195 HMODULE hWinSCardLibrary)
1197 WINPR_ASSERT(pWinSCardApiTable);
1198 WINPR_ASSERT(hWinSCardLibrary);
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);
1284 SCardEstablishContext,
1285 SCardReleaseContext,
1286 SCardIsValidContext,
1287 SCardListReaderGroupsA,
1288 SCardListReaderGroupsW,
1293 SCardListInterfacesA,
1294 SCardListInterfacesW,
1295 SCardGetProviderIdA,
1296 SCardGetProviderIdW,
1297 SCardGetCardTypeProviderNameA,
1298 SCardGetCardTypeProviderNameW,
1299 SCardIntroduceReaderGroupA,
1300 SCardIntroduceReaderGroupW,
1301 SCardForgetReaderGroupA,
1302 SCardForgetReaderGroupW,
1303 SCardIntroduceReaderA,
1304 SCardIntroduceReaderW,
1307 SCardAddReaderToGroupA,
1308 SCardAddReaderToGroupW,
1309 SCardRemoveReaderFromGroupA,
1310 SCardRemoveReaderFromGroupW,
1311 SCardIntroduceCardTypeA,
1312 SCardIntroduceCardTypeW,
1313 SCardSetCardTypeProviderNameA,
1314 SCardSetCardTypeProviderNameW,
1315 SCardForgetCardTypeA,
1316 SCardForgetCardTypeW,
1318 SCardAccessStartedEvent,
1319 SCardReleaseStartedEvent,
1322 SCardLocateCardsByATRA,
1323 SCardLocateCardsByATRW,
1324 SCardGetStatusChangeA,
1325 SCardGetStatusChangeW,
1331 SCardBeginTransaction,
1332 SCardEndTransaction,
1333 SCardCancelTransaction,
1338 SCardGetTransmitCount,
1342 SCardUIDlgSelectCardA,
1343 SCardUIDlgSelectCardW,
1346 SCardDlgExtendedError,
1351 SCardGetReaderIconA,
1352 SCardGetReaderIconW,
1353 SCardGetDeviceTypeIdA,
1354 SCardGetDeviceTypeIdW,
1355 SCardGetReaderDeviceInstanceIdA,
1356 SCardGetReaderDeviceInstanceIdW,
1357 SCardListReadersWithDeviceInstanceIdA,
1358 SCardListReadersWithDeviceInstanceIdW,
1364 return &WinPR_SCardApiFunctionTable;