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 InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, NULL, NULL); \
49 if (!g_SCardApi || !g_SCardApi->pfn##_name) \
51 WLog_DBG(TAG, "Missing function pointer g_SCardApi=%p->" xstr(pfn##_name) "=%p", \
52 WINPR_CXX_COMPAT_CAST(const void*, g_SCardApi), \
53 WINPR_CXX_COMPAT_CAST(const void*, g_SCardApi ? g_SCardApi->pfn##_name : NULL)); \
54 return SCARD_E_NO_SERVICE; \
56 return g_SCardApi->pfn##_name(__VA_ARGS__)
58#define SCARDAPI_STUB_CALL_HANDLE(_name) \
59 InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, NULL, NULL); \
60 if (!g_SCardApi || !g_SCardApi->pfn##_name) \
62 WLog_DBG(TAG, "Missing function pointer g_SCardApi=%p->" xstr(pfn##_name) "=%p", \
63 WINPR_CXX_COMPAT_CAST(const void*, g_SCardApi), \
64 WINPR_CXX_COMPAT_CAST(const void*, g_SCardApi ? g_SCardApi->pfn##_name : NULL)); \
67 return g_SCardApi->pfn##_name()
69#define SCARDAPI_STUB_CALL_VOID(_name) \
70 InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, NULL, NULL); \
71 if (!g_SCardApi || !g_SCardApi->pfn##_name) \
73 WLog_DBG(TAG, "Missing function pointer g_SCardApi=%p->" xstr(pfn##_name) "=%p", \
74 WINPR_CXX_COMPAT_CAST(const void*, g_SCardApi), \
75 WINPR_CXX_COMPAT_CAST(const void*, g_SCardApi ? g_SCardApi->pfn##_name : NULL)); \
78 g_SCardApi->pfn##_name()
88static BOOL CALLBACK InitializeSCardApiStubs(WINPR_ATTR_UNUSED
PINIT_ONCE once,
89 WINPR_ATTR_UNUSED PVOID param,
90 WINPR_ATTR_UNUSED PVOID* context)
93 if (Windows_InitializeSCardApi() >= 0)
94 g_SCardApi = Windows_GetSCardApiFunctionTable();
96#if defined(WITH_SMARTCARD_PCSC)
97 if (PCSC_InitializeSCardApi() >= 0)
98 g_SCardApi = PCSC_GetSCardApiFunctionTable();
102#if defined(WITH_SMARTCARD_INSPECT)
103 g_SCardApi = Inspect_RegisterSCardApi(g_SCardApi);
108WINSCARDAPI LONG WINAPI SCardEstablishContext(DWORD dwScope, LPCVOID pvReserved1,
109 LPCVOID pvReserved2, LPSCARDCONTEXT phContext)
111 SCARDAPI_STUB_CALL_LONG(SCardEstablishContext, dwScope, pvReserved1, pvReserved2, phContext);
114WINSCARDAPI LONG WINAPI SCardReleaseContext(SCARDCONTEXT hContext)
116 SCARDAPI_STUB_CALL_LONG(SCardReleaseContext, hContext);
119WINSCARDAPI LONG WINAPI SCardIsValidContext(SCARDCONTEXT hContext)
121 SCARDAPI_STUB_CALL_LONG(SCardIsValidContext, hContext);
124WINSCARDAPI LONG WINAPI SCardListReaderGroupsA(SCARDCONTEXT hContext, LPSTR mszGroups,
127 SCARDAPI_STUB_CALL_LONG(SCardListReaderGroupsA, hContext, mszGroups, pcchGroups);
130WINSCARDAPI LONG WINAPI SCardListReaderGroupsW(SCARDCONTEXT hContext, LPWSTR mszGroups,
133 SCARDAPI_STUB_CALL_LONG(SCardListReaderGroupsW, hContext, mszGroups, pcchGroups);
136WINSCARDAPI LONG WINAPI SCardListReadersA(SCARDCONTEXT hContext, LPCSTR mszGroups, LPSTR mszReaders,
139 SCARDAPI_STUB_CALL_LONG(SCardListReadersA, hContext, mszGroups, mszReaders, pcchReaders);
142WINSCARDAPI LONG WINAPI SCardListReadersW(SCARDCONTEXT hContext, LPCWSTR mszGroups,
143 LPWSTR mszReaders, LPDWORD pcchReaders)
145 SCARDAPI_STUB_CALL_LONG(SCardListReadersW, hContext, mszGroups, mszReaders, pcchReaders);
148WINSCARDAPI LONG WINAPI SCardListCardsA(SCARDCONTEXT hContext, LPCBYTE pbAtr,
149 LPCGUID rgquidInterfaces, DWORD cguidInterfaceCount,
150 CHAR* mszCards, LPDWORD pcchCards)
152 SCARDAPI_STUB_CALL_LONG(SCardListCardsA, hContext, pbAtr, rgquidInterfaces, cguidInterfaceCount,
153 mszCards, pcchCards);
156WINSCARDAPI LONG WINAPI SCardListCardsW(SCARDCONTEXT hContext, LPCBYTE pbAtr,
157 LPCGUID rgquidInterfaces, DWORD cguidInterfaceCount,
158 WCHAR* mszCards, LPDWORD pcchCards)
160 SCARDAPI_STUB_CALL_LONG(SCardListCardsW, hContext, pbAtr, rgquidInterfaces, cguidInterfaceCount,
161 mszCards, pcchCards);
164WINSCARDAPI LONG WINAPI SCardListInterfacesA(SCARDCONTEXT hContext, LPCSTR szCard,
165 LPGUID pguidInterfaces, LPDWORD pcguidInterfaces)
167 SCARDAPI_STUB_CALL_LONG(SCardListInterfacesA, hContext, szCard, pguidInterfaces,
171WINSCARDAPI LONG WINAPI SCardListInterfacesW(SCARDCONTEXT hContext, LPCWSTR szCard,
172 LPGUID pguidInterfaces, LPDWORD pcguidInterfaces)
174 SCARDAPI_STUB_CALL_LONG(SCardListInterfacesW, hContext, szCard, pguidInterfaces,
178WINSCARDAPI LONG WINAPI SCardGetProviderIdA(SCARDCONTEXT hContext, LPCSTR szCard,
179 LPGUID pguidProviderId)
181 SCARDAPI_STUB_CALL_LONG(SCardGetProviderIdA, hContext, szCard, pguidProviderId);
184WINSCARDAPI LONG WINAPI SCardGetProviderIdW(SCARDCONTEXT hContext, LPCWSTR szCard,
185 LPGUID pguidProviderId)
187 SCARDAPI_STUB_CALL_LONG(SCardGetProviderIdW, hContext, szCard, pguidProviderId);
190WINSCARDAPI LONG WINAPI SCardGetCardTypeProviderNameA(SCARDCONTEXT hContext, LPCSTR szCardName,
191 DWORD dwProviderId, CHAR* szProvider,
192 LPDWORD pcchProvider)
194 SCARDAPI_STUB_CALL_LONG(SCardGetCardTypeProviderNameA, hContext, szCardName, dwProviderId,
195 szProvider, pcchProvider);
198WINSCARDAPI LONG WINAPI SCardGetCardTypeProviderNameW(SCARDCONTEXT hContext, LPCWSTR szCardName,
199 DWORD dwProviderId, WCHAR* szProvider,
200 LPDWORD pcchProvider)
202 SCARDAPI_STUB_CALL_LONG(SCardGetCardTypeProviderNameW, hContext, szCardName, dwProviderId,
203 szProvider, pcchProvider);
206WINSCARDAPI LONG WINAPI SCardIntroduceReaderGroupA(SCARDCONTEXT hContext, LPCSTR szGroupName)
208 SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderGroupA, hContext, szGroupName);
211WINSCARDAPI LONG WINAPI SCardIntroduceReaderGroupW(SCARDCONTEXT hContext, LPCWSTR szGroupName)
213 SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderGroupW, hContext, szGroupName);
216WINSCARDAPI LONG WINAPI SCardForgetReaderGroupA(SCARDCONTEXT hContext, LPCSTR szGroupName)
218 SCARDAPI_STUB_CALL_LONG(SCardForgetReaderGroupA, hContext, szGroupName);
221WINSCARDAPI LONG WINAPI SCardForgetReaderGroupW(SCARDCONTEXT hContext, LPCWSTR szGroupName)
223 SCARDAPI_STUB_CALL_LONG(SCardForgetReaderGroupW, hContext, szGroupName);
226WINSCARDAPI LONG WINAPI SCardIntroduceReaderA(SCARDCONTEXT hContext, LPCSTR szReaderName,
229 SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderA, hContext, szReaderName, szDeviceName);
232WINSCARDAPI LONG WINAPI SCardIntroduceReaderW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
233 LPCWSTR szDeviceName)
235 SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderW, hContext, szReaderName, szDeviceName);
238WINSCARDAPI LONG WINAPI SCardForgetReaderA(SCARDCONTEXT hContext, LPCSTR szReaderName)
240 SCARDAPI_STUB_CALL_LONG(SCardForgetReaderA, hContext, szReaderName);
243WINSCARDAPI LONG WINAPI SCardForgetReaderW(SCARDCONTEXT hContext, LPCWSTR szReaderName)
245 SCARDAPI_STUB_CALL_LONG(SCardForgetReaderW, hContext, szReaderName);
248WINSCARDAPI LONG WINAPI SCardAddReaderToGroupA(SCARDCONTEXT hContext, LPCSTR szReaderName,
251 SCARDAPI_STUB_CALL_LONG(SCardAddReaderToGroupA, hContext, szReaderName, szGroupName);
254WINSCARDAPI LONG WINAPI SCardAddReaderToGroupW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
257 SCARDAPI_STUB_CALL_LONG(SCardAddReaderToGroupW, hContext, szReaderName, szGroupName);
260WINSCARDAPI LONG WINAPI SCardRemoveReaderFromGroupA(SCARDCONTEXT hContext, LPCSTR szReaderName,
263 SCARDAPI_STUB_CALL_LONG(SCardRemoveReaderFromGroupA, hContext, szReaderName, szGroupName);
266WINSCARDAPI LONG WINAPI SCardRemoveReaderFromGroupW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
269 SCARDAPI_STUB_CALL_LONG(SCardRemoveReaderFromGroupW, hContext, szReaderName, szGroupName);
272WINSCARDAPI LONG WINAPI SCardIntroduceCardTypeA(SCARDCONTEXT hContext, LPCSTR szCardName,
273 LPCGUID pguidPrimaryProvider,
274 LPCGUID rgguidInterfaces, DWORD dwInterfaceCount,
275 LPCBYTE pbAtr, LPCBYTE pbAtrMask, DWORD cbAtrLen)
277 SCARDAPI_STUB_CALL_LONG(SCardIntroduceCardTypeA, hContext, szCardName, pguidPrimaryProvider,
278 rgguidInterfaces, dwInterfaceCount, pbAtr, pbAtrMask, cbAtrLen);
281WINSCARDAPI LONG WINAPI SCardIntroduceCardTypeW(SCARDCONTEXT hContext, LPCWSTR szCardName,
282 LPCGUID pguidPrimaryProvider,
283 LPCGUID rgguidInterfaces, DWORD dwInterfaceCount,
284 LPCBYTE pbAtr, LPCBYTE pbAtrMask, DWORD cbAtrLen)
286 SCARDAPI_STUB_CALL_LONG(SCardIntroduceCardTypeW, hContext, szCardName, pguidPrimaryProvider,
287 rgguidInterfaces, dwInterfaceCount, pbAtr, pbAtrMask, cbAtrLen);
290WINSCARDAPI LONG WINAPI SCardSetCardTypeProviderNameA(SCARDCONTEXT hContext, LPCSTR szCardName,
291 DWORD dwProviderId, LPCSTR szProvider)
293 SCARDAPI_STUB_CALL_LONG(SCardSetCardTypeProviderNameA, hContext, szCardName, dwProviderId,
297WINSCARDAPI LONG WINAPI SCardSetCardTypeProviderNameW(SCARDCONTEXT hContext, LPCWSTR szCardName,
298 DWORD dwProviderId, LPCWSTR szProvider)
300 SCARDAPI_STUB_CALL_LONG(SCardSetCardTypeProviderNameW, hContext, szCardName, dwProviderId,
304WINSCARDAPI LONG WINAPI SCardForgetCardTypeA(SCARDCONTEXT hContext, LPCSTR szCardName)
306 SCARDAPI_STUB_CALL_LONG(SCardForgetCardTypeA, hContext, szCardName);
309WINSCARDAPI LONG WINAPI SCardForgetCardTypeW(SCARDCONTEXT hContext, LPCWSTR szCardName)
311 SCARDAPI_STUB_CALL_LONG(SCardForgetCardTypeW, hContext, szCardName);
314WINSCARDAPI LONG WINAPI SCardFreeMemory(SCARDCONTEXT hContext, LPVOID pvMem)
316 SCARDAPI_STUB_CALL_LONG(SCardFreeMemory, hContext, pvMem);
319WINSCARDAPI HANDLE WINAPI SCardAccessStartedEvent(
void)
321 SCARDAPI_STUB_CALL_HANDLE(SCardAccessStartedEvent);
324WINSCARDAPI
void WINAPI SCardReleaseStartedEvent(
void)
326 SCARDAPI_STUB_CALL_VOID(SCardReleaseStartedEvent);
329WINSCARDAPI LONG WINAPI SCardLocateCardsA(SCARDCONTEXT hContext, LPCSTR mszCards,
332 SCARDAPI_STUB_CALL_LONG(SCardLocateCardsA, hContext, mszCards, rgReaderStates, cReaders);
335WINSCARDAPI LONG WINAPI SCardLocateCardsW(SCARDCONTEXT hContext, LPCWSTR mszCards,
338 SCARDAPI_STUB_CALL_LONG(SCardLocateCardsW, hContext, mszCards, rgReaderStates, cReaders);
341WINSCARDAPI LONG WINAPI SCardLocateCardsByATRA(SCARDCONTEXT hContext,
LPSCARD_ATRMASK rgAtrMasks,
345 SCARDAPI_STUB_CALL_LONG(SCardLocateCardsByATRA, hContext, rgAtrMasks, cAtrs, rgReaderStates,
349WINSCARDAPI LONG WINAPI SCardLocateCardsByATRW(SCARDCONTEXT hContext,
LPSCARD_ATRMASK rgAtrMasks,
353 SCARDAPI_STUB_CALL_LONG(SCardLocateCardsByATRW, hContext, rgAtrMasks, cAtrs, rgReaderStates,
357WINSCARDAPI LONG WINAPI SCardGetStatusChangeA(SCARDCONTEXT hContext, DWORD dwTimeout,
360 SCARDAPI_STUB_CALL_LONG(SCardGetStatusChangeA, hContext, dwTimeout, rgReaderStates, cReaders);
363WINSCARDAPI LONG WINAPI SCardGetStatusChangeW(SCARDCONTEXT hContext, DWORD dwTimeout,
366 SCARDAPI_STUB_CALL_LONG(SCardGetStatusChangeW, hContext, dwTimeout, rgReaderStates, cReaders);
369WINSCARDAPI LONG WINAPI SCardCancel(SCARDCONTEXT hContext)
371 SCARDAPI_STUB_CALL_LONG(SCardCancel, hContext);
374WINSCARDAPI LONG WINAPI SCardConnectA(SCARDCONTEXT hContext, LPCSTR szReader, DWORD dwShareMode,
375 DWORD dwPreferredProtocols, LPSCARDHANDLE phCard,
376 LPDWORD pdwActiveProtocol)
378 SCARDAPI_STUB_CALL_LONG(SCardConnectA, hContext, szReader, dwShareMode, dwPreferredProtocols,
379 phCard, pdwActiveProtocol);
382WINSCARDAPI LONG WINAPI SCardConnectW(SCARDCONTEXT hContext, LPCWSTR szReader, DWORD dwShareMode,
383 DWORD dwPreferredProtocols, LPSCARDHANDLE phCard,
384 LPDWORD pdwActiveProtocol)
386 SCARDAPI_STUB_CALL_LONG(SCardConnectW, hContext, szReader, dwShareMode, dwPreferredProtocols,
387 phCard, pdwActiveProtocol);
390WINSCARDAPI LONG WINAPI SCardReconnect(SCARDHANDLE hCard, DWORD dwShareMode,
391 DWORD dwPreferredProtocols, DWORD dwInitialization,
392 LPDWORD pdwActiveProtocol)
394 SCARDAPI_STUB_CALL_LONG(SCardReconnect, hCard, dwShareMode, dwPreferredProtocols,
395 dwInitialization, pdwActiveProtocol);
398WINSCARDAPI LONG WINAPI SCardDisconnect(SCARDHANDLE hCard, DWORD dwDisposition)
400 SCARDAPI_STUB_CALL_LONG(SCardDisconnect, hCard, dwDisposition);
403WINSCARDAPI LONG WINAPI SCardBeginTransaction(SCARDHANDLE hCard)
405 SCARDAPI_STUB_CALL_LONG(SCardBeginTransaction, hCard);
408WINSCARDAPI LONG WINAPI SCardEndTransaction(SCARDHANDLE hCard, DWORD dwDisposition)
410 SCARDAPI_STUB_CALL_LONG(SCardEndTransaction, hCard, dwDisposition);
413WINSCARDAPI LONG WINAPI SCardCancelTransaction(SCARDHANDLE hCard)
415 SCARDAPI_STUB_CALL_LONG(SCardCancelTransaction, hCard);
418WINSCARDAPI LONG WINAPI SCardState(SCARDHANDLE hCard, LPDWORD pdwState, LPDWORD pdwProtocol,
419 LPBYTE pbAtr, LPDWORD pcbAtrLen)
421 SCARDAPI_STUB_CALL_LONG(SCardState, hCard, pdwState, pdwProtocol, pbAtr, pcbAtrLen);
424WINSCARDAPI LONG WINAPI SCardStatusA(SCARDHANDLE hCard, LPSTR mszReaderNames, LPDWORD pcchReaderLen,
425 LPDWORD pdwState, LPDWORD pdwProtocol, LPBYTE pbAtr,
428 SCARDAPI_STUB_CALL_LONG(SCardStatusA, hCard, mszReaderNames, pcchReaderLen, pdwState,
429 pdwProtocol, pbAtr, pcbAtrLen);
432WINSCARDAPI LONG WINAPI SCardStatusW(SCARDHANDLE hCard, LPWSTR mszReaderNames,
433 LPDWORD pcchReaderLen, LPDWORD pdwState, LPDWORD pdwProtocol,
434 LPBYTE pbAtr, LPDWORD pcbAtrLen)
436 SCARDAPI_STUB_CALL_LONG(SCardStatusW, hCard, mszReaderNames, pcchReaderLen, pdwState,
437 pdwProtocol, pbAtr, pcbAtrLen);
441 LPCBYTE pbSendBuffer, DWORD cbSendLength,
443 LPDWORD pcbRecvLength)
445 SCARDAPI_STUB_CALL_LONG(SCardTransmit, hCard, pioSendPci, pbSendBuffer, cbSendLength,
446 pioRecvPci, pbRecvBuffer, pcbRecvLength);
449WINSCARDAPI LONG WINAPI SCardGetTransmitCount(SCARDHANDLE hCard, LPDWORD pcTransmitCount)
451 SCARDAPI_STUB_CALL_LONG(SCardGetTransmitCount, hCard, pcTransmitCount);
454WINSCARDAPI LONG WINAPI SCardControl(SCARDHANDLE hCard, DWORD dwControlCode, LPCVOID lpInBuffer,
455 DWORD cbInBufferSize, LPVOID lpOutBuffer,
456 DWORD cbOutBufferSize, LPDWORD lpBytesReturned)
458 SCARDAPI_STUB_CALL_LONG(SCardControl, hCard, dwControlCode, lpInBuffer, cbInBufferSize,
459 lpOutBuffer, cbOutBufferSize, lpBytesReturned);
462WINSCARDAPI LONG WINAPI SCardGetAttrib(SCARDHANDLE hCard, DWORD dwAttrId, LPBYTE pbAttr,
465 SCARDAPI_STUB_CALL_LONG(SCardGetAttrib, hCard, dwAttrId, pbAttr, pcbAttrLen);
468WINSCARDAPI LONG WINAPI SCardSetAttrib(SCARDHANDLE hCard, DWORD dwAttrId, LPCBYTE pbAttr,
471 SCARDAPI_STUB_CALL_LONG(SCardSetAttrib, hCard, dwAttrId, pbAttr, cbAttrLen);
474WINSCARDAPI LONG WINAPI SCardUIDlgSelectCardA(LPOPENCARDNAMEA_EX pDlgStruc)
476 SCARDAPI_STUB_CALL_LONG(SCardUIDlgSelectCardA, pDlgStruc);
479WINSCARDAPI LONG WINAPI SCardUIDlgSelectCardW(LPOPENCARDNAMEW_EX pDlgStruc)
481 SCARDAPI_STUB_CALL_LONG(SCardUIDlgSelectCardW, pDlgStruc);
486 SCARDAPI_STUB_CALL_LONG(GetOpenCardNameA, pDlgStruc);
491 SCARDAPI_STUB_CALL_LONG(GetOpenCardNameW, pDlgStruc);
494WINSCARDAPI LONG WINAPI SCardDlgExtendedError(
void)
496 SCARDAPI_STUB_CALL_LONG(SCardDlgExtendedError);
499WINSCARDAPI LONG WINAPI SCardReadCacheA(SCARDCONTEXT hContext,
UUID* CardIdentifier,
500 DWORD FreshnessCounter, LPSTR LookupName, PBYTE Data,
503 SCARDAPI_STUB_CALL_LONG(SCardReadCacheA, hContext, CardIdentifier, FreshnessCounter, LookupName,
507WINSCARDAPI LONG WINAPI SCardReadCacheW(SCARDCONTEXT hContext,
UUID* CardIdentifier,
508 DWORD FreshnessCounter, LPWSTR LookupName, PBYTE Data,
511 SCARDAPI_STUB_CALL_LONG(SCardReadCacheW, hContext, CardIdentifier, FreshnessCounter, LookupName,
515WINSCARDAPI LONG WINAPI SCardWriteCacheA(SCARDCONTEXT hContext,
UUID* CardIdentifier,
516 DWORD FreshnessCounter, LPSTR LookupName, PBYTE Data,
519 SCARDAPI_STUB_CALL_LONG(SCardWriteCacheA, hContext, CardIdentifier, FreshnessCounter,
520 LookupName, Data, DataLen);
523WINSCARDAPI LONG WINAPI SCardWriteCacheW(SCARDCONTEXT hContext,
UUID* CardIdentifier,
524 DWORD FreshnessCounter, LPWSTR LookupName, PBYTE Data,
527 SCARDAPI_STUB_CALL_LONG(SCardWriteCacheW, hContext, CardIdentifier, FreshnessCounter,
528 LookupName, Data, DataLen);
531WINSCARDAPI LONG WINAPI SCardGetReaderIconA(SCARDCONTEXT hContext, LPCSTR szReaderName,
532 LPBYTE pbIcon, LPDWORD pcbIcon)
534 SCARDAPI_STUB_CALL_LONG(SCardGetReaderIconA, hContext, szReaderName, pbIcon, pcbIcon);
537WINSCARDAPI LONG WINAPI SCardGetReaderIconW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
538 LPBYTE pbIcon, LPDWORD pcbIcon)
540 SCARDAPI_STUB_CALL_LONG(SCardGetReaderIconW, hContext, szReaderName, pbIcon, pcbIcon);
543WINSCARDAPI LONG WINAPI SCardGetDeviceTypeIdA(SCARDCONTEXT hContext, LPCSTR szReaderName,
544 LPDWORD pdwDeviceTypeId)
546 SCARDAPI_STUB_CALL_LONG(SCardGetDeviceTypeIdA, hContext, szReaderName, pdwDeviceTypeId);
549WINSCARDAPI LONG WINAPI SCardGetDeviceTypeIdW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
550 LPDWORD pdwDeviceTypeId)
552 SCARDAPI_STUB_CALL_LONG(SCardGetDeviceTypeIdW, hContext, szReaderName, pdwDeviceTypeId);
555WINSCARDAPI LONG WINAPI SCardGetReaderDeviceInstanceIdA(SCARDCONTEXT hContext, LPCSTR szReaderName,
556 LPSTR szDeviceInstanceId,
557 LPDWORD pcchDeviceInstanceId)
559 SCARDAPI_STUB_CALL_LONG(SCardGetReaderDeviceInstanceIdA, hContext, szReaderName,
560 szDeviceInstanceId, pcchDeviceInstanceId);
563WINSCARDAPI LONG WINAPI SCardGetReaderDeviceInstanceIdW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
564 LPWSTR szDeviceInstanceId,
565 LPDWORD pcchDeviceInstanceId)
567 SCARDAPI_STUB_CALL_LONG(SCardGetReaderDeviceInstanceIdW, hContext, szReaderName,
568 szDeviceInstanceId, pcchDeviceInstanceId);
571WINSCARDAPI LONG WINAPI SCardListReadersWithDeviceInstanceIdA(SCARDCONTEXT hContext,
572 LPCSTR szDeviceInstanceId,
573 LPSTR mszReaders, LPDWORD pcchReaders)
575 SCARDAPI_STUB_CALL_LONG(SCardListReadersWithDeviceInstanceIdA, hContext, szDeviceInstanceId,
576 mszReaders, pcchReaders);
579WINSCARDAPI LONG WINAPI SCardListReadersWithDeviceInstanceIdW(SCARDCONTEXT hContext,
580 LPCWSTR szDeviceInstanceId,
584 SCARDAPI_STUB_CALL_LONG(SCardListReadersWithDeviceInstanceIdW, hContext, szDeviceInstanceId,
585 mszReaders, pcchReaders);
588WINSCARDAPI LONG WINAPI SCardAudit(SCARDCONTEXT hContext, DWORD dwEvent)
590 SCARDAPI_STUB_CALL_LONG(SCardAudit, hContext, dwEvent);
597WINSCARDAPI
const char* WINAPI SCardGetErrorString(LONG errorCode)
601 case SCARD_S_SUCCESS:
602 return "SCARD_S_SUCCESS";
604 case SCARD_F_INTERNAL_ERROR:
605 return "SCARD_F_INTERNAL_ERROR";
607 case SCARD_E_CANCELLED:
608 return "SCARD_E_CANCELLED";
610 case SCARD_E_INVALID_HANDLE:
611 return "SCARD_E_INVALID_HANDLE";
613 case SCARD_E_INVALID_PARAMETER:
614 return "SCARD_E_INVALID_PARAMETER";
616 case SCARD_E_INVALID_TARGET:
617 return "SCARD_E_INVALID_TARGET";
619 case SCARD_E_NO_MEMORY:
620 return "SCARD_E_NO_MEMORY";
622 case SCARD_F_WAITED_TOO_LONG:
623 return "SCARD_F_WAITED_TOO_LONG";
625 case SCARD_E_INSUFFICIENT_BUFFER:
626 return "SCARD_E_INSUFFICIENT_BUFFER";
628 case SCARD_E_UNKNOWN_READER:
629 return "SCARD_E_UNKNOWN_READER";
631 case SCARD_E_TIMEOUT:
632 return "SCARD_E_TIMEOUT";
634 case SCARD_E_SHARING_VIOLATION:
635 return "SCARD_E_SHARING_VIOLATION";
637 case SCARD_E_NO_SMARTCARD:
638 return "SCARD_E_NO_SMARTCARD";
640 case SCARD_E_UNKNOWN_CARD:
641 return "SCARD_E_UNKNOWN_CARD";
643 case SCARD_E_CANT_DISPOSE:
644 return "SCARD_E_CANT_DISPOSE";
646 case SCARD_E_PROTO_MISMATCH:
647 return "SCARD_E_PROTO_MISMATCH";
649 case SCARD_E_NOT_READY:
650 return "SCARD_E_NOT_READY";
652 case SCARD_E_INVALID_VALUE:
653 return "SCARD_E_INVALID_VALUE";
655 case SCARD_E_SYSTEM_CANCELLED:
656 return "SCARD_E_SYSTEM_CANCELLED";
658 case SCARD_F_COMM_ERROR:
659 return "SCARD_F_COMM_ERROR";
661 case SCARD_F_UNKNOWN_ERROR:
662 return "SCARD_F_UNKNOWN_ERROR";
664 case SCARD_E_INVALID_ATR:
665 return "SCARD_E_INVALID_ATR";
667 case SCARD_E_NOT_TRANSACTED:
668 return "SCARD_E_NOT_TRANSACTED";
670 case SCARD_E_READER_UNAVAILABLE:
671 return "SCARD_E_READER_UNAVAILABLE";
673 case SCARD_P_SHUTDOWN:
674 return "SCARD_P_SHUTDOWN";
676 case SCARD_E_PCI_TOO_SMALL:
677 return "SCARD_E_PCI_TOO_SMALL";
679 case SCARD_E_READER_UNSUPPORTED:
680 return "SCARD_E_READER_UNSUPPORTED";
682 case SCARD_E_DUPLICATE_READER:
683 return "SCARD_E_DUPLICATE_READER";
685 case SCARD_E_CARD_UNSUPPORTED:
686 return "SCARD_E_CARD_UNSUPPORTED";
688 case SCARD_E_NO_SERVICE:
689 return "SCARD_E_NO_SERVICE";
691 case SCARD_E_SERVICE_STOPPED:
692 return "SCARD_E_SERVICE_STOPPED";
694 case SCARD_E_UNEXPECTED:
695 return "SCARD_E_UNEXPECTED";
697 case SCARD_E_ICC_INSTALLATION:
698 return "SCARD_E_ICC_INSTALLATION";
700 case SCARD_E_ICC_CREATEORDER:
701 return "SCARD_E_ICC_CREATEORDER";
703 case SCARD_E_UNSUPPORTED_FEATURE:
704 return "SCARD_E_UNSUPPORTED_FEATURE";
706 case SCARD_E_DIR_NOT_FOUND:
707 return "SCARD_E_DIR_NOT_FOUND";
709 case SCARD_E_FILE_NOT_FOUND:
710 return "SCARD_E_FILE_NOT_FOUND";
713 return "SCARD_E_NO_DIR";
715 case SCARD_E_NO_FILE:
716 return "SCARD_E_NO_FILE";
718 case SCARD_E_NO_ACCESS:
719 return "SCARD_E_NO_ACCESS";
721 case SCARD_E_WRITE_TOO_MANY:
722 return "SCARD_E_WRITE_TOO_MANY";
724 case SCARD_E_BAD_SEEK:
725 return "SCARD_E_BAD_SEEK";
727 case SCARD_E_INVALID_CHV:
728 return "SCARD_E_INVALID_CHV";
730 case SCARD_E_UNKNOWN_RES_MNG:
731 return "SCARD_E_UNKNOWN_RES_MNG";
733 case SCARD_E_NO_SUCH_CERTIFICATE:
734 return "SCARD_E_NO_SUCH_CERTIFICATE";
736 case SCARD_E_CERTIFICATE_UNAVAILABLE:
737 return "SCARD_E_CERTIFICATE_UNAVAILABLE";
739 case SCARD_E_NO_READERS_AVAILABLE:
740 return "SCARD_E_NO_READERS_AVAILABLE";
742 case SCARD_E_COMM_DATA_LOST:
743 return "SCARD_E_COMM_DATA_LOST";
745 case SCARD_E_NO_KEY_CONTAINER:
746 return "SCARD_E_NO_KEY_CONTAINER";
748 case SCARD_E_SERVER_TOO_BUSY:
749 return "SCARD_E_SERVER_TOO_BUSY";
751 case SCARD_E_PIN_CACHE_EXPIRED:
752 return "SCARD_E_PIN_CACHE_EXPIRED";
754 case SCARD_E_NO_PIN_CACHE:
755 return "SCARD_E_NO_PIN_CACHE";
757 case SCARD_E_READ_ONLY_CARD:
758 return "SCARD_E_READ_ONLY_CARD";
760 case SCARD_W_UNSUPPORTED_CARD:
761 return "SCARD_W_UNSUPPORTED_CARD";
763 case SCARD_W_UNRESPONSIVE_CARD:
764 return "SCARD_W_UNRESPONSIVE_CARD";
766 case SCARD_W_UNPOWERED_CARD:
767 return "SCARD_W_UNPOWERED_CARD";
769 case SCARD_W_RESET_CARD:
770 return "SCARD_W_RESET_CARD";
772 case SCARD_W_REMOVED_CARD:
773 return "SCARD_W_REMOVED_CARD";
775 case SCARD_W_SECURITY_VIOLATION:
776 return "SCARD_W_SECURITY_VIOLATION";
778 case SCARD_W_WRONG_CHV:
779 return "SCARD_W_WRONG_CHV";
781 case SCARD_W_CHV_BLOCKED:
782 return "SCARD_W_CHV_BLOCKED";
785 return "SCARD_W_EOF";
787 case SCARD_W_CANCELLED_BY_USER:
788 return "SCARD_W_CANCELLED_BY_USER";
790 case SCARD_W_CARD_NOT_AUTHENTICATED:
791 return "SCARD_W_CARD_NOT_AUTHENTICATED";
793 case SCARD_W_CACHE_ITEM_NOT_FOUND:
794 return "SCARD_W_CACHE_ITEM_NOT_FOUND";
796 case SCARD_W_CACHE_ITEM_STALE:
797 return "SCARD_W_CACHE_ITEM_STALE";
799 case SCARD_W_CACHE_ITEM_TOO_BIG:
800 return "SCARD_W_CACHE_ITEM_TOO_BIG";
803 return "SCARD_E_UNKNOWN";
807WINSCARDAPI
const char* WINAPI SCardGetAttributeString(DWORD dwAttrId)
811 case SCARD_ATTR_VENDOR_NAME:
812 return "SCARD_ATTR_VENDOR_NAME";
814 case SCARD_ATTR_VENDOR_IFD_TYPE:
815 return "SCARD_ATTR_VENDOR_IFD_TYPE";
817 case SCARD_ATTR_VENDOR_IFD_VERSION:
818 return "SCARD_ATTR_VENDOR_IFD_VERSION";
820 case SCARD_ATTR_VENDOR_IFD_SERIAL_NO:
821 return "SCARD_ATTR_VENDOR_IFD_SERIAL_NO";
823 case SCARD_ATTR_CHANNEL_ID:
824 return "SCARD_ATTR_CHANNEL_ID";
826 case SCARD_ATTR_PROTOCOL_TYPES:
827 return "SCARD_ATTR_PROTOCOL_TYPES";
829 case SCARD_ATTR_DEFAULT_CLK:
830 return "SCARD_ATTR_DEFAULT_CLK";
832 case SCARD_ATTR_MAX_CLK:
833 return "SCARD_ATTR_MAX_CLK";
835 case SCARD_ATTR_DEFAULT_DATA_RATE:
836 return "SCARD_ATTR_DEFAULT_DATA_RATE";
838 case SCARD_ATTR_MAX_DATA_RATE:
839 return "SCARD_ATTR_MAX_DATA_RATE";
841 case SCARD_ATTR_MAX_IFSD:
842 return "SCARD_ATTR_MAX_IFSD";
844 case SCARD_ATTR_POWER_MGMT_SUPPORT:
845 return "SCARD_ATTR_POWER_MGMT_SUPPORT";
847 case SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE:
848 return "SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE";
850 case SCARD_ATTR_USER_AUTH_INPUT_DEVICE:
851 return "SCARD_ATTR_USER_AUTH_INPUT_DEVICE";
853 case SCARD_ATTR_CHARACTERISTICS:
854 return "SCARD_ATTR_CHARACTERISTICS";
856 case SCARD_ATTR_CURRENT_PROTOCOL_TYPE:
857 return "SCARD_ATTR_CURRENT_PROTOCOL_TYPE";
859 case SCARD_ATTR_CURRENT_CLK:
860 return "SCARD_ATTR_CURRENT_CLK";
862 case SCARD_ATTR_CURRENT_F:
863 return "SCARD_ATTR_CURRENT_F";
865 case SCARD_ATTR_CURRENT_D:
866 return "SCARD_ATTR_CURRENT_D";
868 case SCARD_ATTR_CURRENT_N:
869 return "SCARD_ATTR_CURRENT_N";
871 case SCARD_ATTR_CURRENT_W:
872 return "SCARD_ATTR_CURRENT_W";
874 case SCARD_ATTR_CURRENT_IFSC:
875 return "SCARD_ATTR_CURRENT_IFSC";
877 case SCARD_ATTR_CURRENT_IFSD:
878 return "SCARD_ATTR_CURRENT_IFSD";
880 case SCARD_ATTR_CURRENT_BWT:
881 return "SCARD_ATTR_CURRENT_BWT";
883 case SCARD_ATTR_CURRENT_CWT:
884 return "SCARD_ATTR_CURRENT_CWT";
886 case SCARD_ATTR_CURRENT_EBC_ENCODING:
887 return "SCARD_ATTR_CURRENT_EBC_ENCODING";
889 case SCARD_ATTR_EXTENDED_BWT:
890 return "SCARD_ATTR_EXTENDED_BWT";
892 case SCARD_ATTR_ICC_PRESENCE:
893 return "SCARD_ATTR_ICC_PRESENCE";
895 case SCARD_ATTR_ICC_INTERFACE_STATUS:
896 return "SCARD_ATTR_ICC_INTERFACE_STATUS";
898 case SCARD_ATTR_CURRENT_IO_STATE:
899 return "SCARD_ATTR_CURRENT_IO_STATE";
901 case SCARD_ATTR_ATR_STRING:
902 return "SCARD_ATTR_ATR_STRING";
904 case SCARD_ATTR_ICC_TYPE_PER_ATR:
905 return "SCARD_ATTR_ICC_TYPE_PER_ATR";
907 case SCARD_ATTR_ESC_RESET:
908 return "SCARD_ATTR_ESC_RESET";
910 case SCARD_ATTR_ESC_CANCEL:
911 return "SCARD_ATTR_ESC_CANCEL";
913 case SCARD_ATTR_ESC_AUTHREQUEST:
914 return "SCARD_ATTR_ESC_AUTHREQUEST";
916 case SCARD_ATTR_MAXINPUT:
917 return "SCARD_ATTR_MAXINPUT";
919 case SCARD_ATTR_DEVICE_UNIT:
920 return "SCARD_ATTR_DEVICE_UNIT";
922 case SCARD_ATTR_DEVICE_IN_USE:
923 return "SCARD_ATTR_DEVICE_IN_USE";
925 case SCARD_ATTR_DEVICE_FRIENDLY_NAME_A:
926 return "SCARD_ATTR_DEVICE_FRIENDLY_NAME_A";
928 case SCARD_ATTR_DEVICE_SYSTEM_NAME_A:
929 return "SCARD_ATTR_DEVICE_SYSTEM_NAME_A";
931 case SCARD_ATTR_DEVICE_FRIENDLY_NAME_W:
932 return "SCARD_ATTR_DEVICE_FRIENDLY_NAME_W";
934 case SCARD_ATTR_DEVICE_SYSTEM_NAME_W:
935 return "SCARD_ATTR_DEVICE_SYSTEM_NAME_W";
937 case SCARD_ATTR_SUPRESS_T1_IFS_REQUEST:
938 return "SCARD_ATTR_SUPRESS_T1_IFS_REQUEST";
941 return "SCARD_ATTR_UNKNOWN";
945WINSCARDAPI
const char* WINAPI SCardGetProtocolString(DWORD dwProtocols)
947 if (dwProtocols == SCARD_PROTOCOL_UNDEFINED)
948 return "SCARD_PROTOCOL_UNDEFINED";
950 if (dwProtocols == SCARD_PROTOCOL_T0)
951 return "SCARD_PROTOCOL_T0";
953 if (dwProtocols == SCARD_PROTOCOL_T1)
954 return "SCARD_PROTOCOL_T1";
956 if (dwProtocols == SCARD_PROTOCOL_Tx)
957 return "SCARD_PROTOCOL_Tx";
959 if (dwProtocols == SCARD_PROTOCOL_RAW)
960 return "SCARD_PROTOCOL_RAW";
962 if (dwProtocols == SCARD_PROTOCOL_DEFAULT)
963 return "SCARD_PROTOCOL_DEFAULT";
965 if (dwProtocols == (SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_RAW))
966 return "SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_RAW";
968 if (dwProtocols == (SCARD_PROTOCOL_T1 | SCARD_PROTOCOL_RAW))
969 return "SCARD_PROTOCOL_T1 | SCARD_PROTOCOL_RAW";
971 if (dwProtocols == (SCARD_PROTOCOL_Tx | SCARD_PROTOCOL_RAW))
972 return "SCARD_PROTOCOL_Tx | SCARD_PROTOCOL_RAW";
974 return "SCARD_PROTOCOL_UNKNOWN";
977WINSCARDAPI
const char* WINAPI SCardGetShareModeString(DWORD dwShareMode)
981 case SCARD_SHARE_EXCLUSIVE:
982 return "SCARD_SHARE_EXCLUSIVE";
984 case SCARD_SHARE_SHARED:
985 return "SCARD_SHARE_SHARED";
987 case SCARD_SHARE_DIRECT:
988 return "SCARD_SHARE_DIRECT";
991 return "SCARD_SHARE_UNKNOWN";
995WINSCARDAPI
const char* WINAPI SCardGetDispositionString(DWORD dwDisposition)
997 switch (dwDisposition)
999 case SCARD_LEAVE_CARD:
1000 return "SCARD_LEAVE_CARD";
1002 case SCARD_RESET_CARD:
1003 return "SCARD_RESET_CARD";
1005 case SCARD_UNPOWER_CARD:
1006 return "SCARD_UNPOWER_CARD";
1009 return "SCARD_UNKNOWN_CARD";
1013WINSCARDAPI
const char* WINAPI SCardGetScopeString(DWORD dwScope)
1017 case SCARD_SCOPE_USER:
1018 return "SCARD_SCOPE_USER";
1020 case SCARD_SCOPE_TERMINAL:
1021 return "SCARD_SCOPE_TERMINAL";
1023 case SCARD_SCOPE_SYSTEM:
1024 return "SCARD_SCOPE_SYSTEM";
1027 return "SCARD_SCOPE_UNKNOWN";
1031WINSCARDAPI
const char* WINAPI SCardGetCardStateString(DWORD dwCardState)
1033 switch (dwCardState)
1036 return "SCARD_UNKNOWN";
1039 return "SCARD_ABSENT";
1042 return "SCARD_PRESENT";
1044 case SCARD_SWALLOWED:
1045 return "SCARD_SWALLOWED";
1048 return "SCARD_POWERED";
1050 case SCARD_NEGOTIABLE:
1051 return "SCARD_NEGOTIABLE";
1053 case SCARD_SPECIFIC:
1054 return "SCARD_SPECIFIC";
1057 return "SCARD_UNKNOWN";
1061WINSCARDAPI
char* WINAPI SCardGetReaderStateString(DWORD dwReaderState)
1063 const size_t size = 512;
1064 char* buffer = calloc(size,
sizeof(
char));
1069 if (dwReaderState & SCARD_STATE_IGNORE)
1070 winpr_str_append(
"SCARD_STATE_IGNORE", buffer, size,
"|");
1072 if (dwReaderState & SCARD_STATE_CHANGED)
1073 winpr_str_append(
"SCARD_STATE_CHANGED", buffer, size,
"|");
1075 if (dwReaderState & SCARD_STATE_UNKNOWN)
1076 winpr_str_append(
"SCARD_STATE_UNKNOWN", buffer, size,
"|");
1078 if (dwReaderState & SCARD_STATE_UNAVAILABLE)
1079 winpr_str_append(
"SCARD_STATE_UNAVAILABLE", buffer, size,
"|");
1081 if (dwReaderState & SCARD_STATE_EMPTY)
1082 winpr_str_append(
"SCARD_STATE_EMPTY", buffer, size,
"|");
1084 if (dwReaderState & SCARD_STATE_PRESENT)
1085 winpr_str_append(
"SCARD_STATE_PRESENT", buffer, size,
"|");
1087 if (dwReaderState & SCARD_STATE_ATRMATCH)
1088 winpr_str_append(
"SCARD_STATE_ATRMATCH", buffer, size,
"|");
1090 if (dwReaderState & SCARD_STATE_EXCLUSIVE)
1091 winpr_str_append(
"SCARD_STATE_EXCLUSIVE", buffer, size,
"|");
1093 if (dwReaderState & SCARD_STATE_INUSE)
1094 winpr_str_append(
"SCARD_STATE_INUSE", buffer, size,
"|");
1096 if (dwReaderState & SCARD_STATE_MUTE)
1097 winpr_str_append(
"SCARD_STATE_MUTE", buffer, size,
"|");
1099 if (dwReaderState & SCARD_STATE_UNPOWERED)
1100 winpr_str_append(
"SCARD_STATE_UNPOWERED", buffer, size,
"|");
1103 winpr_str_append(
"SCARD_STATE_UNAWARE", buffer, size,
"|");
1108#define WINSCARD_LOAD_PROC(_name) \
1111 WINPR_PRAGMA_DIAG_PUSH \
1112 WINPR_PRAGMA_DIAG_IGNORED_PEDANTIC \
1113 pWinSCardApiTable->pfn##_name = GetProcAddressAs(hWinSCardLibrary, #_name, fn##_name); \
1114 WINPR_PRAGMA_DIAG_POP \
1118 HMODULE hWinSCardLibrary)
1120 WINPR_ASSERT(pWinSCardApiTable);
1121 WINPR_ASSERT(hWinSCardLibrary);
1123 WINSCARD_LOAD_PROC(SCardEstablishContext);
1124 WINSCARD_LOAD_PROC(SCardReleaseContext);
1125 WINSCARD_LOAD_PROC(SCardIsValidContext);
1126 WINSCARD_LOAD_PROC(SCardListReaderGroupsA);
1127 WINSCARD_LOAD_PROC(SCardListReaderGroupsW);
1128 WINSCARD_LOAD_PROC(SCardListReadersA);
1129 WINSCARD_LOAD_PROC(SCardListReadersW);
1130 WINSCARD_LOAD_PROC(SCardListCardsA);
1131 WINSCARD_LOAD_PROC(SCardListCardsW);
1132 WINSCARD_LOAD_PROC(SCardListInterfacesA);
1133 WINSCARD_LOAD_PROC(SCardListInterfacesW);
1134 WINSCARD_LOAD_PROC(SCardGetProviderIdA);
1135 WINSCARD_LOAD_PROC(SCardGetProviderIdW);
1136 WINSCARD_LOAD_PROC(SCardGetCardTypeProviderNameA);
1137 WINSCARD_LOAD_PROC(SCardGetCardTypeProviderNameW);
1138 WINSCARD_LOAD_PROC(SCardIntroduceReaderGroupA);
1139 WINSCARD_LOAD_PROC(SCardIntroduceReaderGroupW);
1140 WINSCARD_LOAD_PROC(SCardForgetReaderGroupA);
1141 WINSCARD_LOAD_PROC(SCardForgetReaderGroupW);
1142 WINSCARD_LOAD_PROC(SCardIntroduceReaderA);
1143 WINSCARD_LOAD_PROC(SCardIntroduceReaderW);
1144 WINSCARD_LOAD_PROC(SCardForgetReaderA);
1145 WINSCARD_LOAD_PROC(SCardForgetReaderW);
1146 WINSCARD_LOAD_PROC(SCardAddReaderToGroupA);
1147 WINSCARD_LOAD_PROC(SCardAddReaderToGroupW);
1148 WINSCARD_LOAD_PROC(SCardRemoveReaderFromGroupA);
1149 WINSCARD_LOAD_PROC(SCardRemoveReaderFromGroupW);
1150 WINSCARD_LOAD_PROC(SCardIntroduceCardTypeA);
1151 WINSCARD_LOAD_PROC(SCardIntroduceCardTypeW);
1152 WINSCARD_LOAD_PROC(SCardSetCardTypeProviderNameA);
1153 WINSCARD_LOAD_PROC(SCardSetCardTypeProviderNameW);
1154 WINSCARD_LOAD_PROC(SCardForgetCardTypeA);
1155 WINSCARD_LOAD_PROC(SCardForgetCardTypeW);
1156 WINSCARD_LOAD_PROC(SCardFreeMemory);
1157 WINSCARD_LOAD_PROC(SCardAccessStartedEvent);
1158 WINSCARD_LOAD_PROC(SCardReleaseStartedEvent);
1159 WINSCARD_LOAD_PROC(SCardLocateCardsA);
1160 WINSCARD_LOAD_PROC(SCardLocateCardsW);
1161 WINSCARD_LOAD_PROC(SCardLocateCardsByATRA);
1162 WINSCARD_LOAD_PROC(SCardLocateCardsByATRW);
1163 WINSCARD_LOAD_PROC(SCardGetStatusChangeA);
1164 WINSCARD_LOAD_PROC(SCardGetStatusChangeW);
1165 WINSCARD_LOAD_PROC(SCardCancel);
1166 WINSCARD_LOAD_PROC(SCardConnectA);
1167 WINSCARD_LOAD_PROC(SCardConnectW);
1168 WINSCARD_LOAD_PROC(SCardReconnect);
1169 WINSCARD_LOAD_PROC(SCardDisconnect);
1170 WINSCARD_LOAD_PROC(SCardBeginTransaction);
1171 WINSCARD_LOAD_PROC(SCardEndTransaction);
1172 WINSCARD_LOAD_PROC(SCardCancelTransaction);
1173 WINSCARD_LOAD_PROC(SCardState);
1174 WINSCARD_LOAD_PROC(SCardStatusA);
1175 WINSCARD_LOAD_PROC(SCardStatusW);
1176 WINSCARD_LOAD_PROC(SCardTransmit);
1177 WINSCARD_LOAD_PROC(SCardGetTransmitCount);
1178 WINSCARD_LOAD_PROC(SCardControl);
1179 WINSCARD_LOAD_PROC(SCardGetAttrib);
1180 WINSCARD_LOAD_PROC(SCardSetAttrib);
1181 WINSCARD_LOAD_PROC(SCardUIDlgSelectCardA);
1182 WINSCARD_LOAD_PROC(SCardUIDlgSelectCardW);
1183 WINSCARD_LOAD_PROC(GetOpenCardNameA);
1184 WINSCARD_LOAD_PROC(GetOpenCardNameW);
1185 WINSCARD_LOAD_PROC(SCardDlgExtendedError);
1186 WINSCARD_LOAD_PROC(SCardReadCacheA);
1187 WINSCARD_LOAD_PROC(SCardReadCacheW);
1188 WINSCARD_LOAD_PROC(SCardWriteCacheA);
1189 WINSCARD_LOAD_PROC(SCardWriteCacheW);
1190 WINSCARD_LOAD_PROC(SCardGetReaderIconA);
1191 WINSCARD_LOAD_PROC(SCardGetReaderIconW);
1192 WINSCARD_LOAD_PROC(SCardGetDeviceTypeIdA);
1193 WINSCARD_LOAD_PROC(SCardGetDeviceTypeIdW);
1194 WINSCARD_LOAD_PROC(SCardGetReaderDeviceInstanceIdA);
1195 WINSCARD_LOAD_PROC(SCardGetReaderDeviceInstanceIdW);
1196 WINSCARD_LOAD_PROC(SCardListReadersWithDeviceInstanceIdA);
1197 WINSCARD_LOAD_PROC(SCardListReadersWithDeviceInstanceIdW);
1198 WINSCARD_LOAD_PROC(SCardAudit);
1207 SCardEstablishContext,
1208 SCardReleaseContext,
1209 SCardIsValidContext,
1210 SCardListReaderGroupsA,
1211 SCardListReaderGroupsW,
1216 SCardListInterfacesA,
1217 SCardListInterfacesW,
1218 SCardGetProviderIdA,
1219 SCardGetProviderIdW,
1220 SCardGetCardTypeProviderNameA,
1221 SCardGetCardTypeProviderNameW,
1222 SCardIntroduceReaderGroupA,
1223 SCardIntroduceReaderGroupW,
1224 SCardForgetReaderGroupA,
1225 SCardForgetReaderGroupW,
1226 SCardIntroduceReaderA,
1227 SCardIntroduceReaderW,
1230 SCardAddReaderToGroupA,
1231 SCardAddReaderToGroupW,
1232 SCardRemoveReaderFromGroupA,
1233 SCardRemoveReaderFromGroupW,
1234 SCardIntroduceCardTypeA,
1235 SCardIntroduceCardTypeW,
1236 SCardSetCardTypeProviderNameA,
1237 SCardSetCardTypeProviderNameW,
1238 SCardForgetCardTypeA,
1239 SCardForgetCardTypeW,
1241 SCardAccessStartedEvent,
1242 SCardReleaseStartedEvent,
1245 SCardLocateCardsByATRA,
1246 SCardLocateCardsByATRW,
1247 SCardGetStatusChangeA,
1248 SCardGetStatusChangeW,
1254 SCardBeginTransaction,
1255 SCardEndTransaction,
1256 SCardCancelTransaction,
1261 SCardGetTransmitCount,
1265 SCardUIDlgSelectCardA,
1266 SCardUIDlgSelectCardW,
1269 SCardDlgExtendedError,
1274 SCardGetReaderIconA,
1275 SCardGetReaderIconW,
1276 SCardGetDeviceTypeIdA,
1277 SCardGetDeviceTypeIdW,
1278 SCardGetReaderDeviceInstanceIdA,
1279 SCardGetReaderDeviceInstanceIdW,
1280 SCardListReadersWithDeviceInstanceIdA,
1281 SCardListReadersWithDeviceInstanceIdW,
1287 return &WinPR_SCardApiFunctionTable;