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 WLog_DBG(TAG, "Missing function pointer g_SCardApi=%p->" xstr(pfn##_name) "=%p", \
53 WINPR_FUNC_PTR_CAST(g_SCardApi, const void*), \
54 WINPR_FUNC_PTR_CAST(g_SCardApi ? g_SCardApi->pfn##_name : nullptr, const void*)); \
55 return SCARD_E_NO_SERVICE; \
57 return g_SCardApi->pfn##_name(__VA_ARGS__)
59#define SCARDAPI_STUB_CALL_HANDLE(_name) \
60 if (!InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, nullptr, nullptr)) \
62 if (!g_SCardApi || !g_SCardApi->pfn##_name) \
64 WLog_DBG(TAG, "Missing function pointer g_SCardApi=%p->" xstr(pfn##_name) "=%p", \
65 WINPR_FUNC_PTR_CAST(g_SCardApi, const void*), \
66 WINPR_FUNC_PTR_CAST(g_SCardApi ? g_SCardApi->pfn##_name : nullptr, const void*)); \
69 return g_SCardApi->pfn##_name()
71#define SCARDAPI_STUB_CALL_VOID(_name) \
72 if (!InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, nullptr, nullptr)) \
74 if (!g_SCardApi || !g_SCardApi->pfn##_name) \
76 WLog_DBG(TAG, "Missing function pointer g_SCardApi=%p->" xstr(pfn##_name) "=%p", \
77 WINPR_FUNC_PTR_CAST(g_SCardApi, const void*), \
78 WINPR_FUNC_PTR_CAST(g_SCardApi ? g_SCardApi->pfn##_name : nullptr, const void*)); \
81 g_SCardApi->pfn##_name()
91static BOOL CALLBACK InitializeSCardApiStubs(WINPR_ATTR_UNUSED
PINIT_ONCE once,
92 WINPR_ATTR_UNUSED PVOID param,
93 WINPR_ATTR_UNUSED PVOID* context)
96 if (Windows_InitializeSCardApi() >= 0)
97 g_SCardApi = Windows_GetSCardApiFunctionTable();
99#if defined(WITH_SMARTCARD_PCSC)
100 if (PCSC_InitializeSCardApi() >= 0)
101 g_SCardApi = PCSC_GetSCardApiFunctionTable();
105#if defined(WITH_SMARTCARD_INSPECT)
106 g_SCardApi = Inspect_RegisterSCardApi(g_SCardApi);
111WINSCARDAPI LONG WINAPI SCardEstablishContext(DWORD dwScope, LPCVOID pvReserved1,
112 LPCVOID pvReserved2, LPSCARDCONTEXT phContext)
114 SCARDAPI_STUB_CALL_LONG(SCardEstablishContext, dwScope, pvReserved1, pvReserved2, phContext);
117WINSCARDAPI LONG WINAPI SCardReleaseContext(SCARDCONTEXT hContext)
119 SCARDAPI_STUB_CALL_LONG(SCardReleaseContext, hContext);
122WINSCARDAPI LONG WINAPI SCardIsValidContext(SCARDCONTEXT hContext)
124 SCARDAPI_STUB_CALL_LONG(SCardIsValidContext, hContext);
127WINSCARDAPI LONG WINAPI SCardListReaderGroupsA(SCARDCONTEXT hContext, LPSTR mszGroups,
130 SCARDAPI_STUB_CALL_LONG(SCardListReaderGroupsA, hContext, mszGroups, pcchGroups);
133WINSCARDAPI LONG WINAPI SCardListReaderGroupsW(SCARDCONTEXT hContext, LPWSTR mszGroups,
136 SCARDAPI_STUB_CALL_LONG(SCardListReaderGroupsW, hContext, mszGroups, pcchGroups);
139WINSCARDAPI LONG WINAPI SCardListReadersA(SCARDCONTEXT hContext, LPCSTR mszGroups, LPSTR mszReaders,
142 SCARDAPI_STUB_CALL_LONG(SCardListReadersA, hContext, mszGroups, mszReaders, pcchReaders);
145WINSCARDAPI LONG WINAPI SCardListReadersW(SCARDCONTEXT hContext, LPCWSTR mszGroups,
146 LPWSTR mszReaders, LPDWORD pcchReaders)
148 SCARDAPI_STUB_CALL_LONG(SCardListReadersW, hContext, mszGroups, mszReaders, pcchReaders);
151WINSCARDAPI LONG WINAPI SCardListCardsA(SCARDCONTEXT hContext, LPCBYTE pbAtr,
152 LPCGUID rgquidInterfaces, DWORD cguidInterfaceCount,
153 CHAR* mszCards, LPDWORD pcchCards)
155 SCARDAPI_STUB_CALL_LONG(SCardListCardsA, hContext, pbAtr, rgquidInterfaces, cguidInterfaceCount,
156 mszCards, pcchCards);
159WINSCARDAPI LONG WINAPI SCardListCardsW(SCARDCONTEXT hContext, LPCBYTE pbAtr,
160 LPCGUID rgquidInterfaces, DWORD cguidInterfaceCount,
161 WCHAR* mszCards, LPDWORD pcchCards)
163 SCARDAPI_STUB_CALL_LONG(SCardListCardsW, hContext, pbAtr, rgquidInterfaces, cguidInterfaceCount,
164 mszCards, pcchCards);
167WINSCARDAPI LONG WINAPI SCardListInterfacesA(SCARDCONTEXT hContext, LPCSTR szCard,
168 LPGUID pguidInterfaces, LPDWORD pcguidInterfaces)
170 SCARDAPI_STUB_CALL_LONG(SCardListInterfacesA, hContext, szCard, pguidInterfaces,
174WINSCARDAPI LONG WINAPI SCardListInterfacesW(SCARDCONTEXT hContext, LPCWSTR szCard,
175 LPGUID pguidInterfaces, LPDWORD pcguidInterfaces)
177 SCARDAPI_STUB_CALL_LONG(SCardListInterfacesW, hContext, szCard, pguidInterfaces,
181WINSCARDAPI LONG WINAPI SCardGetProviderIdA(SCARDCONTEXT hContext, LPCSTR szCard,
182 LPGUID pguidProviderId)
184 SCARDAPI_STUB_CALL_LONG(SCardGetProviderIdA, hContext, szCard, pguidProviderId);
187WINSCARDAPI LONG WINAPI SCardGetProviderIdW(SCARDCONTEXT hContext, LPCWSTR szCard,
188 LPGUID pguidProviderId)
190 SCARDAPI_STUB_CALL_LONG(SCardGetProviderIdW, hContext, szCard, pguidProviderId);
193WINSCARDAPI LONG WINAPI SCardGetCardTypeProviderNameA(SCARDCONTEXT hContext, LPCSTR szCardName,
194 DWORD dwProviderId, CHAR* szProvider,
195 LPDWORD pcchProvider)
197 SCARDAPI_STUB_CALL_LONG(SCardGetCardTypeProviderNameA, hContext, szCardName, dwProviderId,
198 szProvider, pcchProvider);
201WINSCARDAPI LONG WINAPI SCardGetCardTypeProviderNameW(SCARDCONTEXT hContext, LPCWSTR szCardName,
202 DWORD dwProviderId, WCHAR* szProvider,
203 LPDWORD pcchProvider)
205 SCARDAPI_STUB_CALL_LONG(SCardGetCardTypeProviderNameW, hContext, szCardName, dwProviderId,
206 szProvider, pcchProvider);
209WINSCARDAPI LONG WINAPI SCardIntroduceReaderGroupA(SCARDCONTEXT hContext, LPCSTR szGroupName)
211 SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderGroupA, hContext, szGroupName);
214WINSCARDAPI LONG WINAPI SCardIntroduceReaderGroupW(SCARDCONTEXT hContext, LPCWSTR szGroupName)
216 SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderGroupW, hContext, szGroupName);
219WINSCARDAPI LONG WINAPI SCardForgetReaderGroupA(SCARDCONTEXT hContext, LPCSTR szGroupName)
221 SCARDAPI_STUB_CALL_LONG(SCardForgetReaderGroupA, hContext, szGroupName);
224WINSCARDAPI LONG WINAPI SCardForgetReaderGroupW(SCARDCONTEXT hContext, LPCWSTR szGroupName)
226 SCARDAPI_STUB_CALL_LONG(SCardForgetReaderGroupW, hContext, szGroupName);
229WINSCARDAPI LONG WINAPI SCardIntroduceReaderA(SCARDCONTEXT hContext, LPCSTR szReaderName,
232 SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderA, hContext, szReaderName, szDeviceName);
235WINSCARDAPI LONG WINAPI SCardIntroduceReaderW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
236 LPCWSTR szDeviceName)
238 SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderW, hContext, szReaderName, szDeviceName);
241WINSCARDAPI LONG WINAPI SCardForgetReaderA(SCARDCONTEXT hContext, LPCSTR szReaderName)
243 SCARDAPI_STUB_CALL_LONG(SCardForgetReaderA, hContext, szReaderName);
246WINSCARDAPI LONG WINAPI SCardForgetReaderW(SCARDCONTEXT hContext, LPCWSTR szReaderName)
248 SCARDAPI_STUB_CALL_LONG(SCardForgetReaderW, hContext, szReaderName);
251WINSCARDAPI LONG WINAPI SCardAddReaderToGroupA(SCARDCONTEXT hContext, LPCSTR szReaderName,
254 SCARDAPI_STUB_CALL_LONG(SCardAddReaderToGroupA, hContext, szReaderName, szGroupName);
257WINSCARDAPI LONG WINAPI SCardAddReaderToGroupW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
260 SCARDAPI_STUB_CALL_LONG(SCardAddReaderToGroupW, hContext, szReaderName, szGroupName);
263WINSCARDAPI LONG WINAPI SCardRemoveReaderFromGroupA(SCARDCONTEXT hContext, LPCSTR szReaderName,
266 SCARDAPI_STUB_CALL_LONG(SCardRemoveReaderFromGroupA, hContext, szReaderName, szGroupName);
269WINSCARDAPI LONG WINAPI SCardRemoveReaderFromGroupW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
272 SCARDAPI_STUB_CALL_LONG(SCardRemoveReaderFromGroupW, hContext, szReaderName, szGroupName);
275WINSCARDAPI LONG WINAPI SCardIntroduceCardTypeA(SCARDCONTEXT hContext, LPCSTR szCardName,
276 LPCGUID pguidPrimaryProvider,
277 LPCGUID rgguidInterfaces, DWORD dwInterfaceCount,
278 LPCBYTE pbAtr, LPCBYTE pbAtrMask, DWORD cbAtrLen)
280 SCARDAPI_STUB_CALL_LONG(SCardIntroduceCardTypeA, hContext, szCardName, pguidPrimaryProvider,
281 rgguidInterfaces, dwInterfaceCount, pbAtr, pbAtrMask, cbAtrLen);
284WINSCARDAPI LONG WINAPI SCardIntroduceCardTypeW(SCARDCONTEXT hContext, LPCWSTR szCardName,
285 LPCGUID pguidPrimaryProvider,
286 LPCGUID rgguidInterfaces, DWORD dwInterfaceCount,
287 LPCBYTE pbAtr, LPCBYTE pbAtrMask, DWORD cbAtrLen)
289 SCARDAPI_STUB_CALL_LONG(SCardIntroduceCardTypeW, hContext, szCardName, pguidPrimaryProvider,
290 rgguidInterfaces, dwInterfaceCount, pbAtr, pbAtrMask, cbAtrLen);
293WINSCARDAPI LONG WINAPI SCardSetCardTypeProviderNameA(SCARDCONTEXT hContext, LPCSTR szCardName,
294 DWORD dwProviderId, LPCSTR szProvider)
296 SCARDAPI_STUB_CALL_LONG(SCardSetCardTypeProviderNameA, hContext, szCardName, dwProviderId,
300WINSCARDAPI LONG WINAPI SCardSetCardTypeProviderNameW(SCARDCONTEXT hContext, LPCWSTR szCardName,
301 DWORD dwProviderId, LPCWSTR szProvider)
303 SCARDAPI_STUB_CALL_LONG(SCardSetCardTypeProviderNameW, hContext, szCardName, dwProviderId,
307WINSCARDAPI LONG WINAPI SCardForgetCardTypeA(SCARDCONTEXT hContext, LPCSTR szCardName)
309 SCARDAPI_STUB_CALL_LONG(SCardForgetCardTypeA, hContext, szCardName);
312WINSCARDAPI LONG WINAPI SCardForgetCardTypeW(SCARDCONTEXT hContext, LPCWSTR szCardName)
314 SCARDAPI_STUB_CALL_LONG(SCardForgetCardTypeW, hContext, szCardName);
317WINSCARDAPI LONG WINAPI SCardFreeMemory(SCARDCONTEXT hContext, LPVOID pvMem)
319 SCARDAPI_STUB_CALL_LONG(SCardFreeMemory, hContext, pvMem);
322WINSCARDAPI HANDLE WINAPI SCardAccessStartedEvent(
void)
324 SCARDAPI_STUB_CALL_HANDLE(SCardAccessStartedEvent);
327WINSCARDAPI
void WINAPI SCardReleaseStartedEvent(
void)
329 SCARDAPI_STUB_CALL_VOID(SCardReleaseStartedEvent);
332WINSCARDAPI LONG WINAPI SCardLocateCardsA(SCARDCONTEXT hContext, LPCSTR mszCards,
335 SCARDAPI_STUB_CALL_LONG(SCardLocateCardsA, hContext, mszCards, rgReaderStates, cReaders);
338WINSCARDAPI LONG WINAPI SCardLocateCardsW(SCARDCONTEXT hContext, LPCWSTR mszCards,
341 SCARDAPI_STUB_CALL_LONG(SCardLocateCardsW, hContext, mszCards, rgReaderStates, cReaders);
344WINSCARDAPI LONG WINAPI SCardLocateCardsByATRA(SCARDCONTEXT hContext,
LPSCARD_ATRMASK rgAtrMasks,
348 SCARDAPI_STUB_CALL_LONG(SCardLocateCardsByATRA, hContext, rgAtrMasks, cAtrs, rgReaderStates,
352WINSCARDAPI LONG WINAPI SCardLocateCardsByATRW(SCARDCONTEXT hContext,
LPSCARD_ATRMASK rgAtrMasks,
356 SCARDAPI_STUB_CALL_LONG(SCardLocateCardsByATRW, hContext, rgAtrMasks, cAtrs, rgReaderStates,
360WINSCARDAPI LONG WINAPI SCardGetStatusChangeA(SCARDCONTEXT hContext, DWORD dwTimeout,
363 SCARDAPI_STUB_CALL_LONG(SCardGetStatusChangeA, hContext, dwTimeout, rgReaderStates, cReaders);
366WINSCARDAPI LONG WINAPI SCardGetStatusChangeW(SCARDCONTEXT hContext, DWORD dwTimeout,
369 SCARDAPI_STUB_CALL_LONG(SCardGetStatusChangeW, hContext, dwTimeout, rgReaderStates, cReaders);
372WINSCARDAPI LONG WINAPI SCardCancel(SCARDCONTEXT hContext)
374 SCARDAPI_STUB_CALL_LONG(SCardCancel, hContext);
377WINSCARDAPI LONG WINAPI SCardConnectA(SCARDCONTEXT hContext, LPCSTR szReader, DWORD dwShareMode,
378 DWORD dwPreferredProtocols, LPSCARDHANDLE phCard,
379 LPDWORD pdwActiveProtocol)
381 SCARDAPI_STUB_CALL_LONG(SCardConnectA, hContext, szReader, dwShareMode, dwPreferredProtocols,
382 phCard, pdwActiveProtocol);
385WINSCARDAPI LONG WINAPI SCardConnectW(SCARDCONTEXT hContext, LPCWSTR szReader, DWORD dwShareMode,
386 DWORD dwPreferredProtocols, LPSCARDHANDLE phCard,
387 LPDWORD pdwActiveProtocol)
389 SCARDAPI_STUB_CALL_LONG(SCardConnectW, hContext, szReader, dwShareMode, dwPreferredProtocols,
390 phCard, pdwActiveProtocol);
393WINSCARDAPI LONG WINAPI SCardReconnect(SCARDHANDLE hCard, DWORD dwShareMode,
394 DWORD dwPreferredProtocols, DWORD dwInitialization,
395 LPDWORD pdwActiveProtocol)
397 SCARDAPI_STUB_CALL_LONG(SCardReconnect, hCard, dwShareMode, dwPreferredProtocols,
398 dwInitialization, pdwActiveProtocol);
401WINSCARDAPI LONG WINAPI SCardDisconnect(SCARDHANDLE hCard, DWORD dwDisposition)
403 SCARDAPI_STUB_CALL_LONG(SCardDisconnect, hCard, dwDisposition);
406WINSCARDAPI LONG WINAPI SCardBeginTransaction(SCARDHANDLE hCard)
408 SCARDAPI_STUB_CALL_LONG(SCardBeginTransaction, hCard);
411WINSCARDAPI LONG WINAPI SCardEndTransaction(SCARDHANDLE hCard, DWORD dwDisposition)
413 SCARDAPI_STUB_CALL_LONG(SCardEndTransaction, hCard, dwDisposition);
416WINSCARDAPI LONG WINAPI SCardCancelTransaction(SCARDHANDLE hCard)
418 SCARDAPI_STUB_CALL_LONG(SCardCancelTransaction, hCard);
421WINSCARDAPI LONG WINAPI SCardState(SCARDHANDLE hCard, LPDWORD pdwState, LPDWORD pdwProtocol,
422 LPBYTE pbAtr, LPDWORD pcbAtrLen)
424 SCARDAPI_STUB_CALL_LONG(SCardState, hCard, pdwState, pdwProtocol, pbAtr, pcbAtrLen);
427WINSCARDAPI LONG WINAPI SCardStatusA(SCARDHANDLE hCard, LPSTR mszReaderNames, LPDWORD pcchReaderLen,
428 LPDWORD pdwState, LPDWORD pdwProtocol, LPBYTE pbAtr,
431 SCARDAPI_STUB_CALL_LONG(SCardStatusA, hCard, mszReaderNames, pcchReaderLen, pdwState,
432 pdwProtocol, pbAtr, pcbAtrLen);
435WINSCARDAPI LONG WINAPI SCardStatusW(SCARDHANDLE hCard, LPWSTR mszReaderNames,
436 LPDWORD pcchReaderLen, LPDWORD pdwState, LPDWORD pdwProtocol,
437 LPBYTE pbAtr, LPDWORD pcbAtrLen)
439 SCARDAPI_STUB_CALL_LONG(SCardStatusW, hCard, mszReaderNames, pcchReaderLen, pdwState,
440 pdwProtocol, pbAtr, pcbAtrLen);
444 LPCBYTE pbSendBuffer, DWORD cbSendLength,
446 LPDWORD pcbRecvLength)
448 SCARDAPI_STUB_CALL_LONG(SCardTransmit, hCard, pioSendPci, pbSendBuffer, cbSendLength,
449 pioRecvPci, pbRecvBuffer, pcbRecvLength);
452WINSCARDAPI LONG WINAPI SCardGetTransmitCount(SCARDHANDLE hCard, LPDWORD pcTransmitCount)
454 SCARDAPI_STUB_CALL_LONG(SCardGetTransmitCount, hCard, pcTransmitCount);
457WINSCARDAPI LONG WINAPI SCardControl(SCARDHANDLE hCard, DWORD dwControlCode, LPCVOID lpInBuffer,
458 DWORD cbInBufferSize, LPVOID lpOutBuffer,
459 DWORD cbOutBufferSize, LPDWORD lpBytesReturned)
461 SCARDAPI_STUB_CALL_LONG(SCardControl, hCard, dwControlCode, lpInBuffer, cbInBufferSize,
462 lpOutBuffer, cbOutBufferSize, lpBytesReturned);
465WINSCARDAPI LONG WINAPI SCardGetAttrib(SCARDHANDLE hCard, DWORD dwAttrId, LPBYTE pbAttr,
468 SCARDAPI_STUB_CALL_LONG(SCardGetAttrib, hCard, dwAttrId, pbAttr, pcbAttrLen);
471WINSCARDAPI LONG WINAPI SCardSetAttrib(SCARDHANDLE hCard, DWORD dwAttrId, LPCBYTE pbAttr,
474 SCARDAPI_STUB_CALL_LONG(SCardSetAttrib, hCard, dwAttrId, pbAttr, cbAttrLen);
477WINSCARDAPI LONG WINAPI SCardUIDlgSelectCardA(LPOPENCARDNAMEA_EX pDlgStruc)
479 SCARDAPI_STUB_CALL_LONG(SCardUIDlgSelectCardA, pDlgStruc);
482WINSCARDAPI LONG WINAPI SCardUIDlgSelectCardW(LPOPENCARDNAMEW_EX pDlgStruc)
484 SCARDAPI_STUB_CALL_LONG(SCardUIDlgSelectCardW, pDlgStruc);
489 SCARDAPI_STUB_CALL_LONG(GetOpenCardNameA, pDlgStruc);
494 SCARDAPI_STUB_CALL_LONG(GetOpenCardNameW, pDlgStruc);
497WINSCARDAPI LONG WINAPI SCardDlgExtendedError(
void)
499 SCARDAPI_STUB_CALL_LONG(SCardDlgExtendedError);
502WINSCARDAPI LONG WINAPI SCardReadCacheA(SCARDCONTEXT hContext,
UUID* CardIdentifier,
503 DWORD FreshnessCounter, LPSTR LookupName, PBYTE Data,
506 SCARDAPI_STUB_CALL_LONG(SCardReadCacheA, hContext, CardIdentifier, FreshnessCounter, LookupName,
510WINSCARDAPI LONG WINAPI SCardReadCacheW(SCARDCONTEXT hContext,
UUID* CardIdentifier,
511 DWORD FreshnessCounter, LPWSTR LookupName, PBYTE Data,
514 SCARDAPI_STUB_CALL_LONG(SCardReadCacheW, hContext, CardIdentifier, FreshnessCounter, LookupName,
518WINSCARDAPI LONG WINAPI SCardWriteCacheA(SCARDCONTEXT hContext,
UUID* CardIdentifier,
519 DWORD FreshnessCounter, LPSTR LookupName, PBYTE Data,
522 SCARDAPI_STUB_CALL_LONG(SCardWriteCacheA, hContext, CardIdentifier, FreshnessCounter,
523 LookupName, Data, DataLen);
526WINSCARDAPI LONG WINAPI SCardWriteCacheW(SCARDCONTEXT hContext,
UUID* CardIdentifier,
527 DWORD FreshnessCounter, LPWSTR LookupName, PBYTE Data,
530 SCARDAPI_STUB_CALL_LONG(SCardWriteCacheW, hContext, CardIdentifier, FreshnessCounter,
531 LookupName, Data, DataLen);
534WINSCARDAPI LONG WINAPI SCardGetReaderIconA(SCARDCONTEXT hContext, LPCSTR szReaderName,
535 LPBYTE pbIcon, LPDWORD pcbIcon)
537 SCARDAPI_STUB_CALL_LONG(SCardGetReaderIconA, hContext, szReaderName, pbIcon, pcbIcon);
540WINSCARDAPI LONG WINAPI SCardGetReaderIconW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
541 LPBYTE pbIcon, LPDWORD pcbIcon)
543 SCARDAPI_STUB_CALL_LONG(SCardGetReaderIconW, hContext, szReaderName, pbIcon, pcbIcon);
546WINSCARDAPI LONG WINAPI SCardGetDeviceTypeIdA(SCARDCONTEXT hContext, LPCSTR szReaderName,
547 LPDWORD pdwDeviceTypeId)
549 SCARDAPI_STUB_CALL_LONG(SCardGetDeviceTypeIdA, hContext, szReaderName, pdwDeviceTypeId);
552WINSCARDAPI LONG WINAPI SCardGetDeviceTypeIdW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
553 LPDWORD pdwDeviceTypeId)
555 SCARDAPI_STUB_CALL_LONG(SCardGetDeviceTypeIdW, hContext, szReaderName, pdwDeviceTypeId);
558WINSCARDAPI LONG WINAPI SCardGetReaderDeviceInstanceIdA(SCARDCONTEXT hContext, LPCSTR szReaderName,
559 LPSTR szDeviceInstanceId,
560 LPDWORD pcchDeviceInstanceId)
562 SCARDAPI_STUB_CALL_LONG(SCardGetReaderDeviceInstanceIdA, hContext, szReaderName,
563 szDeviceInstanceId, pcchDeviceInstanceId);
566WINSCARDAPI LONG WINAPI SCardGetReaderDeviceInstanceIdW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
567 LPWSTR szDeviceInstanceId,
568 LPDWORD pcchDeviceInstanceId)
570 SCARDAPI_STUB_CALL_LONG(SCardGetReaderDeviceInstanceIdW, hContext, szReaderName,
571 szDeviceInstanceId, pcchDeviceInstanceId);
574WINSCARDAPI LONG WINAPI SCardListReadersWithDeviceInstanceIdA(SCARDCONTEXT hContext,
575 LPCSTR szDeviceInstanceId,
576 LPSTR mszReaders, LPDWORD pcchReaders)
578 SCARDAPI_STUB_CALL_LONG(SCardListReadersWithDeviceInstanceIdA, hContext, szDeviceInstanceId,
579 mszReaders, pcchReaders);
582WINSCARDAPI LONG WINAPI SCardListReadersWithDeviceInstanceIdW(SCARDCONTEXT hContext,
583 LPCWSTR szDeviceInstanceId,
587 SCARDAPI_STUB_CALL_LONG(SCardListReadersWithDeviceInstanceIdW, hContext, szDeviceInstanceId,
588 mszReaders, pcchReaders);
591WINSCARDAPI LONG WINAPI SCardAudit(SCARDCONTEXT hContext, DWORD dwEvent)
593 SCARDAPI_STUB_CALL_LONG(SCardAudit, hContext, dwEvent);
600WINSCARDAPI
const char* WINAPI SCardGetErrorString(LONG errorCode)
604 case SCARD_S_SUCCESS:
605 return "SCARD_S_SUCCESS";
607 case SCARD_F_INTERNAL_ERROR:
608 return "SCARD_F_INTERNAL_ERROR";
610 case SCARD_E_CANCELLED:
611 return "SCARD_E_CANCELLED";
613 case SCARD_E_INVALID_HANDLE:
614 return "SCARD_E_INVALID_HANDLE";
616 case SCARD_E_INVALID_PARAMETER:
617 return "SCARD_E_INVALID_PARAMETER";
619 case SCARD_E_INVALID_TARGET:
620 return "SCARD_E_INVALID_TARGET";
622 case SCARD_E_NO_MEMORY:
623 return "SCARD_E_NO_MEMORY";
625 case SCARD_F_WAITED_TOO_LONG:
626 return "SCARD_F_WAITED_TOO_LONG";
628 case SCARD_E_INSUFFICIENT_BUFFER:
629 return "SCARD_E_INSUFFICIENT_BUFFER";
631 case SCARD_E_UNKNOWN_READER:
632 return "SCARD_E_UNKNOWN_READER";
634 case SCARD_E_TIMEOUT:
635 return "SCARD_E_TIMEOUT";
637 case SCARD_E_SHARING_VIOLATION:
638 return "SCARD_E_SHARING_VIOLATION";
640 case SCARD_E_NO_SMARTCARD:
641 return "SCARD_E_NO_SMARTCARD";
643 case SCARD_E_UNKNOWN_CARD:
644 return "SCARD_E_UNKNOWN_CARD";
646 case SCARD_E_CANT_DISPOSE:
647 return "SCARD_E_CANT_DISPOSE";
649 case SCARD_E_PROTO_MISMATCH:
650 return "SCARD_E_PROTO_MISMATCH";
652 case SCARD_E_NOT_READY:
653 return "SCARD_E_NOT_READY";
655 case SCARD_E_INVALID_VALUE:
656 return "SCARD_E_INVALID_VALUE";
658 case SCARD_E_SYSTEM_CANCELLED:
659 return "SCARD_E_SYSTEM_CANCELLED";
661 case SCARD_F_COMM_ERROR:
662 return "SCARD_F_COMM_ERROR";
664 case SCARD_F_UNKNOWN_ERROR:
665 return "SCARD_F_UNKNOWN_ERROR";
667 case SCARD_E_INVALID_ATR:
668 return "SCARD_E_INVALID_ATR";
670 case SCARD_E_NOT_TRANSACTED:
671 return "SCARD_E_NOT_TRANSACTED";
673 case SCARD_E_READER_UNAVAILABLE:
674 return "SCARD_E_READER_UNAVAILABLE";
676 case SCARD_P_SHUTDOWN:
677 return "SCARD_P_SHUTDOWN";
679 case SCARD_E_PCI_TOO_SMALL:
680 return "SCARD_E_PCI_TOO_SMALL";
682 case SCARD_E_READER_UNSUPPORTED:
683 return "SCARD_E_READER_UNSUPPORTED";
685 case SCARD_E_DUPLICATE_READER:
686 return "SCARD_E_DUPLICATE_READER";
688 case SCARD_E_CARD_UNSUPPORTED:
689 return "SCARD_E_CARD_UNSUPPORTED";
691 case SCARD_E_NO_SERVICE:
692 return "SCARD_E_NO_SERVICE";
694 case SCARD_E_SERVICE_STOPPED:
695 return "SCARD_E_SERVICE_STOPPED";
697 case SCARD_E_UNEXPECTED:
698 return "SCARD_E_UNEXPECTED";
700 case SCARD_E_ICC_INSTALLATION:
701 return "SCARD_E_ICC_INSTALLATION";
703 case SCARD_E_ICC_CREATEORDER:
704 return "SCARD_E_ICC_CREATEORDER";
706 case SCARD_E_UNSUPPORTED_FEATURE:
707 return "SCARD_E_UNSUPPORTED_FEATURE";
709 case SCARD_E_DIR_NOT_FOUND:
710 return "SCARD_E_DIR_NOT_FOUND";
712 case SCARD_E_FILE_NOT_FOUND:
713 return "SCARD_E_FILE_NOT_FOUND";
716 return "SCARD_E_NO_DIR";
718 case SCARD_E_NO_FILE:
719 return "SCARD_E_NO_FILE";
721 case SCARD_E_NO_ACCESS:
722 return "SCARD_E_NO_ACCESS";
724 case SCARD_E_WRITE_TOO_MANY:
725 return "SCARD_E_WRITE_TOO_MANY";
727 case SCARD_E_BAD_SEEK:
728 return "SCARD_E_BAD_SEEK";
730 case SCARD_E_INVALID_CHV:
731 return "SCARD_E_INVALID_CHV";
733 case SCARD_E_UNKNOWN_RES_MNG:
734 return "SCARD_E_UNKNOWN_RES_MNG";
736 case SCARD_E_NO_SUCH_CERTIFICATE:
737 return "SCARD_E_NO_SUCH_CERTIFICATE";
739 case SCARD_E_CERTIFICATE_UNAVAILABLE:
740 return "SCARD_E_CERTIFICATE_UNAVAILABLE";
742 case SCARD_E_NO_READERS_AVAILABLE:
743 return "SCARD_E_NO_READERS_AVAILABLE";
745 case SCARD_E_COMM_DATA_LOST:
746 return "SCARD_E_COMM_DATA_LOST";
748 case SCARD_E_NO_KEY_CONTAINER:
749 return "SCARD_E_NO_KEY_CONTAINER";
751 case SCARD_E_SERVER_TOO_BUSY:
752 return "SCARD_E_SERVER_TOO_BUSY";
754 case SCARD_E_PIN_CACHE_EXPIRED:
755 return "SCARD_E_PIN_CACHE_EXPIRED";
757 case SCARD_E_NO_PIN_CACHE:
758 return "SCARD_E_NO_PIN_CACHE";
760 case SCARD_E_READ_ONLY_CARD:
761 return "SCARD_E_READ_ONLY_CARD";
763 case SCARD_W_UNSUPPORTED_CARD:
764 return "SCARD_W_UNSUPPORTED_CARD";
766 case SCARD_W_UNRESPONSIVE_CARD:
767 return "SCARD_W_UNRESPONSIVE_CARD";
769 case SCARD_W_UNPOWERED_CARD:
770 return "SCARD_W_UNPOWERED_CARD";
772 case SCARD_W_RESET_CARD:
773 return "SCARD_W_RESET_CARD";
775 case SCARD_W_REMOVED_CARD:
776 return "SCARD_W_REMOVED_CARD";
778 case SCARD_W_SECURITY_VIOLATION:
779 return "SCARD_W_SECURITY_VIOLATION";
781 case SCARD_W_WRONG_CHV:
782 return "SCARD_W_WRONG_CHV";
784 case SCARD_W_CHV_BLOCKED:
785 return "SCARD_W_CHV_BLOCKED";
788 return "SCARD_W_EOF";
790 case SCARD_W_CANCELLED_BY_USER:
791 return "SCARD_W_CANCELLED_BY_USER";
793 case SCARD_W_CARD_NOT_AUTHENTICATED:
794 return "SCARD_W_CARD_NOT_AUTHENTICATED";
796 case SCARD_W_CACHE_ITEM_NOT_FOUND:
797 return "SCARD_W_CACHE_ITEM_NOT_FOUND";
799 case SCARD_W_CACHE_ITEM_STALE:
800 return "SCARD_W_CACHE_ITEM_STALE";
802 case SCARD_W_CACHE_ITEM_TOO_BIG:
803 return "SCARD_W_CACHE_ITEM_TOO_BIG";
806 return "SCARD_E_UNKNOWN";
810WINSCARDAPI
const char* WINAPI SCardGetAttributeString(DWORD dwAttrId)
814 case SCARD_ATTR_VENDOR_NAME:
815 return "SCARD_ATTR_VENDOR_NAME";
817 case SCARD_ATTR_VENDOR_IFD_TYPE:
818 return "SCARD_ATTR_VENDOR_IFD_TYPE";
820 case SCARD_ATTR_VENDOR_IFD_VERSION:
821 return "SCARD_ATTR_VENDOR_IFD_VERSION";
823 case SCARD_ATTR_VENDOR_IFD_SERIAL_NO:
824 return "SCARD_ATTR_VENDOR_IFD_SERIAL_NO";
826 case SCARD_ATTR_CHANNEL_ID:
827 return "SCARD_ATTR_CHANNEL_ID";
829 case SCARD_ATTR_PROTOCOL_TYPES:
830 return "SCARD_ATTR_PROTOCOL_TYPES";
832 case SCARD_ATTR_DEFAULT_CLK:
833 return "SCARD_ATTR_DEFAULT_CLK";
835 case SCARD_ATTR_MAX_CLK:
836 return "SCARD_ATTR_MAX_CLK";
838 case SCARD_ATTR_DEFAULT_DATA_RATE:
839 return "SCARD_ATTR_DEFAULT_DATA_RATE";
841 case SCARD_ATTR_MAX_DATA_RATE:
842 return "SCARD_ATTR_MAX_DATA_RATE";
844 case SCARD_ATTR_MAX_IFSD:
845 return "SCARD_ATTR_MAX_IFSD";
847 case SCARD_ATTR_POWER_MGMT_SUPPORT:
848 return "SCARD_ATTR_POWER_MGMT_SUPPORT";
850 case SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE:
851 return "SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE";
853 case SCARD_ATTR_USER_AUTH_INPUT_DEVICE:
854 return "SCARD_ATTR_USER_AUTH_INPUT_DEVICE";
856 case SCARD_ATTR_CHARACTERISTICS:
857 return "SCARD_ATTR_CHARACTERISTICS";
859 case SCARD_ATTR_CURRENT_PROTOCOL_TYPE:
860 return "SCARD_ATTR_CURRENT_PROTOCOL_TYPE";
862 case SCARD_ATTR_CURRENT_CLK:
863 return "SCARD_ATTR_CURRENT_CLK";
865 case SCARD_ATTR_CURRENT_F:
866 return "SCARD_ATTR_CURRENT_F";
868 case SCARD_ATTR_CURRENT_D:
869 return "SCARD_ATTR_CURRENT_D";
871 case SCARD_ATTR_CURRENT_N:
872 return "SCARD_ATTR_CURRENT_N";
874 case SCARD_ATTR_CURRENT_W:
875 return "SCARD_ATTR_CURRENT_W";
877 case SCARD_ATTR_CURRENT_IFSC:
878 return "SCARD_ATTR_CURRENT_IFSC";
880 case SCARD_ATTR_CURRENT_IFSD:
881 return "SCARD_ATTR_CURRENT_IFSD";
883 case SCARD_ATTR_CURRENT_BWT:
884 return "SCARD_ATTR_CURRENT_BWT";
886 case SCARD_ATTR_CURRENT_CWT:
887 return "SCARD_ATTR_CURRENT_CWT";
889 case SCARD_ATTR_CURRENT_EBC_ENCODING:
890 return "SCARD_ATTR_CURRENT_EBC_ENCODING";
892 case SCARD_ATTR_EXTENDED_BWT:
893 return "SCARD_ATTR_EXTENDED_BWT";
895 case SCARD_ATTR_ICC_PRESENCE:
896 return "SCARD_ATTR_ICC_PRESENCE";
898 case SCARD_ATTR_ICC_INTERFACE_STATUS:
899 return "SCARD_ATTR_ICC_INTERFACE_STATUS";
901 case SCARD_ATTR_CURRENT_IO_STATE:
902 return "SCARD_ATTR_CURRENT_IO_STATE";
904 case SCARD_ATTR_ATR_STRING:
905 return "SCARD_ATTR_ATR_STRING";
907 case SCARD_ATTR_ICC_TYPE_PER_ATR:
908 return "SCARD_ATTR_ICC_TYPE_PER_ATR";
910 case SCARD_ATTR_ESC_RESET:
911 return "SCARD_ATTR_ESC_RESET";
913 case SCARD_ATTR_ESC_CANCEL:
914 return "SCARD_ATTR_ESC_CANCEL";
916 case SCARD_ATTR_ESC_AUTHREQUEST:
917 return "SCARD_ATTR_ESC_AUTHREQUEST";
919 case SCARD_ATTR_MAXINPUT:
920 return "SCARD_ATTR_MAXINPUT";
922 case SCARD_ATTR_DEVICE_UNIT:
923 return "SCARD_ATTR_DEVICE_UNIT";
925 case SCARD_ATTR_DEVICE_IN_USE:
926 return "SCARD_ATTR_DEVICE_IN_USE";
928 case SCARD_ATTR_DEVICE_FRIENDLY_NAME_A:
929 return "SCARD_ATTR_DEVICE_FRIENDLY_NAME_A";
931 case SCARD_ATTR_DEVICE_SYSTEM_NAME_A:
932 return "SCARD_ATTR_DEVICE_SYSTEM_NAME_A";
934 case SCARD_ATTR_DEVICE_FRIENDLY_NAME_W:
935 return "SCARD_ATTR_DEVICE_FRIENDLY_NAME_W";
937 case SCARD_ATTR_DEVICE_SYSTEM_NAME_W:
938 return "SCARD_ATTR_DEVICE_SYSTEM_NAME_W";
940 case SCARD_ATTR_SUPRESS_T1_IFS_REQUEST:
941 return "SCARD_ATTR_SUPRESS_T1_IFS_REQUEST";
944 return "SCARD_ATTR_UNKNOWN";
948WINSCARDAPI
const char* WINAPI SCardGetProtocolString(DWORD dwProtocols)
950 if (dwProtocols == SCARD_PROTOCOL_UNDEFINED)
951 return "SCARD_PROTOCOL_UNDEFINED";
953 if (dwProtocols == SCARD_PROTOCOL_T0)
954 return "SCARD_PROTOCOL_T0";
956 if (dwProtocols == SCARD_PROTOCOL_T1)
957 return "SCARD_PROTOCOL_T1";
959 if (dwProtocols == SCARD_PROTOCOL_Tx)
960 return "SCARD_PROTOCOL_Tx";
962 if (dwProtocols == SCARD_PROTOCOL_RAW)
963 return "SCARD_PROTOCOL_RAW";
965 if (dwProtocols == SCARD_PROTOCOL_DEFAULT)
966 return "SCARD_PROTOCOL_DEFAULT";
968 if (dwProtocols == (SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_RAW))
969 return "SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_RAW";
971 if (dwProtocols == (SCARD_PROTOCOL_T1 | SCARD_PROTOCOL_RAW))
972 return "SCARD_PROTOCOL_T1 | SCARD_PROTOCOL_RAW";
974 if (dwProtocols == (SCARD_PROTOCOL_Tx | SCARD_PROTOCOL_RAW))
975 return "SCARD_PROTOCOL_Tx | SCARD_PROTOCOL_RAW";
977 return "SCARD_PROTOCOL_UNKNOWN";
980WINSCARDAPI
const char* WINAPI SCardGetShareModeString(DWORD dwShareMode)
984 case SCARD_SHARE_EXCLUSIVE:
985 return "SCARD_SHARE_EXCLUSIVE";
987 case SCARD_SHARE_SHARED:
988 return "SCARD_SHARE_SHARED";
990 case SCARD_SHARE_DIRECT:
991 return "SCARD_SHARE_DIRECT";
994 return "SCARD_SHARE_UNKNOWN";
998WINSCARDAPI
const char* WINAPI SCardGetDispositionString(DWORD dwDisposition)
1000 switch (dwDisposition)
1002 case SCARD_LEAVE_CARD:
1003 return "SCARD_LEAVE_CARD";
1005 case SCARD_RESET_CARD:
1006 return "SCARD_RESET_CARD";
1008 case SCARD_UNPOWER_CARD:
1009 return "SCARD_UNPOWER_CARD";
1012 return "SCARD_UNKNOWN_CARD";
1016WINSCARDAPI
const char* WINAPI SCardGetScopeString(DWORD dwScope)
1020 case SCARD_SCOPE_USER:
1021 return "SCARD_SCOPE_USER";
1023 case SCARD_SCOPE_TERMINAL:
1024 return "SCARD_SCOPE_TERMINAL";
1026 case SCARD_SCOPE_SYSTEM:
1027 return "SCARD_SCOPE_SYSTEM";
1030 return "SCARD_SCOPE_UNKNOWN";
1034WINSCARDAPI
const char* WINAPI SCardGetCardStateString(DWORD dwCardState)
1036 switch (dwCardState)
1039 return "SCARD_UNKNOWN";
1042 return "SCARD_ABSENT";
1045 return "SCARD_PRESENT";
1047 case SCARD_SWALLOWED:
1048 return "SCARD_SWALLOWED";
1051 return "SCARD_POWERED";
1053 case SCARD_NEGOTIABLE:
1054 return "SCARD_NEGOTIABLE";
1056 case SCARD_SPECIFIC:
1057 return "SCARD_SPECIFIC";
1060 return "SCARD_UNKNOWN";
1064WINSCARDAPI
char* WINAPI SCardGetReaderStateString(DWORD dwReaderState)
1066 const size_t size = 512;
1067 char* buffer = calloc(size,
sizeof(
char));
1072 if (dwReaderState & SCARD_STATE_IGNORE)
1073 winpr_str_append(
"SCARD_STATE_IGNORE", buffer, size,
"|");
1075 if (dwReaderState & SCARD_STATE_CHANGED)
1076 winpr_str_append(
"SCARD_STATE_CHANGED", buffer, size,
"|");
1078 if (dwReaderState & SCARD_STATE_UNKNOWN)
1079 winpr_str_append(
"SCARD_STATE_UNKNOWN", buffer, size,
"|");
1081 if (dwReaderState & SCARD_STATE_UNAVAILABLE)
1082 winpr_str_append(
"SCARD_STATE_UNAVAILABLE", buffer, size,
"|");
1084 if (dwReaderState & SCARD_STATE_EMPTY)
1085 winpr_str_append(
"SCARD_STATE_EMPTY", buffer, size,
"|");
1087 if (dwReaderState & SCARD_STATE_PRESENT)
1088 winpr_str_append(
"SCARD_STATE_PRESENT", buffer, size,
"|");
1090 if (dwReaderState & SCARD_STATE_ATRMATCH)
1091 winpr_str_append(
"SCARD_STATE_ATRMATCH", buffer, size,
"|");
1093 if (dwReaderState & SCARD_STATE_EXCLUSIVE)
1094 winpr_str_append(
"SCARD_STATE_EXCLUSIVE", buffer, size,
"|");
1096 if (dwReaderState & SCARD_STATE_INUSE)
1097 winpr_str_append(
"SCARD_STATE_INUSE", buffer, size,
"|");
1099 if (dwReaderState & SCARD_STATE_MUTE)
1100 winpr_str_append(
"SCARD_STATE_MUTE", buffer, size,
"|");
1102 if (dwReaderState & SCARD_STATE_UNPOWERED)
1103 winpr_str_append(
"SCARD_STATE_UNPOWERED", buffer, size,
"|");
1106 winpr_str_append(
"SCARD_STATE_UNAWARE", buffer, size,
"|");
1111#define WINSCARD_LOAD_PROC(_name) \
1114 WINPR_PRAGMA_DIAG_PUSH \
1115 WINPR_PRAGMA_DIAG_IGNORED_PEDANTIC \
1116 pWinSCardApiTable->pfn##_name = GetProcAddressAs(hWinSCardLibrary, #_name, fn##_name); \
1117 WINPR_PRAGMA_DIAG_POP \
1121 HMODULE hWinSCardLibrary)
1123 WINPR_ASSERT(pWinSCardApiTable);
1124 WINPR_ASSERT(hWinSCardLibrary);
1126 WINSCARD_LOAD_PROC(SCardEstablishContext);
1127 WINSCARD_LOAD_PROC(SCardReleaseContext);
1128 WINSCARD_LOAD_PROC(SCardIsValidContext);
1129 WINSCARD_LOAD_PROC(SCardListReaderGroupsA);
1130 WINSCARD_LOAD_PROC(SCardListReaderGroupsW);
1131 WINSCARD_LOAD_PROC(SCardListReadersA);
1132 WINSCARD_LOAD_PROC(SCardListReadersW);
1133 WINSCARD_LOAD_PROC(SCardListCardsA);
1134 WINSCARD_LOAD_PROC(SCardListCardsW);
1135 WINSCARD_LOAD_PROC(SCardListInterfacesA);
1136 WINSCARD_LOAD_PROC(SCardListInterfacesW);
1137 WINSCARD_LOAD_PROC(SCardGetProviderIdA);
1138 WINSCARD_LOAD_PROC(SCardGetProviderIdW);
1139 WINSCARD_LOAD_PROC(SCardGetCardTypeProviderNameA);
1140 WINSCARD_LOAD_PROC(SCardGetCardTypeProviderNameW);
1141 WINSCARD_LOAD_PROC(SCardIntroduceReaderGroupA);
1142 WINSCARD_LOAD_PROC(SCardIntroduceReaderGroupW);
1143 WINSCARD_LOAD_PROC(SCardForgetReaderGroupA);
1144 WINSCARD_LOAD_PROC(SCardForgetReaderGroupW);
1145 WINSCARD_LOAD_PROC(SCardIntroduceReaderA);
1146 WINSCARD_LOAD_PROC(SCardIntroduceReaderW);
1147 WINSCARD_LOAD_PROC(SCardForgetReaderA);
1148 WINSCARD_LOAD_PROC(SCardForgetReaderW);
1149 WINSCARD_LOAD_PROC(SCardAddReaderToGroupA);
1150 WINSCARD_LOAD_PROC(SCardAddReaderToGroupW);
1151 WINSCARD_LOAD_PROC(SCardRemoveReaderFromGroupA);
1152 WINSCARD_LOAD_PROC(SCardRemoveReaderFromGroupW);
1153 WINSCARD_LOAD_PROC(SCardIntroduceCardTypeA);
1154 WINSCARD_LOAD_PROC(SCardIntroduceCardTypeW);
1155 WINSCARD_LOAD_PROC(SCardSetCardTypeProviderNameA);
1156 WINSCARD_LOAD_PROC(SCardSetCardTypeProviderNameW);
1157 WINSCARD_LOAD_PROC(SCardForgetCardTypeA);
1158 WINSCARD_LOAD_PROC(SCardForgetCardTypeW);
1159 WINSCARD_LOAD_PROC(SCardFreeMemory);
1160 WINSCARD_LOAD_PROC(SCardAccessStartedEvent);
1161 WINSCARD_LOAD_PROC(SCardReleaseStartedEvent);
1162 WINSCARD_LOAD_PROC(SCardLocateCardsA);
1163 WINSCARD_LOAD_PROC(SCardLocateCardsW);
1164 WINSCARD_LOAD_PROC(SCardLocateCardsByATRA);
1165 WINSCARD_LOAD_PROC(SCardLocateCardsByATRW);
1166 WINSCARD_LOAD_PROC(SCardGetStatusChangeA);
1167 WINSCARD_LOAD_PROC(SCardGetStatusChangeW);
1168 WINSCARD_LOAD_PROC(SCardCancel);
1169 WINSCARD_LOAD_PROC(SCardConnectA);
1170 WINSCARD_LOAD_PROC(SCardConnectW);
1171 WINSCARD_LOAD_PROC(SCardReconnect);
1172 WINSCARD_LOAD_PROC(SCardDisconnect);
1173 WINSCARD_LOAD_PROC(SCardBeginTransaction);
1174 WINSCARD_LOAD_PROC(SCardEndTransaction);
1175 WINSCARD_LOAD_PROC(SCardCancelTransaction);
1176 WINSCARD_LOAD_PROC(SCardState);
1177 WINSCARD_LOAD_PROC(SCardStatusA);
1178 WINSCARD_LOAD_PROC(SCardStatusW);
1179 WINSCARD_LOAD_PROC(SCardTransmit);
1180 WINSCARD_LOAD_PROC(SCardGetTransmitCount);
1181 WINSCARD_LOAD_PROC(SCardControl);
1182 WINSCARD_LOAD_PROC(SCardGetAttrib);
1183 WINSCARD_LOAD_PROC(SCardSetAttrib);
1184 WINSCARD_LOAD_PROC(SCardUIDlgSelectCardA);
1185 WINSCARD_LOAD_PROC(SCardUIDlgSelectCardW);
1186 WINSCARD_LOAD_PROC(GetOpenCardNameA);
1187 WINSCARD_LOAD_PROC(GetOpenCardNameW);
1188 WINSCARD_LOAD_PROC(SCardDlgExtendedError);
1189 WINSCARD_LOAD_PROC(SCardReadCacheA);
1190 WINSCARD_LOAD_PROC(SCardReadCacheW);
1191 WINSCARD_LOAD_PROC(SCardWriteCacheA);
1192 WINSCARD_LOAD_PROC(SCardWriteCacheW);
1193 WINSCARD_LOAD_PROC(SCardGetReaderIconA);
1194 WINSCARD_LOAD_PROC(SCardGetReaderIconW);
1195 WINSCARD_LOAD_PROC(SCardGetDeviceTypeIdA);
1196 WINSCARD_LOAD_PROC(SCardGetDeviceTypeIdW);
1197 WINSCARD_LOAD_PROC(SCardGetReaderDeviceInstanceIdA);
1198 WINSCARD_LOAD_PROC(SCardGetReaderDeviceInstanceIdW);
1199 WINSCARD_LOAD_PROC(SCardListReadersWithDeviceInstanceIdA);
1200 WINSCARD_LOAD_PROC(SCardListReadersWithDeviceInstanceIdW);
1201 WINSCARD_LOAD_PROC(SCardAudit);
1210 SCardEstablishContext,
1211 SCardReleaseContext,
1212 SCardIsValidContext,
1213 SCardListReaderGroupsA,
1214 SCardListReaderGroupsW,
1219 SCardListInterfacesA,
1220 SCardListInterfacesW,
1221 SCardGetProviderIdA,
1222 SCardGetProviderIdW,
1223 SCardGetCardTypeProviderNameA,
1224 SCardGetCardTypeProviderNameW,
1225 SCardIntroduceReaderGroupA,
1226 SCardIntroduceReaderGroupW,
1227 SCardForgetReaderGroupA,
1228 SCardForgetReaderGroupW,
1229 SCardIntroduceReaderA,
1230 SCardIntroduceReaderW,
1233 SCardAddReaderToGroupA,
1234 SCardAddReaderToGroupW,
1235 SCardRemoveReaderFromGroupA,
1236 SCardRemoveReaderFromGroupW,
1237 SCardIntroduceCardTypeA,
1238 SCardIntroduceCardTypeW,
1239 SCardSetCardTypeProviderNameA,
1240 SCardSetCardTypeProviderNameW,
1241 SCardForgetCardTypeA,
1242 SCardForgetCardTypeW,
1244 SCardAccessStartedEvent,
1245 SCardReleaseStartedEvent,
1248 SCardLocateCardsByATRA,
1249 SCardLocateCardsByATRW,
1250 SCardGetStatusChangeA,
1251 SCardGetStatusChangeW,
1257 SCardBeginTransaction,
1258 SCardEndTransaction,
1259 SCardCancelTransaction,
1264 SCardGetTransmitCount,
1268 SCardUIDlgSelectCardA,
1269 SCardUIDlgSelectCardW,
1272 SCardDlgExtendedError,
1277 SCardGetReaderIconA,
1278 SCardGetReaderIconW,
1279 SCardGetDeviceTypeIdA,
1280 SCardGetDeviceTypeIdW,
1281 SCardGetReaderDeviceInstanceIdA,
1282 SCardGetReaderDeviceInstanceIdW,
1283 SCardListReadersWithDeviceInstanceIdA,
1284 SCardListReadersWithDeviceInstanceIdW,
1290 return &WinPR_SCardApiFunctionTable;