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 g_SCardApi, g_SCardApi ? g_SCardApi->pfn##_name : NULL); \
53 return SCARD_E_NO_SERVICE; \
55 return g_SCardApi->pfn##_name(__VA_ARGS__)
57#define SCARDAPI_STUB_CALL_HANDLE(_name) \
58 InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, NULL, NULL); \
59 if (!g_SCardApi || !g_SCardApi->pfn##_name) \
61 WLog_DBG(TAG, "Missing function pointer g_SCardApi=%p->" xstr(pfn##_name) "=%p", \
62 g_SCardApi, g_SCardApi ? g_SCardApi->pfn##_name : NULL); \
65 return g_SCardApi->pfn##_name()
67#define SCARDAPI_STUB_CALL_VOID(_name) \
68 InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, NULL, NULL); \
69 if (!g_SCardApi || !g_SCardApi->pfn##_name) \
71 WLog_DBG(TAG, "Missing function pointer g_SCardApi=%p->" xstr(pfn##_name) "=%p", \
72 g_SCardApi, g_SCardApi ? g_SCardApi->pfn##_name : NULL); \
75 g_SCardApi->pfn##_name()
85static BOOL CALLBACK InitializeSCardApiStubs(WINPR_ATTR_UNUSED
PINIT_ONCE once,
86 WINPR_ATTR_UNUSED PVOID param,
87 WINPR_ATTR_UNUSED PVOID* context)
90 if (Windows_InitializeSCardApi() >= 0)
91 g_SCardApi = Windows_GetSCardApiFunctionTable();
93#if defined(WITH_SMARTCARD_PCSC)
94 if (PCSC_InitializeSCardApi() >= 0)
95 g_SCardApi = PCSC_GetSCardApiFunctionTable();
99#if defined(WITH_SMARTCARD_INSPECT)
100 g_SCardApi = Inspect_RegisterSCardApi(g_SCardApi);
105WINSCARDAPI LONG WINAPI SCardEstablishContext(DWORD dwScope, LPCVOID pvReserved1,
106 LPCVOID pvReserved2, LPSCARDCONTEXT phContext)
108 SCARDAPI_STUB_CALL_LONG(SCardEstablishContext, dwScope, pvReserved1, pvReserved2, phContext);
111WINSCARDAPI LONG WINAPI SCardReleaseContext(SCARDCONTEXT hContext)
113 SCARDAPI_STUB_CALL_LONG(SCardReleaseContext, hContext);
116WINSCARDAPI LONG WINAPI SCardIsValidContext(SCARDCONTEXT hContext)
118 SCARDAPI_STUB_CALL_LONG(SCardIsValidContext, hContext);
121WINSCARDAPI LONG WINAPI SCardListReaderGroupsA(SCARDCONTEXT hContext, LPSTR mszGroups,
124 SCARDAPI_STUB_CALL_LONG(SCardListReaderGroupsA, hContext, mszGroups, pcchGroups);
127WINSCARDAPI LONG WINAPI SCardListReaderGroupsW(SCARDCONTEXT hContext, LPWSTR mszGroups,
130 SCARDAPI_STUB_CALL_LONG(SCardListReaderGroupsW, hContext, mszGroups, pcchGroups);
133WINSCARDAPI LONG WINAPI SCardListReadersA(SCARDCONTEXT hContext, LPCSTR mszGroups, LPSTR mszReaders,
136 SCARDAPI_STUB_CALL_LONG(SCardListReadersA, hContext, mszGroups, mszReaders, pcchReaders);
139WINSCARDAPI LONG WINAPI SCardListReadersW(SCARDCONTEXT hContext, LPCWSTR mszGroups,
140 LPWSTR mszReaders, LPDWORD pcchReaders)
142 SCARDAPI_STUB_CALL_LONG(SCardListReadersW, hContext, mszGroups, mszReaders, pcchReaders);
145WINSCARDAPI LONG WINAPI SCardListCardsA(SCARDCONTEXT hContext, LPCBYTE pbAtr,
146 LPCGUID rgquidInterfaces, DWORD cguidInterfaceCount,
147 CHAR* mszCards, LPDWORD pcchCards)
149 SCARDAPI_STUB_CALL_LONG(SCardListCardsA, hContext, pbAtr, rgquidInterfaces, cguidInterfaceCount,
150 mszCards, pcchCards);
153WINSCARDAPI LONG WINAPI SCardListCardsW(SCARDCONTEXT hContext, LPCBYTE pbAtr,
154 LPCGUID rgquidInterfaces, DWORD cguidInterfaceCount,
155 WCHAR* mszCards, LPDWORD pcchCards)
157 SCARDAPI_STUB_CALL_LONG(SCardListCardsW, hContext, pbAtr, rgquidInterfaces, cguidInterfaceCount,
158 mszCards, pcchCards);
161WINSCARDAPI LONG WINAPI SCardListInterfacesA(SCARDCONTEXT hContext, LPCSTR szCard,
162 LPGUID pguidInterfaces, LPDWORD pcguidInterfaces)
164 SCARDAPI_STUB_CALL_LONG(SCardListInterfacesA, hContext, szCard, pguidInterfaces,
168WINSCARDAPI LONG WINAPI SCardListInterfacesW(SCARDCONTEXT hContext, LPCWSTR szCard,
169 LPGUID pguidInterfaces, LPDWORD pcguidInterfaces)
171 SCARDAPI_STUB_CALL_LONG(SCardListInterfacesW, hContext, szCard, pguidInterfaces,
175WINSCARDAPI LONG WINAPI SCardGetProviderIdA(SCARDCONTEXT hContext, LPCSTR szCard,
176 LPGUID pguidProviderId)
178 SCARDAPI_STUB_CALL_LONG(SCardGetProviderIdA, hContext, szCard, pguidProviderId);
181WINSCARDAPI LONG WINAPI SCardGetProviderIdW(SCARDCONTEXT hContext, LPCWSTR szCard,
182 LPGUID pguidProviderId)
184 SCARDAPI_STUB_CALL_LONG(SCardGetProviderIdW, hContext, szCard, pguidProviderId);
187WINSCARDAPI LONG WINAPI SCardGetCardTypeProviderNameA(SCARDCONTEXT hContext, LPCSTR szCardName,
188 DWORD dwProviderId, CHAR* szProvider,
189 LPDWORD pcchProvider)
191 SCARDAPI_STUB_CALL_LONG(SCardGetCardTypeProviderNameA, hContext, szCardName, dwProviderId,
192 szProvider, pcchProvider);
195WINSCARDAPI LONG WINAPI SCardGetCardTypeProviderNameW(SCARDCONTEXT hContext, LPCWSTR szCardName,
196 DWORD dwProviderId, WCHAR* szProvider,
197 LPDWORD pcchProvider)
199 SCARDAPI_STUB_CALL_LONG(SCardGetCardTypeProviderNameW, hContext, szCardName, dwProviderId,
200 szProvider, pcchProvider);
203WINSCARDAPI LONG WINAPI SCardIntroduceReaderGroupA(SCARDCONTEXT hContext, LPCSTR szGroupName)
205 SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderGroupA, hContext, szGroupName);
208WINSCARDAPI LONG WINAPI SCardIntroduceReaderGroupW(SCARDCONTEXT hContext, LPCWSTR szGroupName)
210 SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderGroupW, hContext, szGroupName);
213WINSCARDAPI LONG WINAPI SCardForgetReaderGroupA(SCARDCONTEXT hContext, LPCSTR szGroupName)
215 SCARDAPI_STUB_CALL_LONG(SCardForgetReaderGroupA, hContext, szGroupName);
218WINSCARDAPI LONG WINAPI SCardForgetReaderGroupW(SCARDCONTEXT hContext, LPCWSTR szGroupName)
220 SCARDAPI_STUB_CALL_LONG(SCardForgetReaderGroupW, hContext, szGroupName);
223WINSCARDAPI LONG WINAPI SCardIntroduceReaderA(SCARDCONTEXT hContext, LPCSTR szReaderName,
226 SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderA, hContext, szReaderName, szDeviceName);
229WINSCARDAPI LONG WINAPI SCardIntroduceReaderW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
230 LPCWSTR szDeviceName)
232 SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderW, hContext, szReaderName, szDeviceName);
235WINSCARDAPI LONG WINAPI SCardForgetReaderA(SCARDCONTEXT hContext, LPCSTR szReaderName)
237 SCARDAPI_STUB_CALL_LONG(SCardForgetReaderA, hContext, szReaderName);
240WINSCARDAPI LONG WINAPI SCardForgetReaderW(SCARDCONTEXT hContext, LPCWSTR szReaderName)
242 SCARDAPI_STUB_CALL_LONG(SCardForgetReaderW, hContext, szReaderName);
245WINSCARDAPI LONG WINAPI SCardAddReaderToGroupA(SCARDCONTEXT hContext, LPCSTR szReaderName,
248 SCARDAPI_STUB_CALL_LONG(SCardAddReaderToGroupA, hContext, szReaderName, szGroupName);
251WINSCARDAPI LONG WINAPI SCardAddReaderToGroupW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
254 SCARDAPI_STUB_CALL_LONG(SCardAddReaderToGroupW, hContext, szReaderName, szGroupName);
257WINSCARDAPI LONG WINAPI SCardRemoveReaderFromGroupA(SCARDCONTEXT hContext, LPCSTR szReaderName,
260 SCARDAPI_STUB_CALL_LONG(SCardRemoveReaderFromGroupA, hContext, szReaderName, szGroupName);
263WINSCARDAPI LONG WINAPI SCardRemoveReaderFromGroupW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
266 SCARDAPI_STUB_CALL_LONG(SCardRemoveReaderFromGroupW, hContext, szReaderName, szGroupName);
269WINSCARDAPI LONG WINAPI SCardIntroduceCardTypeA(SCARDCONTEXT hContext, LPCSTR szCardName,
270 LPCGUID pguidPrimaryProvider,
271 LPCGUID rgguidInterfaces, DWORD dwInterfaceCount,
272 LPCBYTE pbAtr, LPCBYTE pbAtrMask, DWORD cbAtrLen)
274 SCARDAPI_STUB_CALL_LONG(SCardIntroduceCardTypeA, hContext, szCardName, pguidPrimaryProvider,
275 rgguidInterfaces, dwInterfaceCount, pbAtr, pbAtrMask, cbAtrLen);
278WINSCARDAPI LONG WINAPI SCardIntroduceCardTypeW(SCARDCONTEXT hContext, LPCWSTR szCardName,
279 LPCGUID pguidPrimaryProvider,
280 LPCGUID rgguidInterfaces, DWORD dwInterfaceCount,
281 LPCBYTE pbAtr, LPCBYTE pbAtrMask, DWORD cbAtrLen)
283 SCARDAPI_STUB_CALL_LONG(SCardIntroduceCardTypeW, hContext, szCardName, pguidPrimaryProvider,
284 rgguidInterfaces, dwInterfaceCount, pbAtr, pbAtrMask, cbAtrLen);
287WINSCARDAPI LONG WINAPI SCardSetCardTypeProviderNameA(SCARDCONTEXT hContext, LPCSTR szCardName,
288 DWORD dwProviderId, LPCSTR szProvider)
290 SCARDAPI_STUB_CALL_LONG(SCardSetCardTypeProviderNameA, hContext, szCardName, dwProviderId,
294WINSCARDAPI LONG WINAPI SCardSetCardTypeProviderNameW(SCARDCONTEXT hContext, LPCWSTR szCardName,
295 DWORD dwProviderId, LPCWSTR szProvider)
297 SCARDAPI_STUB_CALL_LONG(SCardSetCardTypeProviderNameW, hContext, szCardName, dwProviderId,
301WINSCARDAPI LONG WINAPI SCardForgetCardTypeA(SCARDCONTEXT hContext, LPCSTR szCardName)
303 SCARDAPI_STUB_CALL_LONG(SCardForgetCardTypeA, hContext, szCardName);
306WINSCARDAPI LONG WINAPI SCardForgetCardTypeW(SCARDCONTEXT hContext, LPCWSTR szCardName)
308 SCARDAPI_STUB_CALL_LONG(SCardForgetCardTypeW, hContext, szCardName);
311WINSCARDAPI LONG WINAPI SCardFreeMemory(SCARDCONTEXT hContext, LPVOID pvMem)
313 SCARDAPI_STUB_CALL_LONG(SCardFreeMemory, hContext, pvMem);
316WINSCARDAPI HANDLE WINAPI SCardAccessStartedEvent(
void)
318 SCARDAPI_STUB_CALL_HANDLE(SCardAccessStartedEvent);
321WINSCARDAPI
void WINAPI SCardReleaseStartedEvent(
void)
323 SCARDAPI_STUB_CALL_VOID(SCardReleaseStartedEvent);
326WINSCARDAPI LONG WINAPI SCardLocateCardsA(SCARDCONTEXT hContext, LPCSTR mszCards,
329 SCARDAPI_STUB_CALL_LONG(SCardLocateCardsA, hContext, mszCards, rgReaderStates, cReaders);
332WINSCARDAPI LONG WINAPI SCardLocateCardsW(SCARDCONTEXT hContext, LPCWSTR mszCards,
335 SCARDAPI_STUB_CALL_LONG(SCardLocateCardsW, hContext, mszCards, rgReaderStates, cReaders);
338WINSCARDAPI LONG WINAPI SCardLocateCardsByATRA(SCARDCONTEXT hContext,
LPSCARD_ATRMASK rgAtrMasks,
342 SCARDAPI_STUB_CALL_LONG(SCardLocateCardsByATRA, hContext, rgAtrMasks, cAtrs, rgReaderStates,
346WINSCARDAPI LONG WINAPI SCardLocateCardsByATRW(SCARDCONTEXT hContext,
LPSCARD_ATRMASK rgAtrMasks,
350 SCARDAPI_STUB_CALL_LONG(SCardLocateCardsByATRW, hContext, rgAtrMasks, cAtrs, rgReaderStates,
354WINSCARDAPI LONG WINAPI SCardGetStatusChangeA(SCARDCONTEXT hContext, DWORD dwTimeout,
357 SCARDAPI_STUB_CALL_LONG(SCardGetStatusChangeA, hContext, dwTimeout, rgReaderStates, cReaders);
360WINSCARDAPI LONG WINAPI SCardGetStatusChangeW(SCARDCONTEXT hContext, DWORD dwTimeout,
363 SCARDAPI_STUB_CALL_LONG(SCardGetStatusChangeW, hContext, dwTimeout, rgReaderStates, cReaders);
366WINSCARDAPI LONG WINAPI SCardCancel(SCARDCONTEXT hContext)
368 SCARDAPI_STUB_CALL_LONG(SCardCancel, hContext);
371WINSCARDAPI LONG WINAPI SCardConnectA(SCARDCONTEXT hContext, LPCSTR szReader, DWORD dwShareMode,
372 DWORD dwPreferredProtocols, LPSCARDHANDLE phCard,
373 LPDWORD pdwActiveProtocol)
375 SCARDAPI_STUB_CALL_LONG(SCardConnectA, hContext, szReader, dwShareMode, dwPreferredProtocols,
376 phCard, pdwActiveProtocol);
379WINSCARDAPI LONG WINAPI SCardConnectW(SCARDCONTEXT hContext, LPCWSTR szReader, DWORD dwShareMode,
380 DWORD dwPreferredProtocols, LPSCARDHANDLE phCard,
381 LPDWORD pdwActiveProtocol)
383 SCARDAPI_STUB_CALL_LONG(SCardConnectW, hContext, szReader, dwShareMode, dwPreferredProtocols,
384 phCard, pdwActiveProtocol);
387WINSCARDAPI LONG WINAPI SCardReconnect(SCARDHANDLE hCard, DWORD dwShareMode,
388 DWORD dwPreferredProtocols, DWORD dwInitialization,
389 LPDWORD pdwActiveProtocol)
391 SCARDAPI_STUB_CALL_LONG(SCardReconnect, hCard, dwShareMode, dwPreferredProtocols,
392 dwInitialization, pdwActiveProtocol);
395WINSCARDAPI LONG WINAPI SCardDisconnect(SCARDHANDLE hCard, DWORD dwDisposition)
397 SCARDAPI_STUB_CALL_LONG(SCardDisconnect, hCard, dwDisposition);
400WINSCARDAPI LONG WINAPI SCardBeginTransaction(SCARDHANDLE hCard)
402 SCARDAPI_STUB_CALL_LONG(SCardBeginTransaction, hCard);
405WINSCARDAPI LONG WINAPI SCardEndTransaction(SCARDHANDLE hCard, DWORD dwDisposition)
407 SCARDAPI_STUB_CALL_LONG(SCardEndTransaction, hCard, dwDisposition);
410WINSCARDAPI LONG WINAPI SCardCancelTransaction(SCARDHANDLE hCard)
412 SCARDAPI_STUB_CALL_LONG(SCardCancelTransaction, hCard);
415WINSCARDAPI LONG WINAPI SCardState(SCARDHANDLE hCard, LPDWORD pdwState, LPDWORD pdwProtocol,
416 LPBYTE pbAtr, LPDWORD pcbAtrLen)
418 SCARDAPI_STUB_CALL_LONG(SCardState, hCard, pdwState, pdwProtocol, pbAtr, pcbAtrLen);
421WINSCARDAPI LONG WINAPI SCardStatusA(SCARDHANDLE hCard, LPSTR mszReaderNames, LPDWORD pcchReaderLen,
422 LPDWORD pdwState, LPDWORD pdwProtocol, LPBYTE pbAtr,
425 SCARDAPI_STUB_CALL_LONG(SCardStatusA, hCard, mszReaderNames, pcchReaderLen, pdwState,
426 pdwProtocol, pbAtr, pcbAtrLen);
429WINSCARDAPI LONG WINAPI SCardStatusW(SCARDHANDLE hCard, LPWSTR mszReaderNames,
430 LPDWORD pcchReaderLen, LPDWORD pdwState, LPDWORD pdwProtocol,
431 LPBYTE pbAtr, LPDWORD pcbAtrLen)
433 SCARDAPI_STUB_CALL_LONG(SCardStatusW, hCard, mszReaderNames, pcchReaderLen, pdwState,
434 pdwProtocol, pbAtr, pcbAtrLen);
438 LPCBYTE pbSendBuffer, DWORD cbSendLength,
440 LPDWORD pcbRecvLength)
442 SCARDAPI_STUB_CALL_LONG(SCardTransmit, hCard, pioSendPci, pbSendBuffer, cbSendLength,
443 pioRecvPci, pbRecvBuffer, pcbRecvLength);
446WINSCARDAPI LONG WINAPI SCardGetTransmitCount(SCARDHANDLE hCard, LPDWORD pcTransmitCount)
448 SCARDAPI_STUB_CALL_LONG(SCardGetTransmitCount, hCard, pcTransmitCount);
451WINSCARDAPI LONG WINAPI SCardControl(SCARDHANDLE hCard, DWORD dwControlCode, LPCVOID lpInBuffer,
452 DWORD cbInBufferSize, LPVOID lpOutBuffer,
453 DWORD cbOutBufferSize, LPDWORD lpBytesReturned)
455 SCARDAPI_STUB_CALL_LONG(SCardControl, hCard, dwControlCode, lpInBuffer, cbInBufferSize,
456 lpOutBuffer, cbOutBufferSize, lpBytesReturned);
459WINSCARDAPI LONG WINAPI SCardGetAttrib(SCARDHANDLE hCard, DWORD dwAttrId, LPBYTE pbAttr,
462 SCARDAPI_STUB_CALL_LONG(SCardGetAttrib, hCard, dwAttrId, pbAttr, pcbAttrLen);
465WINSCARDAPI LONG WINAPI SCardSetAttrib(SCARDHANDLE hCard, DWORD dwAttrId, LPCBYTE pbAttr,
468 SCARDAPI_STUB_CALL_LONG(SCardSetAttrib, hCard, dwAttrId, pbAttr, cbAttrLen);
471WINSCARDAPI LONG WINAPI SCardUIDlgSelectCardA(LPOPENCARDNAMEA_EX pDlgStruc)
473 SCARDAPI_STUB_CALL_LONG(SCardUIDlgSelectCardA, pDlgStruc);
476WINSCARDAPI LONG WINAPI SCardUIDlgSelectCardW(LPOPENCARDNAMEW_EX pDlgStruc)
478 SCARDAPI_STUB_CALL_LONG(SCardUIDlgSelectCardW, pDlgStruc);
483 SCARDAPI_STUB_CALL_LONG(GetOpenCardNameA, pDlgStruc);
488 SCARDAPI_STUB_CALL_LONG(GetOpenCardNameW, pDlgStruc);
491WINSCARDAPI LONG WINAPI SCardDlgExtendedError(
void)
493 SCARDAPI_STUB_CALL_LONG(SCardDlgExtendedError);
496WINSCARDAPI LONG WINAPI SCardReadCacheA(SCARDCONTEXT hContext,
UUID* CardIdentifier,
497 DWORD FreshnessCounter, LPSTR LookupName, PBYTE Data,
500 SCARDAPI_STUB_CALL_LONG(SCardReadCacheA, hContext, CardIdentifier, FreshnessCounter, LookupName,
504WINSCARDAPI LONG WINAPI SCardReadCacheW(SCARDCONTEXT hContext,
UUID* CardIdentifier,
505 DWORD FreshnessCounter, LPWSTR LookupName, PBYTE Data,
508 SCARDAPI_STUB_CALL_LONG(SCardReadCacheW, hContext, CardIdentifier, FreshnessCounter, LookupName,
512WINSCARDAPI LONG WINAPI SCardWriteCacheA(SCARDCONTEXT hContext,
UUID* CardIdentifier,
513 DWORD FreshnessCounter, LPSTR LookupName, PBYTE Data,
516 SCARDAPI_STUB_CALL_LONG(SCardWriteCacheA, hContext, CardIdentifier, FreshnessCounter,
517 LookupName, Data, DataLen);
520WINSCARDAPI LONG WINAPI SCardWriteCacheW(SCARDCONTEXT hContext,
UUID* CardIdentifier,
521 DWORD FreshnessCounter, LPWSTR LookupName, PBYTE Data,
524 SCARDAPI_STUB_CALL_LONG(SCardWriteCacheW, hContext, CardIdentifier, FreshnessCounter,
525 LookupName, Data, DataLen);
528WINSCARDAPI LONG WINAPI SCardGetReaderIconA(SCARDCONTEXT hContext, LPCSTR szReaderName,
529 LPBYTE pbIcon, LPDWORD pcbIcon)
531 SCARDAPI_STUB_CALL_LONG(SCardGetReaderIconA, hContext, szReaderName, pbIcon, pcbIcon);
534WINSCARDAPI LONG WINAPI SCardGetReaderIconW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
535 LPBYTE pbIcon, LPDWORD pcbIcon)
537 SCARDAPI_STUB_CALL_LONG(SCardGetReaderIconW, hContext, szReaderName, pbIcon, pcbIcon);
540WINSCARDAPI LONG WINAPI SCardGetDeviceTypeIdA(SCARDCONTEXT hContext, LPCSTR szReaderName,
541 LPDWORD pdwDeviceTypeId)
543 SCARDAPI_STUB_CALL_LONG(SCardGetDeviceTypeIdA, hContext, szReaderName, pdwDeviceTypeId);
546WINSCARDAPI LONG WINAPI SCardGetDeviceTypeIdW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
547 LPDWORD pdwDeviceTypeId)
549 SCARDAPI_STUB_CALL_LONG(SCardGetDeviceTypeIdW, hContext, szReaderName, pdwDeviceTypeId);
552WINSCARDAPI LONG WINAPI SCardGetReaderDeviceInstanceIdA(SCARDCONTEXT hContext, LPCSTR szReaderName,
553 LPSTR szDeviceInstanceId,
554 LPDWORD pcchDeviceInstanceId)
556 SCARDAPI_STUB_CALL_LONG(SCardGetReaderDeviceInstanceIdA, hContext, szReaderName,
557 szDeviceInstanceId, pcchDeviceInstanceId);
560WINSCARDAPI LONG WINAPI SCardGetReaderDeviceInstanceIdW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
561 LPWSTR szDeviceInstanceId,
562 LPDWORD pcchDeviceInstanceId)
564 SCARDAPI_STUB_CALL_LONG(SCardGetReaderDeviceInstanceIdW, hContext, szReaderName,
565 szDeviceInstanceId, pcchDeviceInstanceId);
568WINSCARDAPI LONG WINAPI SCardListReadersWithDeviceInstanceIdA(SCARDCONTEXT hContext,
569 LPCSTR szDeviceInstanceId,
570 LPSTR mszReaders, LPDWORD pcchReaders)
572 SCARDAPI_STUB_CALL_LONG(SCardListReadersWithDeviceInstanceIdA, hContext, szDeviceInstanceId,
573 mszReaders, pcchReaders);
576WINSCARDAPI LONG WINAPI SCardListReadersWithDeviceInstanceIdW(SCARDCONTEXT hContext,
577 LPCWSTR szDeviceInstanceId,
581 SCARDAPI_STUB_CALL_LONG(SCardListReadersWithDeviceInstanceIdW, hContext, szDeviceInstanceId,
582 mszReaders, pcchReaders);
585WINSCARDAPI LONG WINAPI SCardAudit(SCARDCONTEXT hContext, DWORD dwEvent)
587 SCARDAPI_STUB_CALL_LONG(SCardAudit, hContext, dwEvent);
594WINSCARDAPI
const char* WINAPI SCardGetErrorString(LONG errorCode)
598 case SCARD_S_SUCCESS:
599 return "SCARD_S_SUCCESS";
601 case SCARD_F_INTERNAL_ERROR:
602 return "SCARD_F_INTERNAL_ERROR";
604 case SCARD_E_CANCELLED:
605 return "SCARD_E_CANCELLED";
607 case SCARD_E_INVALID_HANDLE:
608 return "SCARD_E_INVALID_HANDLE";
610 case SCARD_E_INVALID_PARAMETER:
611 return "SCARD_E_INVALID_PARAMETER";
613 case SCARD_E_INVALID_TARGET:
614 return "SCARD_E_INVALID_TARGET";
616 case SCARD_E_NO_MEMORY:
617 return "SCARD_E_NO_MEMORY";
619 case SCARD_F_WAITED_TOO_LONG:
620 return "SCARD_F_WAITED_TOO_LONG";
622 case SCARD_E_INSUFFICIENT_BUFFER:
623 return "SCARD_E_INSUFFICIENT_BUFFER";
625 case SCARD_E_UNKNOWN_READER:
626 return "SCARD_E_UNKNOWN_READER";
628 case SCARD_E_TIMEOUT:
629 return "SCARD_E_TIMEOUT";
631 case SCARD_E_SHARING_VIOLATION:
632 return "SCARD_E_SHARING_VIOLATION";
634 case SCARD_E_NO_SMARTCARD:
635 return "SCARD_E_NO_SMARTCARD";
637 case SCARD_E_UNKNOWN_CARD:
638 return "SCARD_E_UNKNOWN_CARD";
640 case SCARD_E_CANT_DISPOSE:
641 return "SCARD_E_CANT_DISPOSE";
643 case SCARD_E_PROTO_MISMATCH:
644 return "SCARD_E_PROTO_MISMATCH";
646 case SCARD_E_NOT_READY:
647 return "SCARD_E_NOT_READY";
649 case SCARD_E_INVALID_VALUE:
650 return "SCARD_E_INVALID_VALUE";
652 case SCARD_E_SYSTEM_CANCELLED:
653 return "SCARD_E_SYSTEM_CANCELLED";
655 case SCARD_F_COMM_ERROR:
656 return "SCARD_F_COMM_ERROR";
658 case SCARD_F_UNKNOWN_ERROR:
659 return "SCARD_F_UNKNOWN_ERROR";
661 case SCARD_E_INVALID_ATR:
662 return "SCARD_E_INVALID_ATR";
664 case SCARD_E_NOT_TRANSACTED:
665 return "SCARD_E_NOT_TRANSACTED";
667 case SCARD_E_READER_UNAVAILABLE:
668 return "SCARD_E_READER_UNAVAILABLE";
670 case SCARD_P_SHUTDOWN:
671 return "SCARD_P_SHUTDOWN";
673 case SCARD_E_PCI_TOO_SMALL:
674 return "SCARD_E_PCI_TOO_SMALL";
676 case SCARD_E_READER_UNSUPPORTED:
677 return "SCARD_E_READER_UNSUPPORTED";
679 case SCARD_E_DUPLICATE_READER:
680 return "SCARD_E_DUPLICATE_READER";
682 case SCARD_E_CARD_UNSUPPORTED:
683 return "SCARD_E_CARD_UNSUPPORTED";
685 case SCARD_E_NO_SERVICE:
686 return "SCARD_E_NO_SERVICE";
688 case SCARD_E_SERVICE_STOPPED:
689 return "SCARD_E_SERVICE_STOPPED";
691 case SCARD_E_UNEXPECTED:
692 return "SCARD_E_UNEXPECTED";
694 case SCARD_E_ICC_INSTALLATION:
695 return "SCARD_E_ICC_INSTALLATION";
697 case SCARD_E_ICC_CREATEORDER:
698 return "SCARD_E_ICC_CREATEORDER";
700 case SCARD_E_UNSUPPORTED_FEATURE:
701 return "SCARD_E_UNSUPPORTED_FEATURE";
703 case SCARD_E_DIR_NOT_FOUND:
704 return "SCARD_E_DIR_NOT_FOUND";
706 case SCARD_E_FILE_NOT_FOUND:
707 return "SCARD_E_FILE_NOT_FOUND";
710 return "SCARD_E_NO_DIR";
712 case SCARD_E_NO_FILE:
713 return "SCARD_E_NO_FILE";
715 case SCARD_E_NO_ACCESS:
716 return "SCARD_E_NO_ACCESS";
718 case SCARD_E_WRITE_TOO_MANY:
719 return "SCARD_E_WRITE_TOO_MANY";
721 case SCARD_E_BAD_SEEK:
722 return "SCARD_E_BAD_SEEK";
724 case SCARD_E_INVALID_CHV:
725 return "SCARD_E_INVALID_CHV";
727 case SCARD_E_UNKNOWN_RES_MNG:
728 return "SCARD_E_UNKNOWN_RES_MNG";
730 case SCARD_E_NO_SUCH_CERTIFICATE:
731 return "SCARD_E_NO_SUCH_CERTIFICATE";
733 case SCARD_E_CERTIFICATE_UNAVAILABLE:
734 return "SCARD_E_CERTIFICATE_UNAVAILABLE";
736 case SCARD_E_NO_READERS_AVAILABLE:
737 return "SCARD_E_NO_READERS_AVAILABLE";
739 case SCARD_E_COMM_DATA_LOST:
740 return "SCARD_E_COMM_DATA_LOST";
742 case SCARD_E_NO_KEY_CONTAINER:
743 return "SCARD_E_NO_KEY_CONTAINER";
745 case SCARD_E_SERVER_TOO_BUSY:
746 return "SCARD_E_SERVER_TOO_BUSY";
748 case SCARD_E_PIN_CACHE_EXPIRED:
749 return "SCARD_E_PIN_CACHE_EXPIRED";
751 case SCARD_E_NO_PIN_CACHE:
752 return "SCARD_E_NO_PIN_CACHE";
754 case SCARD_E_READ_ONLY_CARD:
755 return "SCARD_E_READ_ONLY_CARD";
757 case SCARD_W_UNSUPPORTED_CARD:
758 return "SCARD_W_UNSUPPORTED_CARD";
760 case SCARD_W_UNRESPONSIVE_CARD:
761 return "SCARD_W_UNRESPONSIVE_CARD";
763 case SCARD_W_UNPOWERED_CARD:
764 return "SCARD_W_UNPOWERED_CARD";
766 case SCARD_W_RESET_CARD:
767 return "SCARD_W_RESET_CARD";
769 case SCARD_W_REMOVED_CARD:
770 return "SCARD_W_REMOVED_CARD";
772 case SCARD_W_SECURITY_VIOLATION:
773 return "SCARD_W_SECURITY_VIOLATION";
775 case SCARD_W_WRONG_CHV:
776 return "SCARD_W_WRONG_CHV";
778 case SCARD_W_CHV_BLOCKED:
779 return "SCARD_W_CHV_BLOCKED";
782 return "SCARD_W_EOF";
784 case SCARD_W_CANCELLED_BY_USER:
785 return "SCARD_W_CANCELLED_BY_USER";
787 case SCARD_W_CARD_NOT_AUTHENTICATED:
788 return "SCARD_W_CARD_NOT_AUTHENTICATED";
790 case SCARD_W_CACHE_ITEM_NOT_FOUND:
791 return "SCARD_W_CACHE_ITEM_NOT_FOUND";
793 case SCARD_W_CACHE_ITEM_STALE:
794 return "SCARD_W_CACHE_ITEM_STALE";
796 case SCARD_W_CACHE_ITEM_TOO_BIG:
797 return "SCARD_W_CACHE_ITEM_TOO_BIG";
800 return "SCARD_E_UNKNOWN";
804WINSCARDAPI
const char* WINAPI SCardGetAttributeString(DWORD dwAttrId)
808 case SCARD_ATTR_VENDOR_NAME:
809 return "SCARD_ATTR_VENDOR_NAME";
811 case SCARD_ATTR_VENDOR_IFD_TYPE:
812 return "SCARD_ATTR_VENDOR_IFD_TYPE";
814 case SCARD_ATTR_VENDOR_IFD_VERSION:
815 return "SCARD_ATTR_VENDOR_IFD_VERSION";
817 case SCARD_ATTR_VENDOR_IFD_SERIAL_NO:
818 return "SCARD_ATTR_VENDOR_IFD_SERIAL_NO";
820 case SCARD_ATTR_CHANNEL_ID:
821 return "SCARD_ATTR_CHANNEL_ID";
823 case SCARD_ATTR_PROTOCOL_TYPES:
824 return "SCARD_ATTR_PROTOCOL_TYPES";
826 case SCARD_ATTR_DEFAULT_CLK:
827 return "SCARD_ATTR_DEFAULT_CLK";
829 case SCARD_ATTR_MAX_CLK:
830 return "SCARD_ATTR_MAX_CLK";
832 case SCARD_ATTR_DEFAULT_DATA_RATE:
833 return "SCARD_ATTR_DEFAULT_DATA_RATE";
835 case SCARD_ATTR_MAX_DATA_RATE:
836 return "SCARD_ATTR_MAX_DATA_RATE";
838 case SCARD_ATTR_MAX_IFSD:
839 return "SCARD_ATTR_MAX_IFSD";
841 case SCARD_ATTR_POWER_MGMT_SUPPORT:
842 return "SCARD_ATTR_POWER_MGMT_SUPPORT";
844 case SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE:
845 return "SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE";
847 case SCARD_ATTR_USER_AUTH_INPUT_DEVICE:
848 return "SCARD_ATTR_USER_AUTH_INPUT_DEVICE";
850 case SCARD_ATTR_CHARACTERISTICS:
851 return "SCARD_ATTR_CHARACTERISTICS";
853 case SCARD_ATTR_CURRENT_PROTOCOL_TYPE:
854 return "SCARD_ATTR_CURRENT_PROTOCOL_TYPE";
856 case SCARD_ATTR_CURRENT_CLK:
857 return "SCARD_ATTR_CURRENT_CLK";
859 case SCARD_ATTR_CURRENT_F:
860 return "SCARD_ATTR_CURRENT_F";
862 case SCARD_ATTR_CURRENT_D:
863 return "SCARD_ATTR_CURRENT_D";
865 case SCARD_ATTR_CURRENT_N:
866 return "SCARD_ATTR_CURRENT_N";
868 case SCARD_ATTR_CURRENT_W:
869 return "SCARD_ATTR_CURRENT_W";
871 case SCARD_ATTR_CURRENT_IFSC:
872 return "SCARD_ATTR_CURRENT_IFSC";
874 case SCARD_ATTR_CURRENT_IFSD:
875 return "SCARD_ATTR_CURRENT_IFSD";
877 case SCARD_ATTR_CURRENT_BWT:
878 return "SCARD_ATTR_CURRENT_BWT";
880 case SCARD_ATTR_CURRENT_CWT:
881 return "SCARD_ATTR_CURRENT_CWT";
883 case SCARD_ATTR_CURRENT_EBC_ENCODING:
884 return "SCARD_ATTR_CURRENT_EBC_ENCODING";
886 case SCARD_ATTR_EXTENDED_BWT:
887 return "SCARD_ATTR_EXTENDED_BWT";
889 case SCARD_ATTR_ICC_PRESENCE:
890 return "SCARD_ATTR_ICC_PRESENCE";
892 case SCARD_ATTR_ICC_INTERFACE_STATUS:
893 return "SCARD_ATTR_ICC_INTERFACE_STATUS";
895 case SCARD_ATTR_CURRENT_IO_STATE:
896 return "SCARD_ATTR_CURRENT_IO_STATE";
898 case SCARD_ATTR_ATR_STRING:
899 return "SCARD_ATTR_ATR_STRING";
901 case SCARD_ATTR_ICC_TYPE_PER_ATR:
902 return "SCARD_ATTR_ICC_TYPE_PER_ATR";
904 case SCARD_ATTR_ESC_RESET:
905 return "SCARD_ATTR_ESC_RESET";
907 case SCARD_ATTR_ESC_CANCEL:
908 return "SCARD_ATTR_ESC_CANCEL";
910 case SCARD_ATTR_ESC_AUTHREQUEST:
911 return "SCARD_ATTR_ESC_AUTHREQUEST";
913 case SCARD_ATTR_MAXINPUT:
914 return "SCARD_ATTR_MAXINPUT";
916 case SCARD_ATTR_DEVICE_UNIT:
917 return "SCARD_ATTR_DEVICE_UNIT";
919 case SCARD_ATTR_DEVICE_IN_USE:
920 return "SCARD_ATTR_DEVICE_IN_USE";
922 case SCARD_ATTR_DEVICE_FRIENDLY_NAME_A:
923 return "SCARD_ATTR_DEVICE_FRIENDLY_NAME_A";
925 case SCARD_ATTR_DEVICE_SYSTEM_NAME_A:
926 return "SCARD_ATTR_DEVICE_SYSTEM_NAME_A";
928 case SCARD_ATTR_DEVICE_FRIENDLY_NAME_W:
929 return "SCARD_ATTR_DEVICE_FRIENDLY_NAME_W";
931 case SCARD_ATTR_DEVICE_SYSTEM_NAME_W:
932 return "SCARD_ATTR_DEVICE_SYSTEM_NAME_W";
934 case SCARD_ATTR_SUPRESS_T1_IFS_REQUEST:
935 return "SCARD_ATTR_SUPRESS_T1_IFS_REQUEST";
938 return "SCARD_ATTR_UNKNOWN";
942WINSCARDAPI
const char* WINAPI SCardGetProtocolString(DWORD dwProtocols)
944 if (dwProtocols == SCARD_PROTOCOL_UNDEFINED)
945 return "SCARD_PROTOCOL_UNDEFINED";
947 if (dwProtocols == SCARD_PROTOCOL_T0)
948 return "SCARD_PROTOCOL_T0";
950 if (dwProtocols == SCARD_PROTOCOL_T1)
951 return "SCARD_PROTOCOL_T1";
953 if (dwProtocols == SCARD_PROTOCOL_Tx)
954 return "SCARD_PROTOCOL_Tx";
956 if (dwProtocols == SCARD_PROTOCOL_RAW)
957 return "SCARD_PROTOCOL_RAW";
959 if (dwProtocols == SCARD_PROTOCOL_DEFAULT)
960 return "SCARD_PROTOCOL_DEFAULT";
962 if (dwProtocols == (SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_RAW))
963 return "SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_RAW";
965 if (dwProtocols == (SCARD_PROTOCOL_T1 | SCARD_PROTOCOL_RAW))
966 return "SCARD_PROTOCOL_T1 | SCARD_PROTOCOL_RAW";
968 if (dwProtocols == (SCARD_PROTOCOL_Tx | SCARD_PROTOCOL_RAW))
969 return "SCARD_PROTOCOL_Tx | SCARD_PROTOCOL_RAW";
971 return "SCARD_PROTOCOL_UNKNOWN";
974WINSCARDAPI
const char* WINAPI SCardGetShareModeString(DWORD dwShareMode)
978 case SCARD_SHARE_EXCLUSIVE:
979 return "SCARD_SHARE_EXCLUSIVE";
981 case SCARD_SHARE_SHARED:
982 return "SCARD_SHARE_SHARED";
984 case SCARD_SHARE_DIRECT:
985 return "SCARD_SHARE_DIRECT";
988 return "SCARD_SHARE_UNKNOWN";
992WINSCARDAPI
const char* WINAPI SCardGetDispositionString(DWORD dwDisposition)
994 switch (dwDisposition)
996 case SCARD_LEAVE_CARD:
997 return "SCARD_LEAVE_CARD";
999 case SCARD_RESET_CARD:
1000 return "SCARD_RESET_CARD";
1002 case SCARD_UNPOWER_CARD:
1003 return "SCARD_UNPOWER_CARD";
1006 return "SCARD_UNKNOWN_CARD";
1010WINSCARDAPI
const char* WINAPI SCardGetScopeString(DWORD dwScope)
1014 case SCARD_SCOPE_USER:
1015 return "SCARD_SCOPE_USER";
1017 case SCARD_SCOPE_TERMINAL:
1018 return "SCARD_SCOPE_TERMINAL";
1020 case SCARD_SCOPE_SYSTEM:
1021 return "SCARD_SCOPE_SYSTEM";
1024 return "SCARD_SCOPE_UNKNOWN";
1028WINSCARDAPI
const char* WINAPI SCardGetCardStateString(DWORD dwCardState)
1030 switch (dwCardState)
1033 return "SCARD_UNKNOWN";
1036 return "SCARD_ABSENT";
1039 return "SCARD_PRESENT";
1041 case SCARD_SWALLOWED:
1042 return "SCARD_SWALLOWED";
1045 return "SCARD_POWERED";
1047 case SCARD_NEGOTIABLE:
1048 return "SCARD_NEGOTIABLE";
1050 case SCARD_SPECIFIC:
1051 return "SCARD_SPECIFIC";
1054 return "SCARD_UNKNOWN";
1058WINSCARDAPI
char* WINAPI SCardGetReaderStateString(DWORD dwReaderState)
1060 const size_t size = 512;
1061 char* buffer = calloc(size,
sizeof(
char));
1066 if (dwReaderState & SCARD_STATE_IGNORE)
1067 winpr_str_append(
"SCARD_STATE_IGNORE", buffer, size,
"|");
1069 if (dwReaderState & SCARD_STATE_CHANGED)
1070 winpr_str_append(
"SCARD_STATE_CHANGED", buffer, size,
"|");
1072 if (dwReaderState & SCARD_STATE_UNKNOWN)
1073 winpr_str_append(
"SCARD_STATE_UNKNOWN", buffer, size,
"|");
1075 if (dwReaderState & SCARD_STATE_UNAVAILABLE)
1076 winpr_str_append(
"SCARD_STATE_UNAVAILABLE", buffer, size,
"|");
1078 if (dwReaderState & SCARD_STATE_EMPTY)
1079 winpr_str_append(
"SCARD_STATE_EMPTY", buffer, size,
"|");
1081 if (dwReaderState & SCARD_STATE_PRESENT)
1082 winpr_str_append(
"SCARD_STATE_PRESENT", buffer, size,
"|");
1084 if (dwReaderState & SCARD_STATE_ATRMATCH)
1085 winpr_str_append(
"SCARD_STATE_ATRMATCH", buffer, size,
"|");
1087 if (dwReaderState & SCARD_STATE_EXCLUSIVE)
1088 winpr_str_append(
"SCARD_STATE_EXCLUSIVE", buffer, size,
"|");
1090 if (dwReaderState & SCARD_STATE_INUSE)
1091 winpr_str_append(
"SCARD_STATE_INUSE", buffer, size,
"|");
1093 if (dwReaderState & SCARD_STATE_MUTE)
1094 winpr_str_append(
"SCARD_STATE_MUTE", buffer, size,
"|");
1096 if (dwReaderState & SCARD_STATE_UNPOWERED)
1097 winpr_str_append(
"SCARD_STATE_UNPOWERED", buffer, size,
"|");
1100 winpr_str_append(
"SCARD_STATE_UNAWARE", buffer, size,
"|");
1105#define WINSCARD_LOAD_PROC(_name) \
1108 WINPR_PRAGMA_DIAG_PUSH \
1109 WINPR_PRAGMA_DIAG_IGNORED_PEDANTIC \
1110 pWinSCardApiTable->pfn##_name = GetProcAddressAs(hWinSCardLibrary, #_name, fn##_name); \
1111 WINPR_PRAGMA_DIAG_POP \
1115 HMODULE hWinSCardLibrary)
1117 WINPR_ASSERT(pWinSCardApiTable);
1118 WINPR_ASSERT(hWinSCardLibrary);
1120 WINSCARD_LOAD_PROC(SCardEstablishContext);
1121 WINSCARD_LOAD_PROC(SCardReleaseContext);
1122 WINSCARD_LOAD_PROC(SCardIsValidContext);
1123 WINSCARD_LOAD_PROC(SCardListReaderGroupsA);
1124 WINSCARD_LOAD_PROC(SCardListReaderGroupsW);
1125 WINSCARD_LOAD_PROC(SCardListReadersA);
1126 WINSCARD_LOAD_PROC(SCardListReadersW);
1127 WINSCARD_LOAD_PROC(SCardListCardsA);
1128 WINSCARD_LOAD_PROC(SCardListCardsW);
1129 WINSCARD_LOAD_PROC(SCardListInterfacesA);
1130 WINSCARD_LOAD_PROC(SCardListInterfacesW);
1131 WINSCARD_LOAD_PROC(SCardGetProviderIdA);
1132 WINSCARD_LOAD_PROC(SCardGetProviderIdW);
1133 WINSCARD_LOAD_PROC(SCardGetCardTypeProviderNameA);
1134 WINSCARD_LOAD_PROC(SCardGetCardTypeProviderNameW);
1135 WINSCARD_LOAD_PROC(SCardIntroduceReaderGroupA);
1136 WINSCARD_LOAD_PROC(SCardIntroduceReaderGroupW);
1137 WINSCARD_LOAD_PROC(SCardForgetReaderGroupA);
1138 WINSCARD_LOAD_PROC(SCardForgetReaderGroupW);
1139 WINSCARD_LOAD_PROC(SCardIntroduceReaderA);
1140 WINSCARD_LOAD_PROC(SCardIntroduceReaderW);
1141 WINSCARD_LOAD_PROC(SCardForgetReaderA);
1142 WINSCARD_LOAD_PROC(SCardForgetReaderW);
1143 WINSCARD_LOAD_PROC(SCardAddReaderToGroupA);
1144 WINSCARD_LOAD_PROC(SCardAddReaderToGroupW);
1145 WINSCARD_LOAD_PROC(SCardRemoveReaderFromGroupA);
1146 WINSCARD_LOAD_PROC(SCardRemoveReaderFromGroupW);
1147 WINSCARD_LOAD_PROC(SCardIntroduceCardTypeA);
1148 WINSCARD_LOAD_PROC(SCardIntroduceCardTypeW);
1149 WINSCARD_LOAD_PROC(SCardSetCardTypeProviderNameA);
1150 WINSCARD_LOAD_PROC(SCardSetCardTypeProviderNameW);
1151 WINSCARD_LOAD_PROC(SCardForgetCardTypeA);
1152 WINSCARD_LOAD_PROC(SCardForgetCardTypeW);
1153 WINSCARD_LOAD_PROC(SCardFreeMemory);
1154 WINSCARD_LOAD_PROC(SCardAccessStartedEvent);
1155 WINSCARD_LOAD_PROC(SCardReleaseStartedEvent);
1156 WINSCARD_LOAD_PROC(SCardLocateCardsA);
1157 WINSCARD_LOAD_PROC(SCardLocateCardsW);
1158 WINSCARD_LOAD_PROC(SCardLocateCardsByATRA);
1159 WINSCARD_LOAD_PROC(SCardLocateCardsByATRW);
1160 WINSCARD_LOAD_PROC(SCardGetStatusChangeA);
1161 WINSCARD_LOAD_PROC(SCardGetStatusChangeW);
1162 WINSCARD_LOAD_PROC(SCardCancel);
1163 WINSCARD_LOAD_PROC(SCardConnectA);
1164 WINSCARD_LOAD_PROC(SCardConnectW);
1165 WINSCARD_LOAD_PROC(SCardReconnect);
1166 WINSCARD_LOAD_PROC(SCardDisconnect);
1167 WINSCARD_LOAD_PROC(SCardBeginTransaction);
1168 WINSCARD_LOAD_PROC(SCardEndTransaction);
1169 WINSCARD_LOAD_PROC(SCardCancelTransaction);
1170 WINSCARD_LOAD_PROC(SCardState);
1171 WINSCARD_LOAD_PROC(SCardStatusA);
1172 WINSCARD_LOAD_PROC(SCardStatusW);
1173 WINSCARD_LOAD_PROC(SCardTransmit);
1174 WINSCARD_LOAD_PROC(SCardGetTransmitCount);
1175 WINSCARD_LOAD_PROC(SCardControl);
1176 WINSCARD_LOAD_PROC(SCardGetAttrib);
1177 WINSCARD_LOAD_PROC(SCardSetAttrib);
1178 WINSCARD_LOAD_PROC(SCardUIDlgSelectCardA);
1179 WINSCARD_LOAD_PROC(SCardUIDlgSelectCardW);
1180 WINSCARD_LOAD_PROC(GetOpenCardNameA);
1181 WINSCARD_LOAD_PROC(GetOpenCardNameW);
1182 WINSCARD_LOAD_PROC(SCardDlgExtendedError);
1183 WINSCARD_LOAD_PROC(SCardReadCacheA);
1184 WINSCARD_LOAD_PROC(SCardReadCacheW);
1185 WINSCARD_LOAD_PROC(SCardWriteCacheA);
1186 WINSCARD_LOAD_PROC(SCardWriteCacheW);
1187 WINSCARD_LOAD_PROC(SCardGetReaderIconA);
1188 WINSCARD_LOAD_PROC(SCardGetReaderIconW);
1189 WINSCARD_LOAD_PROC(SCardGetDeviceTypeIdA);
1190 WINSCARD_LOAD_PROC(SCardGetDeviceTypeIdW);
1191 WINSCARD_LOAD_PROC(SCardGetReaderDeviceInstanceIdA);
1192 WINSCARD_LOAD_PROC(SCardGetReaderDeviceInstanceIdW);
1193 WINSCARD_LOAD_PROC(SCardListReadersWithDeviceInstanceIdA);
1194 WINSCARD_LOAD_PROC(SCardListReadersWithDeviceInstanceIdW);
1195 WINSCARD_LOAD_PROC(SCardAudit);
1204 SCardEstablishContext,
1205 SCardReleaseContext,
1206 SCardIsValidContext,
1207 SCardListReaderGroupsA,
1208 SCardListReaderGroupsW,
1213 SCardListInterfacesA,
1214 SCardListInterfacesW,
1215 SCardGetProviderIdA,
1216 SCardGetProviderIdW,
1217 SCardGetCardTypeProviderNameA,
1218 SCardGetCardTypeProviderNameW,
1219 SCardIntroduceReaderGroupA,
1220 SCardIntroduceReaderGroupW,
1221 SCardForgetReaderGroupA,
1222 SCardForgetReaderGroupW,
1223 SCardIntroduceReaderA,
1224 SCardIntroduceReaderW,
1227 SCardAddReaderToGroupA,
1228 SCardAddReaderToGroupW,
1229 SCardRemoveReaderFromGroupA,
1230 SCardRemoveReaderFromGroupW,
1231 SCardIntroduceCardTypeA,
1232 SCardIntroduceCardTypeW,
1233 SCardSetCardTypeProviderNameA,
1234 SCardSetCardTypeProviderNameW,
1235 SCardForgetCardTypeA,
1236 SCardForgetCardTypeW,
1238 SCardAccessStartedEvent,
1239 SCardReleaseStartedEvent,
1242 SCardLocateCardsByATRA,
1243 SCardLocateCardsByATRW,
1244 SCardGetStatusChangeA,
1245 SCardGetStatusChangeW,
1251 SCardBeginTransaction,
1252 SCardEndTransaction,
1253 SCardCancelTransaction,
1258 SCardGetTransmitCount,
1262 SCardUIDlgSelectCardA,
1263 SCardUIDlgSelectCardW,
1266 SCardDlgExtendedError,
1271 SCardGetReaderIconA,
1272 SCardGetReaderIconW,
1273 SCardGetDeviceTypeIdA,
1274 SCardGetDeviceTypeIdW,
1275 SCardGetReaderDeviceInstanceIdA,
1276 SCardGetReaderDeviceInstanceIdW,
1277 SCardListReadersWithDeviceInstanceIdA,
1278 SCardListReadersWithDeviceInstanceIdW,
1284 return &WinPR_SCardApiFunctionTable;