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) \
53 TAG, "Missing function pointer g_SCardApi=%p->" xstr(pfn##_name) "=%p", \
54 WINPR_CXX_COMPAT_CAST(const void*, g_SCardApi), \
55 WINPR_CXX_COMPAT_CAST(const void*, g_SCardApi ? g_SCardApi->pfn##_name : nullptr)); \
56 return SCARD_E_NO_SERVICE; \
58 return g_SCardApi->pfn##_name(__VA_ARGS__)
60#define SCARDAPI_STUB_CALL_HANDLE(_name) \
61 if (!InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, nullptr, nullptr)) \
63 if (!g_SCardApi || !g_SCardApi->pfn##_name) \
66 TAG, "Missing function pointer g_SCardApi=%p->" xstr(pfn##_name) "=%p", \
67 WINPR_CXX_COMPAT_CAST(const void*, g_SCardApi), \
68 WINPR_CXX_COMPAT_CAST(const void*, g_SCardApi ? g_SCardApi->pfn##_name : nullptr)); \
71 return g_SCardApi->pfn##_name()
73#define SCARDAPI_STUB_CALL_VOID(_name) \
74 if (!InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, nullptr, nullptr)) \
76 if (!g_SCardApi || !g_SCardApi->pfn##_name) \
79 TAG, "Missing function pointer g_SCardApi=%p->" xstr(pfn##_name) "=%p", \
80 WINPR_CXX_COMPAT_CAST(const void*, g_SCardApi), \
81 WINPR_CXX_COMPAT_CAST(const void*, g_SCardApi ? g_SCardApi->pfn##_name : nullptr)); \
84 g_SCardApi->pfn##_name()
94static BOOL CALLBACK InitializeSCardApiStubs(WINPR_ATTR_UNUSED
PINIT_ONCE once,
95 WINPR_ATTR_UNUSED PVOID param,
96 WINPR_ATTR_UNUSED PVOID* context)
99 if (Windows_InitializeSCardApi() >= 0)
100 g_SCardApi = Windows_GetSCardApiFunctionTable();
102#if defined(WITH_SMARTCARD_PCSC)
103 if (PCSC_InitializeSCardApi() >= 0)
104 g_SCardApi = PCSC_GetSCardApiFunctionTable();
108#if defined(WITH_SMARTCARD_INSPECT)
109 g_SCardApi = Inspect_RegisterSCardApi(g_SCardApi);
114WINSCARDAPI LONG WINAPI SCardEstablishContext(DWORD dwScope, LPCVOID pvReserved1,
115 LPCVOID pvReserved2, LPSCARDCONTEXT phContext)
117 SCARDAPI_STUB_CALL_LONG(SCardEstablishContext, dwScope, pvReserved1, pvReserved2, phContext);
120WINSCARDAPI LONG WINAPI SCardReleaseContext(SCARDCONTEXT hContext)
122 SCARDAPI_STUB_CALL_LONG(SCardReleaseContext, hContext);
125WINSCARDAPI LONG WINAPI SCardIsValidContext(SCARDCONTEXT hContext)
127 SCARDAPI_STUB_CALL_LONG(SCardIsValidContext, hContext);
130WINSCARDAPI LONG WINAPI SCardListReaderGroupsA(SCARDCONTEXT hContext, LPSTR mszGroups,
133 SCARDAPI_STUB_CALL_LONG(SCardListReaderGroupsA, hContext, mszGroups, pcchGroups);
136WINSCARDAPI LONG WINAPI SCardListReaderGroupsW(SCARDCONTEXT hContext, LPWSTR mszGroups,
139 SCARDAPI_STUB_CALL_LONG(SCardListReaderGroupsW, hContext, mszGroups, pcchGroups);
142WINSCARDAPI LONG WINAPI SCardListReadersA(SCARDCONTEXT hContext, LPCSTR mszGroups, LPSTR mszReaders,
145 SCARDAPI_STUB_CALL_LONG(SCardListReadersA, hContext, mszGroups, mszReaders, pcchReaders);
148WINSCARDAPI LONG WINAPI SCardListReadersW(SCARDCONTEXT hContext, LPCWSTR mszGroups,
149 LPWSTR mszReaders, LPDWORD pcchReaders)
151 SCARDAPI_STUB_CALL_LONG(SCardListReadersW, hContext, mszGroups, mszReaders, pcchReaders);
154WINSCARDAPI LONG WINAPI SCardListCardsA(SCARDCONTEXT hContext, LPCBYTE pbAtr,
155 LPCGUID rgquidInterfaces, DWORD cguidInterfaceCount,
156 CHAR* mszCards, LPDWORD pcchCards)
158 SCARDAPI_STUB_CALL_LONG(SCardListCardsA, hContext, pbAtr, rgquidInterfaces, cguidInterfaceCount,
159 mszCards, pcchCards);
162WINSCARDAPI LONG WINAPI SCardListCardsW(SCARDCONTEXT hContext, LPCBYTE pbAtr,
163 LPCGUID rgquidInterfaces, DWORD cguidInterfaceCount,
164 WCHAR* mszCards, LPDWORD pcchCards)
166 SCARDAPI_STUB_CALL_LONG(SCardListCardsW, hContext, pbAtr, rgquidInterfaces, cguidInterfaceCount,
167 mszCards, pcchCards);
170WINSCARDAPI LONG WINAPI SCardListInterfacesA(SCARDCONTEXT hContext, LPCSTR szCard,
171 LPGUID pguidInterfaces, LPDWORD pcguidInterfaces)
173 SCARDAPI_STUB_CALL_LONG(SCardListInterfacesA, hContext, szCard, pguidInterfaces,
177WINSCARDAPI LONG WINAPI SCardListInterfacesW(SCARDCONTEXT hContext, LPCWSTR szCard,
178 LPGUID pguidInterfaces, LPDWORD pcguidInterfaces)
180 SCARDAPI_STUB_CALL_LONG(SCardListInterfacesW, hContext, szCard, pguidInterfaces,
184WINSCARDAPI LONG WINAPI SCardGetProviderIdA(SCARDCONTEXT hContext, LPCSTR szCard,
185 LPGUID pguidProviderId)
187 SCARDAPI_STUB_CALL_LONG(SCardGetProviderIdA, hContext, szCard, pguidProviderId);
190WINSCARDAPI LONG WINAPI SCardGetProviderIdW(SCARDCONTEXT hContext, LPCWSTR szCard,
191 LPGUID pguidProviderId)
193 SCARDAPI_STUB_CALL_LONG(SCardGetProviderIdW, hContext, szCard, pguidProviderId);
196WINSCARDAPI LONG WINAPI SCardGetCardTypeProviderNameA(SCARDCONTEXT hContext, LPCSTR szCardName,
197 DWORD dwProviderId, CHAR* szProvider,
198 LPDWORD pcchProvider)
200 SCARDAPI_STUB_CALL_LONG(SCardGetCardTypeProviderNameA, hContext, szCardName, dwProviderId,
201 szProvider, pcchProvider);
204WINSCARDAPI LONG WINAPI SCardGetCardTypeProviderNameW(SCARDCONTEXT hContext, LPCWSTR szCardName,
205 DWORD dwProviderId, WCHAR* szProvider,
206 LPDWORD pcchProvider)
208 SCARDAPI_STUB_CALL_LONG(SCardGetCardTypeProviderNameW, hContext, szCardName, dwProviderId,
209 szProvider, pcchProvider);
212WINSCARDAPI LONG WINAPI SCardIntroduceReaderGroupA(SCARDCONTEXT hContext, LPCSTR szGroupName)
214 SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderGroupA, hContext, szGroupName);
217WINSCARDAPI LONG WINAPI SCardIntroduceReaderGroupW(SCARDCONTEXT hContext, LPCWSTR szGroupName)
219 SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderGroupW, hContext, szGroupName);
222WINSCARDAPI LONG WINAPI SCardForgetReaderGroupA(SCARDCONTEXT hContext, LPCSTR szGroupName)
224 SCARDAPI_STUB_CALL_LONG(SCardForgetReaderGroupA, hContext, szGroupName);
227WINSCARDAPI LONG WINAPI SCardForgetReaderGroupW(SCARDCONTEXT hContext, LPCWSTR szGroupName)
229 SCARDAPI_STUB_CALL_LONG(SCardForgetReaderGroupW, hContext, szGroupName);
232WINSCARDAPI LONG WINAPI SCardIntroduceReaderA(SCARDCONTEXT hContext, LPCSTR szReaderName,
235 SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderA, hContext, szReaderName, szDeviceName);
238WINSCARDAPI LONG WINAPI SCardIntroduceReaderW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
239 LPCWSTR szDeviceName)
241 SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderW, hContext, szReaderName, szDeviceName);
244WINSCARDAPI LONG WINAPI SCardForgetReaderA(SCARDCONTEXT hContext, LPCSTR szReaderName)
246 SCARDAPI_STUB_CALL_LONG(SCardForgetReaderA, hContext, szReaderName);
249WINSCARDAPI LONG WINAPI SCardForgetReaderW(SCARDCONTEXT hContext, LPCWSTR szReaderName)
251 SCARDAPI_STUB_CALL_LONG(SCardForgetReaderW, hContext, szReaderName);
254WINSCARDAPI LONG WINAPI SCardAddReaderToGroupA(SCARDCONTEXT hContext, LPCSTR szReaderName,
257 SCARDAPI_STUB_CALL_LONG(SCardAddReaderToGroupA, hContext, szReaderName, szGroupName);
260WINSCARDAPI LONG WINAPI SCardAddReaderToGroupW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
263 SCARDAPI_STUB_CALL_LONG(SCardAddReaderToGroupW, hContext, szReaderName, szGroupName);
266WINSCARDAPI LONG WINAPI SCardRemoveReaderFromGroupA(SCARDCONTEXT hContext, LPCSTR szReaderName,
269 SCARDAPI_STUB_CALL_LONG(SCardRemoveReaderFromGroupA, hContext, szReaderName, szGroupName);
272WINSCARDAPI LONG WINAPI SCardRemoveReaderFromGroupW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
275 SCARDAPI_STUB_CALL_LONG(SCardRemoveReaderFromGroupW, hContext, szReaderName, szGroupName);
278WINSCARDAPI LONG WINAPI SCardIntroduceCardTypeA(SCARDCONTEXT hContext, LPCSTR szCardName,
279 LPCGUID pguidPrimaryProvider,
280 LPCGUID rgguidInterfaces, DWORD dwInterfaceCount,
281 LPCBYTE pbAtr, LPCBYTE pbAtrMask, DWORD cbAtrLen)
283 SCARDAPI_STUB_CALL_LONG(SCardIntroduceCardTypeA, hContext, szCardName, pguidPrimaryProvider,
284 rgguidInterfaces, dwInterfaceCount, pbAtr, pbAtrMask, cbAtrLen);
287WINSCARDAPI LONG WINAPI SCardIntroduceCardTypeW(SCARDCONTEXT hContext, LPCWSTR szCardName,
288 LPCGUID pguidPrimaryProvider,
289 LPCGUID rgguidInterfaces, DWORD dwInterfaceCount,
290 LPCBYTE pbAtr, LPCBYTE pbAtrMask, DWORD cbAtrLen)
292 SCARDAPI_STUB_CALL_LONG(SCardIntroduceCardTypeW, hContext, szCardName, pguidPrimaryProvider,
293 rgguidInterfaces, dwInterfaceCount, pbAtr, pbAtrMask, cbAtrLen);
296WINSCARDAPI LONG WINAPI SCardSetCardTypeProviderNameA(SCARDCONTEXT hContext, LPCSTR szCardName,
297 DWORD dwProviderId, LPCSTR szProvider)
299 SCARDAPI_STUB_CALL_LONG(SCardSetCardTypeProviderNameA, hContext, szCardName, dwProviderId,
303WINSCARDAPI LONG WINAPI SCardSetCardTypeProviderNameW(SCARDCONTEXT hContext, LPCWSTR szCardName,
304 DWORD dwProviderId, LPCWSTR szProvider)
306 SCARDAPI_STUB_CALL_LONG(SCardSetCardTypeProviderNameW, hContext, szCardName, dwProviderId,
310WINSCARDAPI LONG WINAPI SCardForgetCardTypeA(SCARDCONTEXT hContext, LPCSTR szCardName)
312 SCARDAPI_STUB_CALL_LONG(SCardForgetCardTypeA, hContext, szCardName);
315WINSCARDAPI LONG WINAPI SCardForgetCardTypeW(SCARDCONTEXT hContext, LPCWSTR szCardName)
317 SCARDAPI_STUB_CALL_LONG(SCardForgetCardTypeW, hContext, szCardName);
320WINSCARDAPI LONG WINAPI SCardFreeMemory(SCARDCONTEXT hContext, LPVOID pvMem)
322 SCARDAPI_STUB_CALL_LONG(SCardFreeMemory, hContext, pvMem);
325WINSCARDAPI HANDLE WINAPI SCardAccessStartedEvent(
void)
327 SCARDAPI_STUB_CALL_HANDLE(SCardAccessStartedEvent);
330WINSCARDAPI
void WINAPI SCardReleaseStartedEvent(
void)
332 SCARDAPI_STUB_CALL_VOID(SCardReleaseStartedEvent);
335WINSCARDAPI LONG WINAPI SCardLocateCardsA(SCARDCONTEXT hContext, LPCSTR mszCards,
338 SCARDAPI_STUB_CALL_LONG(SCardLocateCardsA, hContext, mszCards, rgReaderStates, cReaders);
341WINSCARDAPI LONG WINAPI SCardLocateCardsW(SCARDCONTEXT hContext, LPCWSTR mszCards,
344 SCARDAPI_STUB_CALL_LONG(SCardLocateCardsW, hContext, mszCards, rgReaderStates, cReaders);
347WINSCARDAPI LONG WINAPI SCardLocateCardsByATRA(SCARDCONTEXT hContext,
LPSCARD_ATRMASK rgAtrMasks,
351 SCARDAPI_STUB_CALL_LONG(SCardLocateCardsByATRA, hContext, rgAtrMasks, cAtrs, rgReaderStates,
355WINSCARDAPI LONG WINAPI SCardLocateCardsByATRW(SCARDCONTEXT hContext,
LPSCARD_ATRMASK rgAtrMasks,
359 SCARDAPI_STUB_CALL_LONG(SCardLocateCardsByATRW, hContext, rgAtrMasks, cAtrs, rgReaderStates,
363WINSCARDAPI LONG WINAPI SCardGetStatusChangeA(SCARDCONTEXT hContext, DWORD dwTimeout,
366 SCARDAPI_STUB_CALL_LONG(SCardGetStatusChangeA, hContext, dwTimeout, rgReaderStates, cReaders);
369WINSCARDAPI LONG WINAPI SCardGetStatusChangeW(SCARDCONTEXT hContext, DWORD dwTimeout,
372 SCARDAPI_STUB_CALL_LONG(SCardGetStatusChangeW, hContext, dwTimeout, rgReaderStates, cReaders);
375WINSCARDAPI LONG WINAPI SCardCancel(SCARDCONTEXT hContext)
377 SCARDAPI_STUB_CALL_LONG(SCardCancel, hContext);
380WINSCARDAPI LONG WINAPI SCardConnectA(SCARDCONTEXT hContext, LPCSTR szReader, DWORD dwShareMode,
381 DWORD dwPreferredProtocols, LPSCARDHANDLE phCard,
382 LPDWORD pdwActiveProtocol)
384 SCARDAPI_STUB_CALL_LONG(SCardConnectA, hContext, szReader, dwShareMode, dwPreferredProtocols,
385 phCard, pdwActiveProtocol);
388WINSCARDAPI LONG WINAPI SCardConnectW(SCARDCONTEXT hContext, LPCWSTR szReader, DWORD dwShareMode,
389 DWORD dwPreferredProtocols, LPSCARDHANDLE phCard,
390 LPDWORD pdwActiveProtocol)
392 SCARDAPI_STUB_CALL_LONG(SCardConnectW, hContext, szReader, dwShareMode, dwPreferredProtocols,
393 phCard, pdwActiveProtocol);
396WINSCARDAPI LONG WINAPI SCardReconnect(SCARDHANDLE hCard, DWORD dwShareMode,
397 DWORD dwPreferredProtocols, DWORD dwInitialization,
398 LPDWORD pdwActiveProtocol)
400 SCARDAPI_STUB_CALL_LONG(SCardReconnect, hCard, dwShareMode, dwPreferredProtocols,
401 dwInitialization, pdwActiveProtocol);
404WINSCARDAPI LONG WINAPI SCardDisconnect(SCARDHANDLE hCard, DWORD dwDisposition)
406 SCARDAPI_STUB_CALL_LONG(SCardDisconnect, hCard, dwDisposition);
409WINSCARDAPI LONG WINAPI SCardBeginTransaction(SCARDHANDLE hCard)
411 SCARDAPI_STUB_CALL_LONG(SCardBeginTransaction, hCard);
414WINSCARDAPI LONG WINAPI SCardEndTransaction(SCARDHANDLE hCard, DWORD dwDisposition)
416 SCARDAPI_STUB_CALL_LONG(SCardEndTransaction, hCard, dwDisposition);
419WINSCARDAPI LONG WINAPI SCardCancelTransaction(SCARDHANDLE hCard)
421 SCARDAPI_STUB_CALL_LONG(SCardCancelTransaction, hCard);
424WINSCARDAPI LONG WINAPI SCardState(SCARDHANDLE hCard, LPDWORD pdwState, LPDWORD pdwProtocol,
425 LPBYTE pbAtr, LPDWORD pcbAtrLen)
427 SCARDAPI_STUB_CALL_LONG(SCardState, hCard, pdwState, pdwProtocol, pbAtr, pcbAtrLen);
430WINSCARDAPI LONG WINAPI SCardStatusA(SCARDHANDLE hCard, LPSTR mszReaderNames, LPDWORD pcchReaderLen,
431 LPDWORD pdwState, LPDWORD pdwProtocol, LPBYTE pbAtr,
434 SCARDAPI_STUB_CALL_LONG(SCardStatusA, hCard, mszReaderNames, pcchReaderLen, pdwState,
435 pdwProtocol, pbAtr, pcbAtrLen);
438WINSCARDAPI LONG WINAPI SCardStatusW(SCARDHANDLE hCard, LPWSTR mszReaderNames,
439 LPDWORD pcchReaderLen, LPDWORD pdwState, LPDWORD pdwProtocol,
440 LPBYTE pbAtr, LPDWORD pcbAtrLen)
442 SCARDAPI_STUB_CALL_LONG(SCardStatusW, hCard, mszReaderNames, pcchReaderLen, pdwState,
443 pdwProtocol, pbAtr, pcbAtrLen);
447 LPCBYTE pbSendBuffer, DWORD cbSendLength,
449 LPDWORD pcbRecvLength)
451 SCARDAPI_STUB_CALL_LONG(SCardTransmit, hCard, pioSendPci, pbSendBuffer, cbSendLength,
452 pioRecvPci, pbRecvBuffer, pcbRecvLength);
455WINSCARDAPI LONG WINAPI SCardGetTransmitCount(SCARDHANDLE hCard, LPDWORD pcTransmitCount)
457 SCARDAPI_STUB_CALL_LONG(SCardGetTransmitCount, hCard, pcTransmitCount);
460WINSCARDAPI LONG WINAPI SCardControl(SCARDHANDLE hCard, DWORD dwControlCode, LPCVOID lpInBuffer,
461 DWORD cbInBufferSize, LPVOID lpOutBuffer,
462 DWORD cbOutBufferSize, LPDWORD lpBytesReturned)
464 SCARDAPI_STUB_CALL_LONG(SCardControl, hCard, dwControlCode, lpInBuffer, cbInBufferSize,
465 lpOutBuffer, cbOutBufferSize, lpBytesReturned);
468WINSCARDAPI LONG WINAPI SCardGetAttrib(SCARDHANDLE hCard, DWORD dwAttrId, LPBYTE pbAttr,
471 SCARDAPI_STUB_CALL_LONG(SCardGetAttrib, hCard, dwAttrId, pbAttr, pcbAttrLen);
474WINSCARDAPI LONG WINAPI SCardSetAttrib(SCARDHANDLE hCard, DWORD dwAttrId, LPCBYTE pbAttr,
477 SCARDAPI_STUB_CALL_LONG(SCardSetAttrib, hCard, dwAttrId, pbAttr, cbAttrLen);
480WINSCARDAPI LONG WINAPI SCardUIDlgSelectCardA(LPOPENCARDNAMEA_EX pDlgStruc)
482 SCARDAPI_STUB_CALL_LONG(SCardUIDlgSelectCardA, pDlgStruc);
485WINSCARDAPI LONG WINAPI SCardUIDlgSelectCardW(LPOPENCARDNAMEW_EX pDlgStruc)
487 SCARDAPI_STUB_CALL_LONG(SCardUIDlgSelectCardW, pDlgStruc);
492 SCARDAPI_STUB_CALL_LONG(GetOpenCardNameA, pDlgStruc);
497 SCARDAPI_STUB_CALL_LONG(GetOpenCardNameW, pDlgStruc);
500WINSCARDAPI LONG WINAPI SCardDlgExtendedError(
void)
502 SCARDAPI_STUB_CALL_LONG(SCardDlgExtendedError);
505WINSCARDAPI LONG WINAPI SCardReadCacheA(SCARDCONTEXT hContext,
UUID* CardIdentifier,
506 DWORD FreshnessCounter, LPSTR LookupName, PBYTE Data,
509 SCARDAPI_STUB_CALL_LONG(SCardReadCacheA, hContext, CardIdentifier, FreshnessCounter, LookupName,
513WINSCARDAPI LONG WINAPI SCardReadCacheW(SCARDCONTEXT hContext,
UUID* CardIdentifier,
514 DWORD FreshnessCounter, LPWSTR LookupName, PBYTE Data,
517 SCARDAPI_STUB_CALL_LONG(SCardReadCacheW, hContext, CardIdentifier, FreshnessCounter, LookupName,
521WINSCARDAPI LONG WINAPI SCardWriteCacheA(SCARDCONTEXT hContext,
UUID* CardIdentifier,
522 DWORD FreshnessCounter, LPSTR LookupName, PBYTE Data,
525 SCARDAPI_STUB_CALL_LONG(SCardWriteCacheA, hContext, CardIdentifier, FreshnessCounter,
526 LookupName, Data, DataLen);
529WINSCARDAPI LONG WINAPI SCardWriteCacheW(SCARDCONTEXT hContext,
UUID* CardIdentifier,
530 DWORD FreshnessCounter, LPWSTR LookupName, PBYTE Data,
533 SCARDAPI_STUB_CALL_LONG(SCardWriteCacheW, hContext, CardIdentifier, FreshnessCounter,
534 LookupName, Data, DataLen);
537WINSCARDAPI LONG WINAPI SCardGetReaderIconA(SCARDCONTEXT hContext, LPCSTR szReaderName,
538 LPBYTE pbIcon, LPDWORD pcbIcon)
540 SCARDAPI_STUB_CALL_LONG(SCardGetReaderIconA, hContext, szReaderName, pbIcon, pcbIcon);
543WINSCARDAPI LONG WINAPI SCardGetReaderIconW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
544 LPBYTE pbIcon, LPDWORD pcbIcon)
546 SCARDAPI_STUB_CALL_LONG(SCardGetReaderIconW, hContext, szReaderName, pbIcon, pcbIcon);
549WINSCARDAPI LONG WINAPI SCardGetDeviceTypeIdA(SCARDCONTEXT hContext, LPCSTR szReaderName,
550 LPDWORD pdwDeviceTypeId)
552 SCARDAPI_STUB_CALL_LONG(SCardGetDeviceTypeIdA, hContext, szReaderName, pdwDeviceTypeId);
555WINSCARDAPI LONG WINAPI SCardGetDeviceTypeIdW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
556 LPDWORD pdwDeviceTypeId)
558 SCARDAPI_STUB_CALL_LONG(SCardGetDeviceTypeIdW, hContext, szReaderName, pdwDeviceTypeId);
561WINSCARDAPI LONG WINAPI SCardGetReaderDeviceInstanceIdA(SCARDCONTEXT hContext, LPCSTR szReaderName,
562 LPSTR szDeviceInstanceId,
563 LPDWORD pcchDeviceInstanceId)
565 SCARDAPI_STUB_CALL_LONG(SCardGetReaderDeviceInstanceIdA, hContext, szReaderName,
566 szDeviceInstanceId, pcchDeviceInstanceId);
569WINSCARDAPI LONG WINAPI SCardGetReaderDeviceInstanceIdW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
570 LPWSTR szDeviceInstanceId,
571 LPDWORD pcchDeviceInstanceId)
573 SCARDAPI_STUB_CALL_LONG(SCardGetReaderDeviceInstanceIdW, hContext, szReaderName,
574 szDeviceInstanceId, pcchDeviceInstanceId);
577WINSCARDAPI LONG WINAPI SCardListReadersWithDeviceInstanceIdA(SCARDCONTEXT hContext,
578 LPCSTR szDeviceInstanceId,
579 LPSTR mszReaders, LPDWORD pcchReaders)
581 SCARDAPI_STUB_CALL_LONG(SCardListReadersWithDeviceInstanceIdA, hContext, szDeviceInstanceId,
582 mszReaders, pcchReaders);
585WINSCARDAPI LONG WINAPI SCardListReadersWithDeviceInstanceIdW(SCARDCONTEXT hContext,
586 LPCWSTR szDeviceInstanceId,
590 SCARDAPI_STUB_CALL_LONG(SCardListReadersWithDeviceInstanceIdW, hContext, szDeviceInstanceId,
591 mszReaders, pcchReaders);
594WINSCARDAPI LONG WINAPI SCardAudit(SCARDCONTEXT hContext, DWORD dwEvent)
596 SCARDAPI_STUB_CALL_LONG(SCardAudit, hContext, dwEvent);
603WINSCARDAPI
const char* WINAPI SCardGetErrorString(LONG errorCode)
607 case SCARD_S_SUCCESS:
608 return "SCARD_S_SUCCESS";
610 case SCARD_F_INTERNAL_ERROR:
611 return "SCARD_F_INTERNAL_ERROR";
613 case SCARD_E_CANCELLED:
614 return "SCARD_E_CANCELLED";
616 case SCARD_E_INVALID_HANDLE:
617 return "SCARD_E_INVALID_HANDLE";
619 case SCARD_E_INVALID_PARAMETER:
620 return "SCARD_E_INVALID_PARAMETER";
622 case SCARD_E_INVALID_TARGET:
623 return "SCARD_E_INVALID_TARGET";
625 case SCARD_E_NO_MEMORY:
626 return "SCARD_E_NO_MEMORY";
628 case SCARD_F_WAITED_TOO_LONG:
629 return "SCARD_F_WAITED_TOO_LONG";
631 case SCARD_E_INSUFFICIENT_BUFFER:
632 return "SCARD_E_INSUFFICIENT_BUFFER";
634 case SCARD_E_UNKNOWN_READER:
635 return "SCARD_E_UNKNOWN_READER";
637 case SCARD_E_TIMEOUT:
638 return "SCARD_E_TIMEOUT";
640 case SCARD_E_SHARING_VIOLATION:
641 return "SCARD_E_SHARING_VIOLATION";
643 case SCARD_E_NO_SMARTCARD:
644 return "SCARD_E_NO_SMARTCARD";
646 case SCARD_E_UNKNOWN_CARD:
647 return "SCARD_E_UNKNOWN_CARD";
649 case SCARD_E_CANT_DISPOSE:
650 return "SCARD_E_CANT_DISPOSE";
652 case SCARD_E_PROTO_MISMATCH:
653 return "SCARD_E_PROTO_MISMATCH";
655 case SCARD_E_NOT_READY:
656 return "SCARD_E_NOT_READY";
658 case SCARD_E_INVALID_VALUE:
659 return "SCARD_E_INVALID_VALUE";
661 case SCARD_E_SYSTEM_CANCELLED:
662 return "SCARD_E_SYSTEM_CANCELLED";
664 case SCARD_F_COMM_ERROR:
665 return "SCARD_F_COMM_ERROR";
667 case SCARD_F_UNKNOWN_ERROR:
668 return "SCARD_F_UNKNOWN_ERROR";
670 case SCARD_E_INVALID_ATR:
671 return "SCARD_E_INVALID_ATR";
673 case SCARD_E_NOT_TRANSACTED:
674 return "SCARD_E_NOT_TRANSACTED";
676 case SCARD_E_READER_UNAVAILABLE:
677 return "SCARD_E_READER_UNAVAILABLE";
679 case SCARD_P_SHUTDOWN:
680 return "SCARD_P_SHUTDOWN";
682 case SCARD_E_PCI_TOO_SMALL:
683 return "SCARD_E_PCI_TOO_SMALL";
685 case SCARD_E_READER_UNSUPPORTED:
686 return "SCARD_E_READER_UNSUPPORTED";
688 case SCARD_E_DUPLICATE_READER:
689 return "SCARD_E_DUPLICATE_READER";
691 case SCARD_E_CARD_UNSUPPORTED:
692 return "SCARD_E_CARD_UNSUPPORTED";
694 case SCARD_E_NO_SERVICE:
695 return "SCARD_E_NO_SERVICE";
697 case SCARD_E_SERVICE_STOPPED:
698 return "SCARD_E_SERVICE_STOPPED";
700 case SCARD_E_UNEXPECTED:
701 return "SCARD_E_UNEXPECTED";
703 case SCARD_E_ICC_INSTALLATION:
704 return "SCARD_E_ICC_INSTALLATION";
706 case SCARD_E_ICC_CREATEORDER:
707 return "SCARD_E_ICC_CREATEORDER";
709 case SCARD_E_UNSUPPORTED_FEATURE:
710 return "SCARD_E_UNSUPPORTED_FEATURE";
712 case SCARD_E_DIR_NOT_FOUND:
713 return "SCARD_E_DIR_NOT_FOUND";
715 case SCARD_E_FILE_NOT_FOUND:
716 return "SCARD_E_FILE_NOT_FOUND";
719 return "SCARD_E_NO_DIR";
721 case SCARD_E_NO_FILE:
722 return "SCARD_E_NO_FILE";
724 case SCARD_E_NO_ACCESS:
725 return "SCARD_E_NO_ACCESS";
727 case SCARD_E_WRITE_TOO_MANY:
728 return "SCARD_E_WRITE_TOO_MANY";
730 case SCARD_E_BAD_SEEK:
731 return "SCARD_E_BAD_SEEK";
733 case SCARD_E_INVALID_CHV:
734 return "SCARD_E_INVALID_CHV";
736 case SCARD_E_UNKNOWN_RES_MNG:
737 return "SCARD_E_UNKNOWN_RES_MNG";
739 case SCARD_E_NO_SUCH_CERTIFICATE:
740 return "SCARD_E_NO_SUCH_CERTIFICATE";
742 case SCARD_E_CERTIFICATE_UNAVAILABLE:
743 return "SCARD_E_CERTIFICATE_UNAVAILABLE";
745 case SCARD_E_NO_READERS_AVAILABLE:
746 return "SCARD_E_NO_READERS_AVAILABLE";
748 case SCARD_E_COMM_DATA_LOST:
749 return "SCARD_E_COMM_DATA_LOST";
751 case SCARD_E_NO_KEY_CONTAINER:
752 return "SCARD_E_NO_KEY_CONTAINER";
754 case SCARD_E_SERVER_TOO_BUSY:
755 return "SCARD_E_SERVER_TOO_BUSY";
757 case SCARD_E_PIN_CACHE_EXPIRED:
758 return "SCARD_E_PIN_CACHE_EXPIRED";
760 case SCARD_E_NO_PIN_CACHE:
761 return "SCARD_E_NO_PIN_CACHE";
763 case SCARD_E_READ_ONLY_CARD:
764 return "SCARD_E_READ_ONLY_CARD";
766 case SCARD_W_UNSUPPORTED_CARD:
767 return "SCARD_W_UNSUPPORTED_CARD";
769 case SCARD_W_UNRESPONSIVE_CARD:
770 return "SCARD_W_UNRESPONSIVE_CARD";
772 case SCARD_W_UNPOWERED_CARD:
773 return "SCARD_W_UNPOWERED_CARD";
775 case SCARD_W_RESET_CARD:
776 return "SCARD_W_RESET_CARD";
778 case SCARD_W_REMOVED_CARD:
779 return "SCARD_W_REMOVED_CARD";
781 case SCARD_W_SECURITY_VIOLATION:
782 return "SCARD_W_SECURITY_VIOLATION";
784 case SCARD_W_WRONG_CHV:
785 return "SCARD_W_WRONG_CHV";
787 case SCARD_W_CHV_BLOCKED:
788 return "SCARD_W_CHV_BLOCKED";
791 return "SCARD_W_EOF";
793 case SCARD_W_CANCELLED_BY_USER:
794 return "SCARD_W_CANCELLED_BY_USER";
796 case SCARD_W_CARD_NOT_AUTHENTICATED:
797 return "SCARD_W_CARD_NOT_AUTHENTICATED";
799 case SCARD_W_CACHE_ITEM_NOT_FOUND:
800 return "SCARD_W_CACHE_ITEM_NOT_FOUND";
802 case SCARD_W_CACHE_ITEM_STALE:
803 return "SCARD_W_CACHE_ITEM_STALE";
805 case SCARD_W_CACHE_ITEM_TOO_BIG:
806 return "SCARD_W_CACHE_ITEM_TOO_BIG";
809 return "SCARD_E_UNKNOWN";
813WINSCARDAPI
const char* WINAPI SCardGetAttributeString(DWORD dwAttrId)
817 case SCARD_ATTR_VENDOR_NAME:
818 return "SCARD_ATTR_VENDOR_NAME";
820 case SCARD_ATTR_VENDOR_IFD_TYPE:
821 return "SCARD_ATTR_VENDOR_IFD_TYPE";
823 case SCARD_ATTR_VENDOR_IFD_VERSION:
824 return "SCARD_ATTR_VENDOR_IFD_VERSION";
826 case SCARD_ATTR_VENDOR_IFD_SERIAL_NO:
827 return "SCARD_ATTR_VENDOR_IFD_SERIAL_NO";
829 case SCARD_ATTR_CHANNEL_ID:
830 return "SCARD_ATTR_CHANNEL_ID";
832 case SCARD_ATTR_PROTOCOL_TYPES:
833 return "SCARD_ATTR_PROTOCOL_TYPES";
835 case SCARD_ATTR_DEFAULT_CLK:
836 return "SCARD_ATTR_DEFAULT_CLK";
838 case SCARD_ATTR_MAX_CLK:
839 return "SCARD_ATTR_MAX_CLK";
841 case SCARD_ATTR_DEFAULT_DATA_RATE:
842 return "SCARD_ATTR_DEFAULT_DATA_RATE";
844 case SCARD_ATTR_MAX_DATA_RATE:
845 return "SCARD_ATTR_MAX_DATA_RATE";
847 case SCARD_ATTR_MAX_IFSD:
848 return "SCARD_ATTR_MAX_IFSD";
850 case SCARD_ATTR_POWER_MGMT_SUPPORT:
851 return "SCARD_ATTR_POWER_MGMT_SUPPORT";
853 case SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE:
854 return "SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE";
856 case SCARD_ATTR_USER_AUTH_INPUT_DEVICE:
857 return "SCARD_ATTR_USER_AUTH_INPUT_DEVICE";
859 case SCARD_ATTR_CHARACTERISTICS:
860 return "SCARD_ATTR_CHARACTERISTICS";
862 case SCARD_ATTR_CURRENT_PROTOCOL_TYPE:
863 return "SCARD_ATTR_CURRENT_PROTOCOL_TYPE";
865 case SCARD_ATTR_CURRENT_CLK:
866 return "SCARD_ATTR_CURRENT_CLK";
868 case SCARD_ATTR_CURRENT_F:
869 return "SCARD_ATTR_CURRENT_F";
871 case SCARD_ATTR_CURRENT_D:
872 return "SCARD_ATTR_CURRENT_D";
874 case SCARD_ATTR_CURRENT_N:
875 return "SCARD_ATTR_CURRENT_N";
877 case SCARD_ATTR_CURRENT_W:
878 return "SCARD_ATTR_CURRENT_W";
880 case SCARD_ATTR_CURRENT_IFSC:
881 return "SCARD_ATTR_CURRENT_IFSC";
883 case SCARD_ATTR_CURRENT_IFSD:
884 return "SCARD_ATTR_CURRENT_IFSD";
886 case SCARD_ATTR_CURRENT_BWT:
887 return "SCARD_ATTR_CURRENT_BWT";
889 case SCARD_ATTR_CURRENT_CWT:
890 return "SCARD_ATTR_CURRENT_CWT";
892 case SCARD_ATTR_CURRENT_EBC_ENCODING:
893 return "SCARD_ATTR_CURRENT_EBC_ENCODING";
895 case SCARD_ATTR_EXTENDED_BWT:
896 return "SCARD_ATTR_EXTENDED_BWT";
898 case SCARD_ATTR_ICC_PRESENCE:
899 return "SCARD_ATTR_ICC_PRESENCE";
901 case SCARD_ATTR_ICC_INTERFACE_STATUS:
902 return "SCARD_ATTR_ICC_INTERFACE_STATUS";
904 case SCARD_ATTR_CURRENT_IO_STATE:
905 return "SCARD_ATTR_CURRENT_IO_STATE";
907 case SCARD_ATTR_ATR_STRING:
908 return "SCARD_ATTR_ATR_STRING";
910 case SCARD_ATTR_ICC_TYPE_PER_ATR:
911 return "SCARD_ATTR_ICC_TYPE_PER_ATR";
913 case SCARD_ATTR_ESC_RESET:
914 return "SCARD_ATTR_ESC_RESET";
916 case SCARD_ATTR_ESC_CANCEL:
917 return "SCARD_ATTR_ESC_CANCEL";
919 case SCARD_ATTR_ESC_AUTHREQUEST:
920 return "SCARD_ATTR_ESC_AUTHREQUEST";
922 case SCARD_ATTR_MAXINPUT:
923 return "SCARD_ATTR_MAXINPUT";
925 case SCARD_ATTR_DEVICE_UNIT:
926 return "SCARD_ATTR_DEVICE_UNIT";
928 case SCARD_ATTR_DEVICE_IN_USE:
929 return "SCARD_ATTR_DEVICE_IN_USE";
931 case SCARD_ATTR_DEVICE_FRIENDLY_NAME_A:
932 return "SCARD_ATTR_DEVICE_FRIENDLY_NAME_A";
934 case SCARD_ATTR_DEVICE_SYSTEM_NAME_A:
935 return "SCARD_ATTR_DEVICE_SYSTEM_NAME_A";
937 case SCARD_ATTR_DEVICE_FRIENDLY_NAME_W:
938 return "SCARD_ATTR_DEVICE_FRIENDLY_NAME_W";
940 case SCARD_ATTR_DEVICE_SYSTEM_NAME_W:
941 return "SCARD_ATTR_DEVICE_SYSTEM_NAME_W";
943 case SCARD_ATTR_SUPRESS_T1_IFS_REQUEST:
944 return "SCARD_ATTR_SUPRESS_T1_IFS_REQUEST";
947 return "SCARD_ATTR_UNKNOWN";
951WINSCARDAPI
const char* WINAPI SCardGetProtocolString(DWORD dwProtocols)
953 if (dwProtocols == SCARD_PROTOCOL_UNDEFINED)
954 return "SCARD_PROTOCOL_UNDEFINED";
956 if (dwProtocols == SCARD_PROTOCOL_T0)
957 return "SCARD_PROTOCOL_T0";
959 if (dwProtocols == SCARD_PROTOCOL_T1)
960 return "SCARD_PROTOCOL_T1";
962 if (dwProtocols == SCARD_PROTOCOL_Tx)
963 return "SCARD_PROTOCOL_Tx";
965 if (dwProtocols == SCARD_PROTOCOL_RAW)
966 return "SCARD_PROTOCOL_RAW";
968 if (dwProtocols == SCARD_PROTOCOL_DEFAULT)
969 return "SCARD_PROTOCOL_DEFAULT";
971 if (dwProtocols == (SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_RAW))
972 return "SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_RAW";
974 if (dwProtocols == (SCARD_PROTOCOL_T1 | SCARD_PROTOCOL_RAW))
975 return "SCARD_PROTOCOL_T1 | SCARD_PROTOCOL_RAW";
977 if (dwProtocols == (SCARD_PROTOCOL_Tx | SCARD_PROTOCOL_RAW))
978 return "SCARD_PROTOCOL_Tx | SCARD_PROTOCOL_RAW";
980 return "SCARD_PROTOCOL_UNKNOWN";
983WINSCARDAPI
const char* WINAPI SCardGetShareModeString(DWORD dwShareMode)
987 case SCARD_SHARE_EXCLUSIVE:
988 return "SCARD_SHARE_EXCLUSIVE";
990 case SCARD_SHARE_SHARED:
991 return "SCARD_SHARE_SHARED";
993 case SCARD_SHARE_DIRECT:
994 return "SCARD_SHARE_DIRECT";
997 return "SCARD_SHARE_UNKNOWN";
1001WINSCARDAPI
const char* WINAPI SCardGetDispositionString(DWORD dwDisposition)
1003 switch (dwDisposition)
1005 case SCARD_LEAVE_CARD:
1006 return "SCARD_LEAVE_CARD";
1008 case SCARD_RESET_CARD:
1009 return "SCARD_RESET_CARD";
1011 case SCARD_UNPOWER_CARD:
1012 return "SCARD_UNPOWER_CARD";
1015 return "SCARD_UNKNOWN_CARD";
1019WINSCARDAPI
const char* WINAPI SCardGetScopeString(DWORD dwScope)
1023 case SCARD_SCOPE_USER:
1024 return "SCARD_SCOPE_USER";
1026 case SCARD_SCOPE_TERMINAL:
1027 return "SCARD_SCOPE_TERMINAL";
1029 case SCARD_SCOPE_SYSTEM:
1030 return "SCARD_SCOPE_SYSTEM";
1033 return "SCARD_SCOPE_UNKNOWN";
1037WINSCARDAPI
const char* WINAPI SCardGetCardStateString(DWORD dwCardState)
1039 switch (dwCardState)
1042 return "SCARD_UNKNOWN";
1045 return "SCARD_ABSENT";
1048 return "SCARD_PRESENT";
1050 case SCARD_SWALLOWED:
1051 return "SCARD_SWALLOWED";
1054 return "SCARD_POWERED";
1056 case SCARD_NEGOTIABLE:
1057 return "SCARD_NEGOTIABLE";
1059 case SCARD_SPECIFIC:
1060 return "SCARD_SPECIFIC";
1063 return "SCARD_UNKNOWN";
1067WINSCARDAPI
char* WINAPI SCardGetReaderStateString(DWORD dwReaderState)
1069 const size_t size = 512;
1070 char* buffer = calloc(size,
sizeof(
char));
1075 if (dwReaderState & SCARD_STATE_IGNORE)
1076 winpr_str_append(
"SCARD_STATE_IGNORE", buffer, size,
"|");
1078 if (dwReaderState & SCARD_STATE_CHANGED)
1079 winpr_str_append(
"SCARD_STATE_CHANGED", buffer, size,
"|");
1081 if (dwReaderState & SCARD_STATE_UNKNOWN)
1082 winpr_str_append(
"SCARD_STATE_UNKNOWN", buffer, size,
"|");
1084 if (dwReaderState & SCARD_STATE_UNAVAILABLE)
1085 winpr_str_append(
"SCARD_STATE_UNAVAILABLE", buffer, size,
"|");
1087 if (dwReaderState & SCARD_STATE_EMPTY)
1088 winpr_str_append(
"SCARD_STATE_EMPTY", buffer, size,
"|");
1090 if (dwReaderState & SCARD_STATE_PRESENT)
1091 winpr_str_append(
"SCARD_STATE_PRESENT", buffer, size,
"|");
1093 if (dwReaderState & SCARD_STATE_ATRMATCH)
1094 winpr_str_append(
"SCARD_STATE_ATRMATCH", buffer, size,
"|");
1096 if (dwReaderState & SCARD_STATE_EXCLUSIVE)
1097 winpr_str_append(
"SCARD_STATE_EXCLUSIVE", buffer, size,
"|");
1099 if (dwReaderState & SCARD_STATE_INUSE)
1100 winpr_str_append(
"SCARD_STATE_INUSE", buffer, size,
"|");
1102 if (dwReaderState & SCARD_STATE_MUTE)
1103 winpr_str_append(
"SCARD_STATE_MUTE", buffer, size,
"|");
1105 if (dwReaderState & SCARD_STATE_UNPOWERED)
1106 winpr_str_append(
"SCARD_STATE_UNPOWERED", buffer, size,
"|");
1109 winpr_str_append(
"SCARD_STATE_UNAWARE", buffer, size,
"|");
1114#define WINSCARD_LOAD_PROC(_name) \
1117 WINPR_PRAGMA_DIAG_PUSH \
1118 WINPR_PRAGMA_DIAG_IGNORED_PEDANTIC \
1119 pWinSCardApiTable->pfn##_name = GetProcAddressAs(hWinSCardLibrary, #_name, fn##_name); \
1120 WINPR_PRAGMA_DIAG_POP \
1124 HMODULE hWinSCardLibrary)
1126 WINPR_ASSERT(pWinSCardApiTable);
1127 WINPR_ASSERT(hWinSCardLibrary);
1129 WINSCARD_LOAD_PROC(SCardEstablishContext);
1130 WINSCARD_LOAD_PROC(SCardReleaseContext);
1131 WINSCARD_LOAD_PROC(SCardIsValidContext);
1132 WINSCARD_LOAD_PROC(SCardListReaderGroupsA);
1133 WINSCARD_LOAD_PROC(SCardListReaderGroupsW);
1134 WINSCARD_LOAD_PROC(SCardListReadersA);
1135 WINSCARD_LOAD_PROC(SCardListReadersW);
1136 WINSCARD_LOAD_PROC(SCardListCardsA);
1137 WINSCARD_LOAD_PROC(SCardListCardsW);
1138 WINSCARD_LOAD_PROC(SCardListInterfacesA);
1139 WINSCARD_LOAD_PROC(SCardListInterfacesW);
1140 WINSCARD_LOAD_PROC(SCardGetProviderIdA);
1141 WINSCARD_LOAD_PROC(SCardGetProviderIdW);
1142 WINSCARD_LOAD_PROC(SCardGetCardTypeProviderNameA);
1143 WINSCARD_LOAD_PROC(SCardGetCardTypeProviderNameW);
1144 WINSCARD_LOAD_PROC(SCardIntroduceReaderGroupA);
1145 WINSCARD_LOAD_PROC(SCardIntroduceReaderGroupW);
1146 WINSCARD_LOAD_PROC(SCardForgetReaderGroupA);
1147 WINSCARD_LOAD_PROC(SCardForgetReaderGroupW);
1148 WINSCARD_LOAD_PROC(SCardIntroduceReaderA);
1149 WINSCARD_LOAD_PROC(SCardIntroduceReaderW);
1150 WINSCARD_LOAD_PROC(SCardForgetReaderA);
1151 WINSCARD_LOAD_PROC(SCardForgetReaderW);
1152 WINSCARD_LOAD_PROC(SCardAddReaderToGroupA);
1153 WINSCARD_LOAD_PROC(SCardAddReaderToGroupW);
1154 WINSCARD_LOAD_PROC(SCardRemoveReaderFromGroupA);
1155 WINSCARD_LOAD_PROC(SCardRemoveReaderFromGroupW);
1156 WINSCARD_LOAD_PROC(SCardIntroduceCardTypeA);
1157 WINSCARD_LOAD_PROC(SCardIntroduceCardTypeW);
1158 WINSCARD_LOAD_PROC(SCardSetCardTypeProviderNameA);
1159 WINSCARD_LOAD_PROC(SCardSetCardTypeProviderNameW);
1160 WINSCARD_LOAD_PROC(SCardForgetCardTypeA);
1161 WINSCARD_LOAD_PROC(SCardForgetCardTypeW);
1162 WINSCARD_LOAD_PROC(SCardFreeMemory);
1163 WINSCARD_LOAD_PROC(SCardAccessStartedEvent);
1164 WINSCARD_LOAD_PROC(SCardReleaseStartedEvent);
1165 WINSCARD_LOAD_PROC(SCardLocateCardsA);
1166 WINSCARD_LOAD_PROC(SCardLocateCardsW);
1167 WINSCARD_LOAD_PROC(SCardLocateCardsByATRA);
1168 WINSCARD_LOAD_PROC(SCardLocateCardsByATRW);
1169 WINSCARD_LOAD_PROC(SCardGetStatusChangeA);
1170 WINSCARD_LOAD_PROC(SCardGetStatusChangeW);
1171 WINSCARD_LOAD_PROC(SCardCancel);
1172 WINSCARD_LOAD_PROC(SCardConnectA);
1173 WINSCARD_LOAD_PROC(SCardConnectW);
1174 WINSCARD_LOAD_PROC(SCardReconnect);
1175 WINSCARD_LOAD_PROC(SCardDisconnect);
1176 WINSCARD_LOAD_PROC(SCardBeginTransaction);
1177 WINSCARD_LOAD_PROC(SCardEndTransaction);
1178 WINSCARD_LOAD_PROC(SCardCancelTransaction);
1179 WINSCARD_LOAD_PROC(SCardState);
1180 WINSCARD_LOAD_PROC(SCardStatusA);
1181 WINSCARD_LOAD_PROC(SCardStatusW);
1182 WINSCARD_LOAD_PROC(SCardTransmit);
1183 WINSCARD_LOAD_PROC(SCardGetTransmitCount);
1184 WINSCARD_LOAD_PROC(SCardControl);
1185 WINSCARD_LOAD_PROC(SCardGetAttrib);
1186 WINSCARD_LOAD_PROC(SCardSetAttrib);
1187 WINSCARD_LOAD_PROC(SCardUIDlgSelectCardA);
1188 WINSCARD_LOAD_PROC(SCardUIDlgSelectCardW);
1189 WINSCARD_LOAD_PROC(GetOpenCardNameA);
1190 WINSCARD_LOAD_PROC(GetOpenCardNameW);
1191 WINSCARD_LOAD_PROC(SCardDlgExtendedError);
1192 WINSCARD_LOAD_PROC(SCardReadCacheA);
1193 WINSCARD_LOAD_PROC(SCardReadCacheW);
1194 WINSCARD_LOAD_PROC(SCardWriteCacheA);
1195 WINSCARD_LOAD_PROC(SCardWriteCacheW);
1196 WINSCARD_LOAD_PROC(SCardGetReaderIconA);
1197 WINSCARD_LOAD_PROC(SCardGetReaderIconW);
1198 WINSCARD_LOAD_PROC(SCardGetDeviceTypeIdA);
1199 WINSCARD_LOAD_PROC(SCardGetDeviceTypeIdW);
1200 WINSCARD_LOAD_PROC(SCardGetReaderDeviceInstanceIdA);
1201 WINSCARD_LOAD_PROC(SCardGetReaderDeviceInstanceIdW);
1202 WINSCARD_LOAD_PROC(SCardListReadersWithDeviceInstanceIdA);
1203 WINSCARD_LOAD_PROC(SCardListReadersWithDeviceInstanceIdW);
1204 WINSCARD_LOAD_PROC(SCardAudit);
1213 SCardEstablishContext,
1214 SCardReleaseContext,
1215 SCardIsValidContext,
1216 SCardListReaderGroupsA,
1217 SCardListReaderGroupsW,
1222 SCardListInterfacesA,
1223 SCardListInterfacesW,
1224 SCardGetProviderIdA,
1225 SCardGetProviderIdW,
1226 SCardGetCardTypeProviderNameA,
1227 SCardGetCardTypeProviderNameW,
1228 SCardIntroduceReaderGroupA,
1229 SCardIntroduceReaderGroupW,
1230 SCardForgetReaderGroupA,
1231 SCardForgetReaderGroupW,
1232 SCardIntroduceReaderA,
1233 SCardIntroduceReaderW,
1236 SCardAddReaderToGroupA,
1237 SCardAddReaderToGroupW,
1238 SCardRemoveReaderFromGroupA,
1239 SCardRemoveReaderFromGroupW,
1240 SCardIntroduceCardTypeA,
1241 SCardIntroduceCardTypeW,
1242 SCardSetCardTypeProviderNameA,
1243 SCardSetCardTypeProviderNameW,
1244 SCardForgetCardTypeA,
1245 SCardForgetCardTypeW,
1247 SCardAccessStartedEvent,
1248 SCardReleaseStartedEvent,
1251 SCardLocateCardsByATRA,
1252 SCardLocateCardsByATRW,
1253 SCardGetStatusChangeA,
1254 SCardGetStatusChangeW,
1260 SCardBeginTransaction,
1261 SCardEndTransaction,
1262 SCardCancelTransaction,
1267 SCardGetTransmitCount,
1271 SCardUIDlgSelectCardA,
1272 SCardUIDlgSelectCardW,
1275 SCardDlgExtendedError,
1280 SCardGetReaderIconA,
1281 SCardGetReaderIconW,
1282 SCardGetDeviceTypeIdA,
1283 SCardGetDeviceTypeIdW,
1284 SCardGetReaderDeviceInstanceIdA,
1285 SCardGetReaderDeviceInstanceIdW,
1286 SCardListReadersWithDeviceInstanceIdA,
1287 SCardListReadersWithDeviceInstanceIdW,
1293 return &WinPR_SCardApiFunctionTable;