smartcard.c 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147
  1. /**
  2. * WinPR: Windows Portable Runtime
  3. * Smart Card API
  4. *
  5. * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com>
  6. *
  7. * Licensed under the Apache License, Version 2.0 (the "License");
  8. * you may not use this file except in compliance with the License.
  9. * You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing, software
  14. * distributed under the License is distributed on an "AS IS" BASIS,
  15. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. * See the License for the specific language governing permissions and
  17. * limitations under the License.
  18. */
  19. #ifdef HAVE_CONFIG_H
  20. #include "config.h"
  21. #endif
  22. #include <winpr/crt.h>
  23. #include <winpr/library.h>
  24. #include <winpr/smartcard.h>
  25. #include <winpr/synch.h>
  26. #include <winpr/wlog.h>
  27. #include "../log.h"
  28. #include "smartcard.h"
  29. #include "smartcard_inspect.h"
  30. static INIT_ONCE g_Initialized = INIT_ONCE_STATIC_INIT;
  31. static PSCardApiFunctionTable g_SCardApi = NULL;
  32. #define TAG WINPR_TAG("smartcard")
  33. #define xstr(s) str(s)
  34. #define str(s) #s
  35. #define SCARDAPI_STUB_CALL_LONG(_name, ...) \
  36. InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, NULL, NULL); \
  37. if (!g_SCardApi || !g_SCardApi->pfn##_name) \
  38. { \
  39. WLog_DBG(TAG, "Missing function pointer g_SCardApi=%p->" xstr(pfn##_name) "=%p", \
  40. g_SCardApi, g_SCardApi ? g_SCardApi->pfn##_name : NULL); \
  41. return SCARD_E_NO_SERVICE; \
  42. } \
  43. return g_SCardApi->pfn##_name(__VA_ARGS__)
  44. #define SCARDAPI_STUB_CALL_HANDLE(_name, ...) \
  45. InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, NULL, NULL); \
  46. if (!g_SCardApi || !g_SCardApi->pfn##_name) \
  47. return NULL; \
  48. return g_SCardApi->pfn##_name(__VA_ARGS__)
  49. #define SCARDAPI_STUB_CALL_VOID(_name, ...) \
  50. InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, NULL, NULL); \
  51. if (!g_SCardApi || !g_SCardApi->pfn##_name) \
  52. return; \
  53. g_SCardApi->pfn##_name(__VA_ARGS__)
  54. /**
  55. * Standard Windows Smart Card API
  56. */
  57. const SCARD_IO_REQUEST g_rgSCardT0Pci = { SCARD_PROTOCOL_T0, 8 };
  58. const SCARD_IO_REQUEST g_rgSCardT1Pci = { SCARD_PROTOCOL_T1, 8 };
  59. const SCARD_IO_REQUEST g_rgSCardRawPci = { SCARD_PROTOCOL_RAW, 8 };
  60. static BOOL CALLBACK InitializeSCardApiStubs(PINIT_ONCE once, PVOID param, PVOID* context)
  61. {
  62. #ifndef _WIN32
  63. if (PCSC_InitializeSCardApi() >= 0)
  64. g_SCardApi = PCSC_GetSCardApiFunctionTable();
  65. #else
  66. if (WinSCard_InitializeSCardApi() >= 0)
  67. g_SCardApi = WinSCard_GetSCardApiFunctionTable();
  68. #endif
  69. #ifdef WITH_SMARTCARD_INSPECT
  70. g_SCardApi = Inspect_RegisterSCardApi(g_SCardApi);
  71. #endif
  72. return TRUE;
  73. }
  74. WINSCARDAPI LONG WINAPI SCardEstablishContext(DWORD dwScope, LPCVOID pvReserved1,
  75. LPCVOID pvReserved2, LPSCARDCONTEXT phContext)
  76. {
  77. SCARDAPI_STUB_CALL_LONG(SCardEstablishContext, dwScope, pvReserved1, pvReserved2, phContext);
  78. }
  79. WINSCARDAPI LONG WINAPI SCardReleaseContext(SCARDCONTEXT hContext)
  80. {
  81. SCARDAPI_STUB_CALL_LONG(SCardReleaseContext, hContext);
  82. }
  83. WINSCARDAPI LONG WINAPI SCardIsValidContext(SCARDCONTEXT hContext)
  84. {
  85. SCARDAPI_STUB_CALL_LONG(SCardIsValidContext, hContext);
  86. }
  87. WINSCARDAPI LONG WINAPI SCardListReaderGroupsA(SCARDCONTEXT hContext, LPSTR mszGroups,
  88. LPDWORD pcchGroups)
  89. {
  90. SCARDAPI_STUB_CALL_LONG(SCardListReaderGroupsA, hContext, mszGroups, pcchGroups);
  91. }
  92. WINSCARDAPI LONG WINAPI SCardListReaderGroupsW(SCARDCONTEXT hContext, LPWSTR mszGroups,
  93. LPDWORD pcchGroups)
  94. {
  95. SCARDAPI_STUB_CALL_LONG(SCardListReaderGroupsW, hContext, mszGroups, pcchGroups);
  96. }
  97. WINSCARDAPI LONG WINAPI SCardListReadersA(SCARDCONTEXT hContext, LPCSTR mszGroups, LPSTR mszReaders,
  98. LPDWORD pcchReaders)
  99. {
  100. SCARDAPI_STUB_CALL_LONG(SCardListReadersA, hContext, mszGroups, mszReaders, pcchReaders);
  101. }
  102. WINSCARDAPI LONG WINAPI SCardListReadersW(SCARDCONTEXT hContext, LPCWSTR mszGroups,
  103. LPWSTR mszReaders, LPDWORD pcchReaders)
  104. {
  105. SCARDAPI_STUB_CALL_LONG(SCardListReadersW, hContext, mszGroups, mszReaders, pcchReaders);
  106. }
  107. WINSCARDAPI LONG WINAPI SCardListCardsA(SCARDCONTEXT hContext, LPCBYTE pbAtr,
  108. LPCGUID rgquidInterfaces, DWORD cguidInterfaceCount,
  109. CHAR* mszCards, LPDWORD pcchCards)
  110. {
  111. SCARDAPI_STUB_CALL_LONG(SCardListCardsA, hContext, pbAtr, rgquidInterfaces, cguidInterfaceCount,
  112. mszCards, pcchCards);
  113. }
  114. WINSCARDAPI LONG WINAPI SCardListCardsW(SCARDCONTEXT hContext, LPCBYTE pbAtr,
  115. LPCGUID rgquidInterfaces, DWORD cguidInterfaceCount,
  116. WCHAR* mszCards, LPDWORD pcchCards)
  117. {
  118. SCARDAPI_STUB_CALL_LONG(SCardListCardsW, hContext, pbAtr, rgquidInterfaces, cguidInterfaceCount,
  119. mszCards, pcchCards);
  120. }
  121. WINSCARDAPI LONG WINAPI SCardListInterfacesA(SCARDCONTEXT hContext, LPCSTR szCard,
  122. LPGUID pguidInterfaces, LPDWORD pcguidInterfaces)
  123. {
  124. SCARDAPI_STUB_CALL_LONG(SCardListInterfacesA, hContext, szCard, pguidInterfaces,
  125. pcguidInterfaces);
  126. }
  127. WINSCARDAPI LONG WINAPI SCardListInterfacesW(SCARDCONTEXT hContext, LPCWSTR szCard,
  128. LPGUID pguidInterfaces, LPDWORD pcguidInterfaces)
  129. {
  130. SCARDAPI_STUB_CALL_LONG(SCardListInterfacesW, hContext, szCard, pguidInterfaces,
  131. pcguidInterfaces);
  132. }
  133. WINSCARDAPI LONG WINAPI SCardGetProviderIdA(SCARDCONTEXT hContext, LPCSTR szCard,
  134. LPGUID pguidProviderId)
  135. {
  136. SCARDAPI_STUB_CALL_LONG(SCardGetProviderIdA, hContext, szCard, pguidProviderId);
  137. }
  138. WINSCARDAPI LONG WINAPI SCardGetProviderIdW(SCARDCONTEXT hContext, LPCWSTR szCard,
  139. LPGUID pguidProviderId)
  140. {
  141. SCARDAPI_STUB_CALL_LONG(SCardGetProviderIdW, hContext, szCard, pguidProviderId);
  142. }
  143. WINSCARDAPI LONG WINAPI SCardGetCardTypeProviderNameA(SCARDCONTEXT hContext, LPCSTR szCardName,
  144. DWORD dwProviderId, CHAR* szProvider,
  145. LPDWORD pcchProvider)
  146. {
  147. SCARDAPI_STUB_CALL_LONG(SCardGetCardTypeProviderNameA, hContext, szCardName, dwProviderId,
  148. szProvider, pcchProvider);
  149. }
  150. WINSCARDAPI LONG WINAPI SCardGetCardTypeProviderNameW(SCARDCONTEXT hContext, LPCWSTR szCardName,
  151. DWORD dwProviderId, WCHAR* szProvider,
  152. LPDWORD pcchProvider)
  153. {
  154. SCARDAPI_STUB_CALL_LONG(SCardGetCardTypeProviderNameW, hContext, szCardName, dwProviderId,
  155. szProvider, pcchProvider);
  156. }
  157. WINSCARDAPI LONG WINAPI SCardIntroduceReaderGroupA(SCARDCONTEXT hContext, LPCSTR szGroupName)
  158. {
  159. SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderGroupA, hContext, szGroupName);
  160. }
  161. WINSCARDAPI LONG WINAPI SCardIntroduceReaderGroupW(SCARDCONTEXT hContext, LPCWSTR szGroupName)
  162. {
  163. SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderGroupW, hContext, szGroupName);
  164. }
  165. WINSCARDAPI LONG WINAPI SCardForgetReaderGroupA(SCARDCONTEXT hContext, LPCSTR szGroupName)
  166. {
  167. SCARDAPI_STUB_CALL_LONG(SCardForgetReaderGroupA, hContext, szGroupName);
  168. }
  169. WINSCARDAPI LONG WINAPI SCardForgetReaderGroupW(SCARDCONTEXT hContext, LPCWSTR szGroupName)
  170. {
  171. SCARDAPI_STUB_CALL_LONG(SCardForgetReaderGroupW, hContext, szGroupName);
  172. }
  173. WINSCARDAPI LONG WINAPI SCardIntroduceReaderA(SCARDCONTEXT hContext, LPCSTR szReaderName,
  174. LPCSTR szDeviceName)
  175. {
  176. SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderA, hContext, szReaderName, szDeviceName);
  177. }
  178. WINSCARDAPI LONG WINAPI SCardIntroduceReaderW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
  179. LPCWSTR szDeviceName)
  180. {
  181. SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderW, hContext, szReaderName, szDeviceName);
  182. }
  183. WINSCARDAPI LONG WINAPI SCardForgetReaderA(SCARDCONTEXT hContext, LPCSTR szReaderName)
  184. {
  185. SCARDAPI_STUB_CALL_LONG(SCardForgetReaderA, hContext, szReaderName);
  186. }
  187. WINSCARDAPI LONG WINAPI SCardForgetReaderW(SCARDCONTEXT hContext, LPCWSTR szReaderName)
  188. {
  189. SCARDAPI_STUB_CALL_LONG(SCardForgetReaderW, hContext, szReaderName);
  190. }
  191. WINSCARDAPI LONG WINAPI SCardAddReaderToGroupA(SCARDCONTEXT hContext, LPCSTR szReaderName,
  192. LPCSTR szGroupName)
  193. {
  194. SCARDAPI_STUB_CALL_LONG(SCardAddReaderToGroupA, hContext, szReaderName, szGroupName);
  195. }
  196. WINSCARDAPI LONG WINAPI SCardAddReaderToGroupW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
  197. LPCWSTR szGroupName)
  198. {
  199. SCARDAPI_STUB_CALL_LONG(SCardAddReaderToGroupW, hContext, szReaderName, szGroupName);
  200. }
  201. WINSCARDAPI LONG WINAPI SCardRemoveReaderFromGroupA(SCARDCONTEXT hContext, LPCSTR szReaderName,
  202. LPCSTR szGroupName)
  203. {
  204. SCARDAPI_STUB_CALL_LONG(SCardRemoveReaderFromGroupA, hContext, szReaderName, szGroupName);
  205. }
  206. WINSCARDAPI LONG WINAPI SCardRemoveReaderFromGroupW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
  207. LPCWSTR szGroupName)
  208. {
  209. SCARDAPI_STUB_CALL_LONG(SCardRemoveReaderFromGroupW, hContext, szReaderName, szGroupName);
  210. }
  211. WINSCARDAPI LONG WINAPI SCardIntroduceCardTypeA(SCARDCONTEXT hContext, LPCSTR szCardName,
  212. LPCGUID pguidPrimaryProvider,
  213. LPCGUID rgguidInterfaces, DWORD dwInterfaceCount,
  214. LPCBYTE pbAtr, LPCBYTE pbAtrMask, DWORD cbAtrLen)
  215. {
  216. SCARDAPI_STUB_CALL_LONG(SCardIntroduceCardTypeA, hContext, szCardName, pguidPrimaryProvider,
  217. rgguidInterfaces, dwInterfaceCount, pbAtr, pbAtrMask, cbAtrLen);
  218. }
  219. WINSCARDAPI LONG WINAPI SCardIntroduceCardTypeW(SCARDCONTEXT hContext, LPCWSTR szCardName,
  220. LPCGUID pguidPrimaryProvider,
  221. LPCGUID rgguidInterfaces, DWORD dwInterfaceCount,
  222. LPCBYTE pbAtr, LPCBYTE pbAtrMask, DWORD cbAtrLen)
  223. {
  224. SCARDAPI_STUB_CALL_LONG(SCardIntroduceCardTypeW, hContext, szCardName, pguidPrimaryProvider,
  225. rgguidInterfaces, dwInterfaceCount, pbAtr, pbAtrMask, cbAtrLen);
  226. }
  227. WINSCARDAPI LONG WINAPI SCardSetCardTypeProviderNameA(SCARDCONTEXT hContext, LPCSTR szCardName,
  228. DWORD dwProviderId, LPCSTR szProvider)
  229. {
  230. SCARDAPI_STUB_CALL_LONG(SCardSetCardTypeProviderNameA, hContext, szCardName, dwProviderId,
  231. szProvider);
  232. }
  233. WINSCARDAPI LONG WINAPI SCardSetCardTypeProviderNameW(SCARDCONTEXT hContext, LPCWSTR szCardName,
  234. DWORD dwProviderId, LPCWSTR szProvider)
  235. {
  236. SCARDAPI_STUB_CALL_LONG(SCardSetCardTypeProviderNameW, hContext, szCardName, dwProviderId,
  237. szProvider);
  238. }
  239. WINSCARDAPI LONG WINAPI SCardForgetCardTypeA(SCARDCONTEXT hContext, LPCSTR szCardName)
  240. {
  241. SCARDAPI_STUB_CALL_LONG(SCardForgetCardTypeA, hContext, szCardName);
  242. }
  243. WINSCARDAPI LONG WINAPI SCardForgetCardTypeW(SCARDCONTEXT hContext, LPCWSTR szCardName)
  244. {
  245. SCARDAPI_STUB_CALL_LONG(SCardForgetCardTypeW, hContext, szCardName);
  246. }
  247. WINSCARDAPI LONG WINAPI SCardFreeMemory(SCARDCONTEXT hContext, LPCVOID pvMem)
  248. {
  249. SCARDAPI_STUB_CALL_LONG(SCardFreeMemory, hContext, pvMem);
  250. }
  251. WINSCARDAPI HANDLE WINAPI SCardAccessStartedEvent(void)
  252. {
  253. SCARDAPI_STUB_CALL_HANDLE(SCardAccessStartedEvent);
  254. }
  255. WINSCARDAPI void WINAPI SCardReleaseStartedEvent(void)
  256. {
  257. SCARDAPI_STUB_CALL_VOID(SCardReleaseStartedEvent);
  258. }
  259. WINSCARDAPI LONG WINAPI SCardLocateCardsA(SCARDCONTEXT hContext, LPCSTR mszCards,
  260. LPSCARD_READERSTATEA rgReaderStates, DWORD cReaders)
  261. {
  262. SCARDAPI_STUB_CALL_LONG(SCardLocateCardsA, hContext, mszCards, rgReaderStates, cReaders);
  263. }
  264. WINSCARDAPI LONG WINAPI SCardLocateCardsW(SCARDCONTEXT hContext, LPCWSTR mszCards,
  265. LPSCARD_READERSTATEW rgReaderStates, DWORD cReaders)
  266. {
  267. SCARDAPI_STUB_CALL_LONG(SCardLocateCardsW, hContext, mszCards, rgReaderStates, cReaders);
  268. }
  269. WINSCARDAPI LONG WINAPI SCardLocateCardsByATRA(SCARDCONTEXT hContext, LPSCARD_ATRMASK rgAtrMasks,
  270. DWORD cAtrs, LPSCARD_READERSTATEA rgReaderStates,
  271. DWORD cReaders)
  272. {
  273. SCARDAPI_STUB_CALL_LONG(SCardLocateCardsByATRA, hContext, rgAtrMasks, cAtrs, rgReaderStates,
  274. cReaders);
  275. }
  276. WINSCARDAPI LONG WINAPI SCardLocateCardsByATRW(SCARDCONTEXT hContext, LPSCARD_ATRMASK rgAtrMasks,
  277. DWORD cAtrs, LPSCARD_READERSTATEW rgReaderStates,
  278. DWORD cReaders)
  279. {
  280. SCARDAPI_STUB_CALL_LONG(SCardLocateCardsByATRW, hContext, rgAtrMasks, cAtrs, rgReaderStates,
  281. cReaders);
  282. }
  283. WINSCARDAPI LONG WINAPI SCardGetStatusChangeA(SCARDCONTEXT hContext, DWORD dwTimeout,
  284. LPSCARD_READERSTATEA rgReaderStates, DWORD cReaders)
  285. {
  286. SCARDAPI_STUB_CALL_LONG(SCardGetStatusChangeA, hContext, dwTimeout, rgReaderStates, cReaders);
  287. }
  288. WINSCARDAPI LONG WINAPI SCardGetStatusChangeW(SCARDCONTEXT hContext, DWORD dwTimeout,
  289. LPSCARD_READERSTATEW rgReaderStates, DWORD cReaders)
  290. {
  291. SCARDAPI_STUB_CALL_LONG(SCardGetStatusChangeW, hContext, dwTimeout, rgReaderStates, cReaders);
  292. }
  293. WINSCARDAPI LONG WINAPI SCardCancel(SCARDCONTEXT hContext)
  294. {
  295. SCARDAPI_STUB_CALL_LONG(SCardCancel, hContext);
  296. }
  297. WINSCARDAPI LONG WINAPI SCardConnectA(SCARDCONTEXT hContext, LPCSTR szReader, DWORD dwShareMode,
  298. DWORD dwPreferredProtocols, LPSCARDHANDLE phCard,
  299. LPDWORD pdwActiveProtocol)
  300. {
  301. SCARDAPI_STUB_CALL_LONG(SCardConnectA, hContext, szReader, dwShareMode, dwPreferredProtocols,
  302. phCard, pdwActiveProtocol);
  303. }
  304. WINSCARDAPI LONG WINAPI SCardConnectW(SCARDCONTEXT hContext, LPCWSTR szReader, DWORD dwShareMode,
  305. DWORD dwPreferredProtocols, LPSCARDHANDLE phCard,
  306. LPDWORD pdwActiveProtocol)
  307. {
  308. SCARDAPI_STUB_CALL_LONG(SCardConnectW, hContext, szReader, dwShareMode, dwPreferredProtocols,
  309. phCard, pdwActiveProtocol);
  310. }
  311. WINSCARDAPI LONG WINAPI SCardReconnect(SCARDHANDLE hCard, DWORD dwShareMode,
  312. DWORD dwPreferredProtocols, DWORD dwInitialization,
  313. LPDWORD pdwActiveProtocol)
  314. {
  315. SCARDAPI_STUB_CALL_LONG(SCardReconnect, hCard, dwShareMode, dwPreferredProtocols,
  316. dwInitialization, pdwActiveProtocol);
  317. }
  318. WINSCARDAPI LONG WINAPI SCardDisconnect(SCARDHANDLE hCard, DWORD dwDisposition)
  319. {
  320. SCARDAPI_STUB_CALL_LONG(SCardDisconnect, hCard, dwDisposition);
  321. }
  322. WINSCARDAPI LONG WINAPI SCardBeginTransaction(SCARDHANDLE hCard)
  323. {
  324. SCARDAPI_STUB_CALL_LONG(SCardBeginTransaction, hCard);
  325. }
  326. WINSCARDAPI LONG WINAPI SCardEndTransaction(SCARDHANDLE hCard, DWORD dwDisposition)
  327. {
  328. SCARDAPI_STUB_CALL_LONG(SCardEndTransaction, hCard, dwDisposition);
  329. }
  330. WINSCARDAPI LONG WINAPI SCardCancelTransaction(SCARDHANDLE hCard)
  331. {
  332. SCARDAPI_STUB_CALL_LONG(SCardCancelTransaction, hCard);
  333. }
  334. WINSCARDAPI LONG WINAPI SCardState(SCARDHANDLE hCard, LPDWORD pdwState, LPDWORD pdwProtocol,
  335. LPBYTE pbAtr, LPDWORD pcbAtrLen)
  336. {
  337. SCARDAPI_STUB_CALL_LONG(SCardState, hCard, pdwState, pdwProtocol, pbAtr, pcbAtrLen);
  338. }
  339. WINSCARDAPI LONG WINAPI SCardStatusA(SCARDHANDLE hCard, LPSTR mszReaderNames, LPDWORD pcchReaderLen,
  340. LPDWORD pdwState, LPDWORD pdwProtocol, LPBYTE pbAtr,
  341. LPDWORD pcbAtrLen)
  342. {
  343. SCARDAPI_STUB_CALL_LONG(SCardStatusA, hCard, mszReaderNames, pcchReaderLen, pdwState,
  344. pdwProtocol, pbAtr, pcbAtrLen);
  345. }
  346. WINSCARDAPI LONG WINAPI SCardStatusW(SCARDHANDLE hCard, LPWSTR mszReaderNames,
  347. LPDWORD pcchReaderLen, LPDWORD pdwState, LPDWORD pdwProtocol,
  348. LPBYTE pbAtr, LPDWORD pcbAtrLen)
  349. {
  350. SCARDAPI_STUB_CALL_LONG(SCardStatusW, hCard, mszReaderNames, pcchReaderLen, pdwState,
  351. pdwProtocol, pbAtr, pcbAtrLen);
  352. }
  353. WINSCARDAPI LONG WINAPI SCardTransmit(SCARDHANDLE hCard, LPCSCARD_IO_REQUEST pioSendPci,
  354. LPCBYTE pbSendBuffer, DWORD cbSendLength,
  355. LPSCARD_IO_REQUEST pioRecvPci, LPBYTE pbRecvBuffer,
  356. LPDWORD pcbRecvLength)
  357. {
  358. SCARDAPI_STUB_CALL_LONG(SCardTransmit, hCard, pioSendPci, pbSendBuffer, cbSendLength,
  359. pioRecvPci, pbRecvBuffer, pcbRecvLength);
  360. }
  361. WINSCARDAPI LONG WINAPI SCardGetTransmitCount(SCARDHANDLE hCard, LPDWORD pcTransmitCount)
  362. {
  363. SCARDAPI_STUB_CALL_LONG(SCardGetTransmitCount, hCard, pcTransmitCount);
  364. }
  365. WINSCARDAPI LONG WINAPI SCardControl(SCARDHANDLE hCard, DWORD dwControlCode, LPCVOID lpInBuffer,
  366. DWORD cbInBufferSize, LPVOID lpOutBuffer,
  367. DWORD cbOutBufferSize, LPDWORD lpBytesReturned)
  368. {
  369. SCARDAPI_STUB_CALL_LONG(SCardControl, hCard, dwControlCode, lpInBuffer, cbInBufferSize,
  370. lpOutBuffer, cbOutBufferSize, lpBytesReturned);
  371. }
  372. WINSCARDAPI LONG WINAPI SCardGetAttrib(SCARDHANDLE hCard, DWORD dwAttrId, LPBYTE pbAttr,
  373. LPDWORD pcbAttrLen)
  374. {
  375. SCARDAPI_STUB_CALL_LONG(SCardGetAttrib, hCard, dwAttrId, pbAttr, pcbAttrLen);
  376. }
  377. WINSCARDAPI LONG WINAPI SCardSetAttrib(SCARDHANDLE hCard, DWORD dwAttrId, LPCBYTE pbAttr,
  378. DWORD cbAttrLen)
  379. {
  380. SCARDAPI_STUB_CALL_LONG(SCardSetAttrib, hCard, dwAttrId, pbAttr, cbAttrLen);
  381. }
  382. WINSCARDAPI LONG WINAPI SCardUIDlgSelectCardA(LPOPENCARDNAMEA_EX pDlgStruc)
  383. {
  384. SCARDAPI_STUB_CALL_LONG(SCardUIDlgSelectCardA, pDlgStruc);
  385. }
  386. WINSCARDAPI LONG WINAPI SCardUIDlgSelectCardW(LPOPENCARDNAMEW_EX pDlgStruc)
  387. {
  388. SCARDAPI_STUB_CALL_LONG(SCardUIDlgSelectCardW, pDlgStruc);
  389. }
  390. WINSCARDAPI LONG WINAPI GetOpenCardNameA(LPOPENCARDNAMEA pDlgStruc)
  391. {
  392. SCARDAPI_STUB_CALL_LONG(GetOpenCardNameA, pDlgStruc);
  393. }
  394. WINSCARDAPI LONG WINAPI GetOpenCardNameW(LPOPENCARDNAMEW pDlgStruc)
  395. {
  396. SCARDAPI_STUB_CALL_LONG(GetOpenCardNameW, pDlgStruc);
  397. }
  398. WINSCARDAPI LONG WINAPI SCardDlgExtendedError(void)
  399. {
  400. SCARDAPI_STUB_CALL_LONG(SCardDlgExtendedError);
  401. }
  402. WINSCARDAPI LONG WINAPI SCardReadCacheA(SCARDCONTEXT hContext, UUID* CardIdentifier,
  403. DWORD FreshnessCounter, LPSTR LookupName, PBYTE Data,
  404. DWORD* DataLen)
  405. {
  406. SCARDAPI_STUB_CALL_LONG(SCardReadCacheA, hContext, CardIdentifier, FreshnessCounter, LookupName,
  407. Data, DataLen);
  408. }
  409. WINSCARDAPI LONG WINAPI SCardReadCacheW(SCARDCONTEXT hContext, UUID* CardIdentifier,
  410. DWORD FreshnessCounter, LPWSTR LookupName, PBYTE Data,
  411. DWORD* DataLen)
  412. {
  413. SCARDAPI_STUB_CALL_LONG(SCardReadCacheW, hContext, CardIdentifier, FreshnessCounter, LookupName,
  414. Data, DataLen);
  415. }
  416. WINSCARDAPI LONG WINAPI SCardWriteCacheA(SCARDCONTEXT hContext, UUID* CardIdentifier,
  417. DWORD FreshnessCounter, LPSTR LookupName, PBYTE Data,
  418. DWORD DataLen)
  419. {
  420. SCARDAPI_STUB_CALL_LONG(SCardWriteCacheA, hContext, CardIdentifier, FreshnessCounter,
  421. LookupName, Data, DataLen);
  422. }
  423. WINSCARDAPI LONG WINAPI SCardWriteCacheW(SCARDCONTEXT hContext, UUID* CardIdentifier,
  424. DWORD FreshnessCounter, LPWSTR LookupName, PBYTE Data,
  425. DWORD DataLen)
  426. {
  427. SCARDAPI_STUB_CALL_LONG(SCardWriteCacheW, hContext, CardIdentifier, FreshnessCounter,
  428. LookupName, Data, DataLen);
  429. }
  430. WINSCARDAPI LONG WINAPI SCardGetReaderIconA(SCARDCONTEXT hContext, LPCSTR szReaderName,
  431. LPBYTE pbIcon, LPDWORD pcbIcon)
  432. {
  433. SCARDAPI_STUB_CALL_LONG(SCardGetReaderIconA, hContext, szReaderName, pbIcon, pcbIcon);
  434. }
  435. WINSCARDAPI LONG WINAPI SCardGetReaderIconW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
  436. LPBYTE pbIcon, LPDWORD pcbIcon)
  437. {
  438. SCARDAPI_STUB_CALL_LONG(SCardGetReaderIconW, hContext, szReaderName, pbIcon, pcbIcon);
  439. }
  440. WINSCARDAPI LONG WINAPI SCardGetDeviceTypeIdA(SCARDCONTEXT hContext, LPCSTR szReaderName,
  441. LPDWORD pdwDeviceTypeId)
  442. {
  443. SCARDAPI_STUB_CALL_LONG(SCardGetDeviceTypeIdA, hContext, szReaderName, pdwDeviceTypeId);
  444. }
  445. WINSCARDAPI LONG WINAPI SCardGetDeviceTypeIdW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
  446. LPDWORD pdwDeviceTypeId)
  447. {
  448. SCARDAPI_STUB_CALL_LONG(SCardGetDeviceTypeIdW, hContext, szReaderName, pdwDeviceTypeId);
  449. }
  450. WINSCARDAPI LONG WINAPI SCardGetReaderDeviceInstanceIdA(SCARDCONTEXT hContext, LPCSTR szReaderName,
  451. LPSTR szDeviceInstanceId,
  452. LPDWORD pcchDeviceInstanceId)
  453. {
  454. SCARDAPI_STUB_CALL_LONG(SCardGetReaderDeviceInstanceIdA, hContext, szReaderName,
  455. szDeviceInstanceId, pcchDeviceInstanceId);
  456. }
  457. WINSCARDAPI LONG WINAPI SCardGetReaderDeviceInstanceIdW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
  458. LPWSTR szDeviceInstanceId,
  459. LPDWORD pcchDeviceInstanceId)
  460. {
  461. SCARDAPI_STUB_CALL_LONG(SCardGetReaderDeviceInstanceIdW, hContext, szReaderName,
  462. szDeviceInstanceId, pcchDeviceInstanceId);
  463. }
  464. WINSCARDAPI LONG WINAPI SCardListReadersWithDeviceInstanceIdA(SCARDCONTEXT hContext,
  465. LPCSTR szDeviceInstanceId,
  466. LPSTR mszReaders, LPDWORD pcchReaders)
  467. {
  468. SCARDAPI_STUB_CALL_LONG(SCardListReadersWithDeviceInstanceIdA, hContext, szDeviceInstanceId,
  469. mszReaders, pcchReaders);
  470. }
  471. WINSCARDAPI LONG WINAPI SCardListReadersWithDeviceInstanceIdW(SCARDCONTEXT hContext,
  472. LPCWSTR szDeviceInstanceId,
  473. LPWSTR mszReaders,
  474. LPDWORD pcchReaders)
  475. {
  476. SCARDAPI_STUB_CALL_LONG(SCardListReadersWithDeviceInstanceIdW, hContext, szDeviceInstanceId,
  477. mszReaders, pcchReaders);
  478. }
  479. WINSCARDAPI LONG WINAPI SCardAudit(SCARDCONTEXT hContext, DWORD dwEvent)
  480. {
  481. SCARDAPI_STUB_CALL_LONG(SCardAudit, hContext, dwEvent);
  482. }
  483. /**
  484. * Extended API
  485. */
  486. WINSCARDAPI const char* WINAPI SCardGetErrorString(LONG errorCode)
  487. {
  488. switch (errorCode)
  489. {
  490. case SCARD_S_SUCCESS:
  491. return "SCARD_S_SUCCESS";
  492. case SCARD_F_INTERNAL_ERROR:
  493. return "SCARD_F_INTERNAL_ERROR";
  494. case SCARD_E_CANCELLED:
  495. return "SCARD_E_CANCELLED";
  496. case SCARD_E_INVALID_HANDLE:
  497. return "SCARD_E_INVALID_HANDLE";
  498. case SCARD_E_INVALID_PARAMETER:
  499. return "SCARD_E_INVALID_PARAMETER";
  500. case SCARD_E_INVALID_TARGET:
  501. return "SCARD_E_INVALID_TARGET";
  502. case SCARD_E_NO_MEMORY:
  503. return "SCARD_E_NO_MEMORY";
  504. case SCARD_F_WAITED_TOO_LONG:
  505. return "SCARD_F_WAITED_TOO_LONG";
  506. case SCARD_E_INSUFFICIENT_BUFFER:
  507. return "SCARD_E_INSUFFICIENT_BUFFER";
  508. case SCARD_E_UNKNOWN_READER:
  509. return "SCARD_E_UNKNOWN_READER";
  510. case SCARD_E_TIMEOUT:
  511. return "SCARD_E_TIMEOUT";
  512. case SCARD_E_SHARING_VIOLATION:
  513. return "SCARD_E_SHARING_VIOLATION";
  514. case SCARD_E_NO_SMARTCARD:
  515. return "SCARD_E_NO_SMARTCARD";
  516. case SCARD_E_UNKNOWN_CARD:
  517. return "SCARD_E_UNKNOWN_CARD";
  518. case SCARD_E_CANT_DISPOSE:
  519. return "SCARD_E_CANT_DISPOSE";
  520. case SCARD_E_PROTO_MISMATCH:
  521. return "SCARD_E_PROTO_MISMATCH";
  522. case SCARD_E_NOT_READY:
  523. return "SCARD_E_NOT_READY";
  524. case SCARD_E_INVALID_VALUE:
  525. return "SCARD_E_INVALID_VALUE";
  526. case SCARD_E_SYSTEM_CANCELLED:
  527. return "SCARD_E_SYSTEM_CANCELLED";
  528. case SCARD_F_COMM_ERROR:
  529. return "SCARD_F_COMM_ERROR";
  530. case SCARD_F_UNKNOWN_ERROR:
  531. return "SCARD_F_UNKNOWN_ERROR";
  532. case SCARD_E_INVALID_ATR:
  533. return "SCARD_E_INVALID_ATR";
  534. case SCARD_E_NOT_TRANSACTED:
  535. return "SCARD_E_NOT_TRANSACTED";
  536. case SCARD_E_READER_UNAVAILABLE:
  537. return "SCARD_E_READER_UNAVAILABLE";
  538. case SCARD_P_SHUTDOWN:
  539. return "SCARD_P_SHUTDOWN";
  540. case SCARD_E_PCI_TOO_SMALL:
  541. return "SCARD_E_PCI_TOO_SMALL";
  542. case SCARD_E_READER_UNSUPPORTED:
  543. return "SCARD_E_READER_UNSUPPORTED";
  544. case SCARD_E_DUPLICATE_READER:
  545. return "SCARD_E_DUPLICATE_READER";
  546. case SCARD_E_CARD_UNSUPPORTED:
  547. return "SCARD_E_CARD_UNSUPPORTED";
  548. case SCARD_E_NO_SERVICE:
  549. return "SCARD_E_NO_SERVICE";
  550. case SCARD_E_SERVICE_STOPPED:
  551. return "SCARD_E_SERVICE_STOPPED";
  552. case SCARD_E_UNEXPECTED:
  553. return "SCARD_E_UNEXPECTED";
  554. case SCARD_E_ICC_INSTALLATION:
  555. return "SCARD_E_ICC_INSTALLATION";
  556. case SCARD_E_ICC_CREATEORDER:
  557. return "SCARD_E_ICC_CREATEORDER";
  558. case SCARD_E_UNSUPPORTED_FEATURE:
  559. return "SCARD_E_UNSUPPORTED_FEATURE";
  560. case SCARD_E_DIR_NOT_FOUND:
  561. return "SCARD_E_DIR_NOT_FOUND";
  562. case SCARD_E_FILE_NOT_FOUND:
  563. return "SCARD_E_FILE_NOT_FOUND";
  564. case SCARD_E_NO_DIR:
  565. return "SCARD_E_NO_DIR";
  566. case SCARD_E_NO_FILE:
  567. return "SCARD_E_NO_FILE";
  568. case SCARD_E_NO_ACCESS:
  569. return "SCARD_E_NO_ACCESS";
  570. case SCARD_E_WRITE_TOO_MANY:
  571. return "SCARD_E_WRITE_TOO_MANY";
  572. case SCARD_E_BAD_SEEK:
  573. return "SCARD_E_BAD_SEEK";
  574. case SCARD_E_INVALID_CHV:
  575. return "SCARD_E_INVALID_CHV";
  576. case SCARD_E_UNKNOWN_RES_MNG:
  577. return "SCARD_E_UNKNOWN_RES_MNG";
  578. case SCARD_E_NO_SUCH_CERTIFICATE:
  579. return "SCARD_E_NO_SUCH_CERTIFICATE";
  580. case SCARD_E_CERTIFICATE_UNAVAILABLE:
  581. return "SCARD_E_CERTIFICATE_UNAVAILABLE";
  582. case SCARD_E_NO_READERS_AVAILABLE:
  583. return "SCARD_E_NO_READERS_AVAILABLE";
  584. case SCARD_E_COMM_DATA_LOST:
  585. return "SCARD_E_COMM_DATA_LOST";
  586. case SCARD_E_NO_KEY_CONTAINER:
  587. return "SCARD_E_NO_KEY_CONTAINER";
  588. case SCARD_E_SERVER_TOO_BUSY:
  589. return "SCARD_E_SERVER_TOO_BUSY";
  590. case SCARD_E_PIN_CACHE_EXPIRED:
  591. return "SCARD_E_PIN_CACHE_EXPIRED";
  592. case SCARD_E_NO_PIN_CACHE:
  593. return "SCARD_E_NO_PIN_CACHE";
  594. case SCARD_E_READ_ONLY_CARD:
  595. return "SCARD_E_READ_ONLY_CARD";
  596. case SCARD_W_UNSUPPORTED_CARD:
  597. return "SCARD_W_UNSUPPORTED_CARD";
  598. case SCARD_W_UNRESPONSIVE_CARD:
  599. return "SCARD_W_UNRESPONSIVE_CARD";
  600. case SCARD_W_UNPOWERED_CARD:
  601. return "SCARD_W_UNPOWERED_CARD";
  602. case SCARD_W_RESET_CARD:
  603. return "SCARD_W_RESET_CARD";
  604. case SCARD_W_REMOVED_CARD:
  605. return "SCARD_W_REMOVED_CARD";
  606. case SCARD_W_SECURITY_VIOLATION:
  607. return "SCARD_W_SECURITY_VIOLATION";
  608. case SCARD_W_WRONG_CHV:
  609. return "SCARD_W_WRONG_CHV";
  610. case SCARD_W_CHV_BLOCKED:
  611. return "SCARD_W_CHV_BLOCKED";
  612. case SCARD_W_EOF:
  613. return "SCARD_W_EOF";
  614. case SCARD_W_CANCELLED_BY_USER:
  615. return "SCARD_W_CANCELLED_BY_USER";
  616. case SCARD_W_CARD_NOT_AUTHENTICATED:
  617. return "SCARD_W_CARD_NOT_AUTHENTICATED";
  618. case SCARD_W_CACHE_ITEM_NOT_FOUND:
  619. return "SCARD_W_CACHE_ITEM_NOT_FOUND";
  620. case SCARD_W_CACHE_ITEM_STALE:
  621. return "SCARD_W_CACHE_ITEM_STALE";
  622. case SCARD_W_CACHE_ITEM_TOO_BIG:
  623. return "SCARD_W_CACHE_ITEM_TOO_BIG";
  624. default:
  625. return "SCARD_E_UNKNOWN";
  626. }
  627. }
  628. WINSCARDAPI const char* WINAPI SCardGetAttributeString(DWORD dwAttrId)
  629. {
  630. switch (dwAttrId)
  631. {
  632. case SCARD_ATTR_VENDOR_NAME:
  633. return "SCARD_ATTR_VENDOR_NAME";
  634. case SCARD_ATTR_VENDOR_IFD_TYPE:
  635. return "SCARD_ATTR_VENDOR_IFD_TYPE";
  636. case SCARD_ATTR_VENDOR_IFD_VERSION:
  637. return "SCARD_ATTR_VENDOR_IFD_VERSION";
  638. case SCARD_ATTR_VENDOR_IFD_SERIAL_NO:
  639. return "SCARD_ATTR_VENDOR_IFD_SERIAL_NO";
  640. case SCARD_ATTR_CHANNEL_ID:
  641. return "SCARD_ATTR_CHANNEL_ID";
  642. case SCARD_ATTR_PROTOCOL_TYPES:
  643. return "SCARD_ATTR_PROTOCOL_TYPES";
  644. case SCARD_ATTR_DEFAULT_CLK:
  645. return "SCARD_ATTR_DEFAULT_CLK";
  646. case SCARD_ATTR_MAX_CLK:
  647. return "SCARD_ATTR_MAX_CLK";
  648. case SCARD_ATTR_DEFAULT_DATA_RATE:
  649. return "SCARD_ATTR_DEFAULT_DATA_RATE";
  650. case SCARD_ATTR_MAX_DATA_RATE:
  651. return "SCARD_ATTR_MAX_DATA_RATE";
  652. case SCARD_ATTR_MAX_IFSD:
  653. return "SCARD_ATTR_MAX_IFSD";
  654. case SCARD_ATTR_POWER_MGMT_SUPPORT:
  655. return "SCARD_ATTR_POWER_MGMT_SUPPORT";
  656. case SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE:
  657. return "SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE";
  658. case SCARD_ATTR_USER_AUTH_INPUT_DEVICE:
  659. return "SCARD_ATTR_USER_AUTH_INPUT_DEVICE";
  660. case SCARD_ATTR_CHARACTERISTICS:
  661. return "SCARD_ATTR_CHARACTERISTICS";
  662. case SCARD_ATTR_CURRENT_PROTOCOL_TYPE:
  663. return "SCARD_ATTR_CURRENT_PROTOCOL_TYPE";
  664. case SCARD_ATTR_CURRENT_CLK:
  665. return "SCARD_ATTR_CURRENT_CLK";
  666. case SCARD_ATTR_CURRENT_F:
  667. return "SCARD_ATTR_CURRENT_F";
  668. case SCARD_ATTR_CURRENT_D:
  669. return "SCARD_ATTR_CURRENT_D";
  670. case SCARD_ATTR_CURRENT_N:
  671. return "SCARD_ATTR_CURRENT_N";
  672. case SCARD_ATTR_CURRENT_W:
  673. return "SCARD_ATTR_CURRENT_W";
  674. case SCARD_ATTR_CURRENT_IFSC:
  675. return "SCARD_ATTR_CURRENT_IFSC";
  676. case SCARD_ATTR_CURRENT_IFSD:
  677. return "SCARD_ATTR_CURRENT_IFSD";
  678. case SCARD_ATTR_CURRENT_BWT:
  679. return "SCARD_ATTR_CURRENT_BWT";
  680. case SCARD_ATTR_CURRENT_CWT:
  681. return "SCARD_ATTR_CURRENT_CWT";
  682. case SCARD_ATTR_CURRENT_EBC_ENCODING:
  683. return "SCARD_ATTR_CURRENT_EBC_ENCODING";
  684. case SCARD_ATTR_EXTENDED_BWT:
  685. return "SCARD_ATTR_EXTENDED_BWT";
  686. case SCARD_ATTR_ICC_PRESENCE:
  687. return "SCARD_ATTR_ICC_PRESENCE";
  688. case SCARD_ATTR_ICC_INTERFACE_STATUS:
  689. return "SCARD_ATTR_ICC_INTERFACE_STATUS";
  690. case SCARD_ATTR_CURRENT_IO_STATE:
  691. return "SCARD_ATTR_CURRENT_IO_STATE";
  692. case SCARD_ATTR_ATR_STRING:
  693. return "SCARD_ATTR_ATR_STRING";
  694. case SCARD_ATTR_ICC_TYPE_PER_ATR:
  695. return "SCARD_ATTR_ICC_TYPE_PER_ATR";
  696. case SCARD_ATTR_ESC_RESET:
  697. return "SCARD_ATTR_ESC_RESET";
  698. case SCARD_ATTR_ESC_CANCEL:
  699. return "SCARD_ATTR_ESC_CANCEL";
  700. case SCARD_ATTR_ESC_AUTHREQUEST:
  701. return "SCARD_ATTR_ESC_AUTHREQUEST";
  702. case SCARD_ATTR_MAXINPUT:
  703. return "SCARD_ATTR_MAXINPUT";
  704. case SCARD_ATTR_DEVICE_UNIT:
  705. return "SCARD_ATTR_DEVICE_UNIT";
  706. case SCARD_ATTR_DEVICE_IN_USE:
  707. return "SCARD_ATTR_DEVICE_IN_USE";
  708. case SCARD_ATTR_DEVICE_FRIENDLY_NAME_A:
  709. return "SCARD_ATTR_DEVICE_FRIENDLY_NAME_A";
  710. case SCARD_ATTR_DEVICE_SYSTEM_NAME_A:
  711. return "SCARD_ATTR_DEVICE_SYSTEM_NAME_A";
  712. case SCARD_ATTR_DEVICE_FRIENDLY_NAME_W:
  713. return "SCARD_ATTR_DEVICE_FRIENDLY_NAME_W";
  714. case SCARD_ATTR_DEVICE_SYSTEM_NAME_W:
  715. return "SCARD_ATTR_DEVICE_SYSTEM_NAME_W";
  716. case SCARD_ATTR_SUPRESS_T1_IFS_REQUEST:
  717. return "SCARD_ATTR_SUPRESS_T1_IFS_REQUEST";
  718. default:
  719. return "SCARD_ATTR_UNKNOWN";
  720. }
  721. }
  722. WINSCARDAPI const char* WINAPI SCardGetProtocolString(DWORD dwProtocols)
  723. {
  724. if (dwProtocols == SCARD_PROTOCOL_UNDEFINED)
  725. return "SCARD_PROTOCOL_UNDEFINED";
  726. if (dwProtocols == SCARD_PROTOCOL_T0)
  727. return "SCARD_PROTOCOL_T0";
  728. if (dwProtocols == SCARD_PROTOCOL_T1)
  729. return "SCARD_PROTOCOL_T1";
  730. if (dwProtocols == SCARD_PROTOCOL_Tx)
  731. return "SCARD_PROTOCOL_Tx";
  732. if (dwProtocols == SCARD_PROTOCOL_RAW)
  733. return "SCARD_PROTOCOL_RAW";
  734. if (dwProtocols == SCARD_PROTOCOL_DEFAULT)
  735. return "SCARD_PROTOCOL_DEFAULT";
  736. if (dwProtocols == (SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_RAW))
  737. return "SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_RAW";
  738. if (dwProtocols == (SCARD_PROTOCOL_T1 | SCARD_PROTOCOL_RAW))
  739. return "SCARD_PROTOCOL_T1 | SCARD_PROTOCOL_RAW";
  740. if (dwProtocols == (SCARD_PROTOCOL_Tx | SCARD_PROTOCOL_RAW))
  741. return "SCARD_PROTOCOL_Tx | SCARD_PROTOCOL_RAW";
  742. return "SCARD_PROTOCOL_UNKNOWN";
  743. }
  744. WINSCARDAPI const char* WINAPI SCardGetShareModeString(DWORD dwShareMode)
  745. {
  746. switch (dwShareMode)
  747. {
  748. case SCARD_SHARE_EXCLUSIVE:
  749. return "SCARD_SHARE_EXCLUSIVE";
  750. case SCARD_SHARE_SHARED:
  751. return "SCARD_SHARE_SHARED";
  752. case SCARD_SHARE_DIRECT:
  753. return "SCARD_SHARE_DIRECT";
  754. default:
  755. return "SCARD_SHARE_UNKNOWN";
  756. }
  757. }
  758. WINSCARDAPI const char* WINAPI SCardGetDispositionString(DWORD dwDisposition)
  759. {
  760. switch (dwDisposition)
  761. {
  762. case SCARD_LEAVE_CARD:
  763. return "SCARD_LEAVE_CARD";
  764. case SCARD_RESET_CARD:
  765. return "SCARD_RESET_CARD";
  766. case SCARD_UNPOWER_CARD:
  767. return "SCARD_UNPOWER_CARD";
  768. default:
  769. return "SCARD_UNKNOWN_CARD";
  770. }
  771. }
  772. WINSCARDAPI const char* WINAPI SCardGetScopeString(DWORD dwScope)
  773. {
  774. switch (dwScope)
  775. {
  776. case SCARD_SCOPE_USER:
  777. return "SCARD_SCOPE_USER";
  778. case SCARD_SCOPE_TERMINAL:
  779. return "SCARD_SCOPE_TERMINAL";
  780. case SCARD_SCOPE_SYSTEM:
  781. return "SCARD_SCOPE_SYSTEM";
  782. default:
  783. return "SCARD_SCOPE_UNKNOWN";
  784. }
  785. }
  786. WINSCARDAPI const char* WINAPI SCardGetCardStateString(DWORD dwCardState)
  787. {
  788. switch (dwCardState)
  789. {
  790. case SCARD_UNKNOWN:
  791. return "SCARD_UNKNOWN";
  792. case SCARD_ABSENT:
  793. return "SCARD_ABSENT";
  794. case SCARD_PRESENT:
  795. return "SCARD_PRESENT";
  796. case SCARD_SWALLOWED:
  797. return "SCARD_SWALLOWED";
  798. case SCARD_POWERED:
  799. return "SCARD_POWERED";
  800. case SCARD_NEGOTIABLE:
  801. return "SCARD_NEGOTIABLE";
  802. case SCARD_SPECIFIC:
  803. return "SCARD_SPECIFIC";
  804. default:
  805. return "SCARD_UNKNOWN";
  806. }
  807. }
  808. WINSCARDAPI char* WINAPI SCardGetReaderStateString(DWORD dwReaderState)
  809. {
  810. char* szReaderState = malloc(512);
  811. if (!szReaderState)
  812. return NULL;
  813. szReaderState[0] = '\0';
  814. if (dwReaderState & SCARD_STATE_IGNORE)
  815. {
  816. if (szReaderState[0])
  817. strcat(szReaderState, " | ");
  818. strcat(szReaderState, "SCARD_STATE_IGNORE");
  819. }
  820. if (dwReaderState & SCARD_STATE_CHANGED)
  821. {
  822. if (szReaderState[0])
  823. strcat(szReaderState, " | ");
  824. strcat(szReaderState, "SCARD_STATE_CHANGED");
  825. }
  826. if (dwReaderState & SCARD_STATE_UNKNOWN)
  827. {
  828. if (szReaderState[0])
  829. strcat(szReaderState, " | ");
  830. strcat(szReaderState, "SCARD_STATE_UNKNOWN");
  831. }
  832. if (dwReaderState & SCARD_STATE_UNAVAILABLE)
  833. {
  834. if (szReaderState[0])
  835. strcat(szReaderState, " | ");
  836. strcat(szReaderState, "SCARD_STATE_UNAVAILABLE");
  837. }
  838. if (dwReaderState & SCARD_STATE_EMPTY)
  839. {
  840. if (szReaderState[0])
  841. strcat(szReaderState, " | ");
  842. strcat(szReaderState, "SCARD_STATE_EMPTY");
  843. }
  844. if (dwReaderState & SCARD_STATE_PRESENT)
  845. {
  846. if (szReaderState[0])
  847. strcat(szReaderState, " | ");
  848. strcat(szReaderState, "SCARD_STATE_PRESENT");
  849. }
  850. if (dwReaderState & SCARD_STATE_ATRMATCH)
  851. {
  852. if (szReaderState[0])
  853. strcat(szReaderState, " | ");
  854. strcat(szReaderState, "SCARD_STATE_ATRMATCH");
  855. }
  856. if (dwReaderState & SCARD_STATE_EXCLUSIVE)
  857. {
  858. if (szReaderState[0])
  859. strcat(szReaderState, " | ");
  860. strcat(szReaderState, "SCARD_STATE_EXCLUSIVE");
  861. }
  862. if (dwReaderState & SCARD_STATE_INUSE)
  863. {
  864. if (szReaderState[0])
  865. strcat(szReaderState, " | ");
  866. strcat(szReaderState, "SCARD_STATE_INUSE");
  867. }
  868. if (dwReaderState & SCARD_STATE_MUTE)
  869. {
  870. if (szReaderState[0])
  871. strcat(szReaderState, " | ");
  872. strcat(szReaderState, "SCARD_STATE_MUTE");
  873. }
  874. if (dwReaderState & SCARD_STATE_UNPOWERED)
  875. {
  876. if (szReaderState[0])
  877. strcat(szReaderState, " | ");
  878. strcat(szReaderState, "SCARD_STATE_UNPOWERED");
  879. }
  880. if (!szReaderState[0])
  881. strcat(szReaderState, "SCARD_STATE_UNAWARE");
  882. return szReaderState;
  883. }