/src/FreeRDP/winpr/libwinpr/smartcard/smartcard.c
Line | Count | Source |
1 | | /** |
2 | | * WinPR: Windows Portable Runtime |
3 | | * Smart Card API |
4 | | * |
5 | | * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com> |
6 | | * Copyright 2020 Armin Novak <armin.novak@thincast.com> |
7 | | * Copyright 2020 Thincast Technologies GmbH |
8 | | * |
9 | | * Licensed under the Apache License, Version 2.0 (the "License"); |
10 | | * you may not use this file except in compliance with the License. |
11 | | * You may obtain a copy of the License at |
12 | | * |
13 | | * http://www.apache.org/licenses/LICENSE-2.0 |
14 | | * |
15 | | * Unless required by applicable law or agreed to in writing, software |
16 | | * distributed under the License is distributed on an "AS IS" BASIS, |
17 | | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
18 | | * See the License for the specific language governing permissions and |
19 | | * limitations under the License. |
20 | | */ |
21 | | |
22 | | #include <winpr/config.h> |
23 | | |
24 | | #include <winpr/crt.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> |
30 | | |
31 | | #include "../log.h" |
32 | | |
33 | | #include "smartcard.h" |
34 | | |
35 | | #if defined(WITH_SMARTCARD_INSPECT) |
36 | | #include "smartcard_inspect.h" |
37 | | #endif |
38 | | |
39 | | static INIT_ONCE g_Initialized = INIT_ONCE_STATIC_INIT; |
40 | | static const SCardApiFunctionTable* g_SCardApi = nullptr; |
41 | | |
42 | | #define TAG WINPR_TAG("smartcard") |
43 | | |
44 | | #define xstr(s) str(s) |
45 | | #define str(s) #s |
46 | | |
47 | | #define SCARDAPI_STUB_CALL_LONG(_name, ...) \ |
48 | 0 | if (!InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, nullptr, nullptr)) \ |
49 | 0 | return SCARD_E_NO_SERVICE; \ |
50 | 0 | if (!g_SCardApi || !g_SCardApi->pfn##_name) \ |
51 | 0 | { \ |
52 | 0 | const void* inst = WINPR_CXX_COMPAT_CAST(const void*, g_SCardApi); \ |
53 | 0 | SCardApiFunctionTable* sc = WINPR_CAST_CONST_PTR_AWAY(g_SCardApi, SCardApiFunctionTable*); \ |
54 | 0 | const void* fkt = nullptr; \ |
55 | 0 | if (inst) \ |
56 | 0 | fkt = WINPR_FUNC_PTR_CAST(sc->pfn##_name, const void*); \ |
57 | 0 | \ |
58 | 0 | WLog_DBG(TAG, "Missing function pointer g_SCardApi=%p->" xstr(pfn##_name) "=%p", inst, \ |
59 | 0 | fkt); \ |
60 | 0 | return SCARD_E_NO_SERVICE; \ |
61 | 0 | } \ |
62 | 0 | return g_SCardApi->pfn##_name(__VA_ARGS__) |
63 | | |
64 | | #define SCARDAPI_STUB_CALL_HANDLE(_name) \ |
65 | 0 | if (!InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, nullptr, nullptr)) \ |
66 | 0 | return nullptr; \ |
67 | 0 | if (!g_SCardApi || !g_SCardApi->pfn##_name) \ |
68 | 0 | { \ |
69 | 0 | const void* inst = WINPR_CXX_COMPAT_CAST(const void*, g_SCardApi); \ |
70 | 0 | SCardApiFunctionTable* sc = WINPR_CAST_CONST_PTR_AWAY(g_SCardApi, SCardApiFunctionTable*); \ |
71 | 0 | const void* fkt = nullptr; \ |
72 | 0 | if (inst) \ |
73 | 0 | fkt = WINPR_FUNC_PTR_CAST(sc->pfn##_name, const void*); \ |
74 | 0 | \ |
75 | 0 | WLog_DBG(TAG, "Missing function pointer g_SCardApi=%p->" xstr(pfn##_name) "=%p", inst, \ |
76 | 0 | fkt); \ |
77 | 0 | return nullptr; \ |
78 | 0 | } \ |
79 | 0 | return g_SCardApi->pfn##_name() |
80 | | |
81 | | #define SCARDAPI_STUB_CALL_VOID(_name) \ |
82 | 0 | if (!InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, nullptr, nullptr)) \ |
83 | 0 | return; \ |
84 | 0 | if (!g_SCardApi || !g_SCardApi->pfn##_name) \ |
85 | 0 | { \ |
86 | 0 | const void* inst = WINPR_CXX_COMPAT_CAST(const void*, g_SCardApi); \ |
87 | 0 | SCardApiFunctionTable* sc = WINPR_CAST_CONST_PTR_AWAY(g_SCardApi, SCardApiFunctionTable*); \ |
88 | 0 | const void* fkt = nullptr; \ |
89 | 0 | if (inst) \ |
90 | 0 | fkt = WINPR_FUNC_PTR_CAST(sc->pfn##_name, const void*); \ |
91 | 0 | \ |
92 | 0 | WLog_DBG(TAG, "Missing function pointer g_SCardApi=%p->" xstr(pfn##_name) "=%p", inst, \ |
93 | 0 | fkt); \ |
94 | 0 | return; \ |
95 | 0 | } \ |
96 | 0 | g_SCardApi->pfn##_name() |
97 | | |
98 | | /** |
99 | | * Standard Windows Smart Card API |
100 | | */ |
101 | | |
102 | | const SCARD_IO_REQUEST g_rgSCardT0Pci = { SCARD_PROTOCOL_T0, 8 }; |
103 | | const SCARD_IO_REQUEST g_rgSCardT1Pci = { SCARD_PROTOCOL_T1, 8 }; |
104 | | const SCARD_IO_REQUEST g_rgSCardRawPci = { SCARD_PROTOCOL_RAW, 8 }; |
105 | | |
106 | | static BOOL CALLBACK InitializeSCardApiStubs(WINPR_ATTR_UNUSED PINIT_ONCE once, |
107 | | WINPR_ATTR_UNUSED PVOID param, |
108 | | WINPR_ATTR_UNUSED PVOID* context) |
109 | 0 | { |
110 | | #ifdef _WIN32 |
111 | | if (Windows_InitializeSCardApi() >= 0) |
112 | | g_SCardApi = Windows_GetSCardApiFunctionTable(); |
113 | | #else |
114 | 0 | #if defined(WITH_SMARTCARD_PCSC) |
115 | 0 | if (PCSC_InitializeSCardApi() >= 0) |
116 | 0 | g_SCardApi = PCSC_GetSCardApiFunctionTable(); |
117 | 0 | #endif |
118 | 0 | #endif |
119 | |
|
120 | | #if defined(WITH_SMARTCARD_INSPECT) |
121 | | g_SCardApi = Inspect_RegisterSCardApi(g_SCardApi); |
122 | | #endif |
123 | 0 | return TRUE; |
124 | 0 | } |
125 | | |
126 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardEstablishContext(DWORD dwScope, |
127 | | LPCVOID pvReserved1, |
128 | | LPCVOID pvReserved2, |
129 | | LPSCARDCONTEXT phContext) |
130 | 0 | { |
131 | 0 | SCARDAPI_STUB_CALL_LONG(SCardEstablishContext, dwScope, pvReserved1, pvReserved2, phContext); |
132 | 0 | } |
133 | | |
134 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardReleaseContext(SCARDCONTEXT hContext) |
135 | 0 | { |
136 | 0 | SCARDAPI_STUB_CALL_LONG(SCardReleaseContext, hContext); |
137 | 0 | } |
138 | | |
139 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardIsValidContext(SCARDCONTEXT hContext) |
140 | 0 | { |
141 | 0 | SCARDAPI_STUB_CALL_LONG(SCardIsValidContext, hContext); |
142 | 0 | } |
143 | | |
144 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardListReaderGroupsA(SCARDCONTEXT hContext, |
145 | | LPSTR mszGroups, |
146 | | LPDWORD pcchGroups) |
147 | 0 | { |
148 | 0 | SCARDAPI_STUB_CALL_LONG(SCardListReaderGroupsA, hContext, mszGroups, pcchGroups); |
149 | 0 | } |
150 | | |
151 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardListReaderGroupsW(SCARDCONTEXT hContext, |
152 | | LPWSTR mszGroups, |
153 | | LPDWORD pcchGroups) |
154 | 0 | { |
155 | 0 | SCARDAPI_STUB_CALL_LONG(SCardListReaderGroupsW, hContext, mszGroups, pcchGroups); |
156 | 0 | } |
157 | | |
158 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardListReadersA(SCARDCONTEXT hContext, |
159 | | LPCSTR mszGroups, LPSTR mszReaders, |
160 | | LPDWORD pcchReaders) |
161 | 0 | { |
162 | 0 | SCARDAPI_STUB_CALL_LONG(SCardListReadersA, hContext, mszGroups, mszReaders, pcchReaders); |
163 | 0 | } |
164 | | |
165 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardListReadersW(SCARDCONTEXT hContext, |
166 | | LPCWSTR mszGroups, LPWSTR mszReaders, |
167 | | LPDWORD pcchReaders) |
168 | 0 | { |
169 | 0 | SCARDAPI_STUB_CALL_LONG(SCardListReadersW, hContext, mszGroups, mszReaders, pcchReaders); |
170 | 0 | } |
171 | | |
172 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardListCardsA(SCARDCONTEXT hContext, LPCBYTE pbAtr, |
173 | | LPCGUID rgquidInterfaces, |
174 | | DWORD cguidInterfaceCount, |
175 | | CHAR* mszCards, LPDWORD pcchCards) |
176 | 0 | { |
177 | 0 | SCARDAPI_STUB_CALL_LONG(SCardListCardsA, hContext, pbAtr, rgquidInterfaces, cguidInterfaceCount, |
178 | 0 | mszCards, pcchCards); |
179 | 0 | } |
180 | | |
181 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardListCardsW(SCARDCONTEXT hContext, LPCBYTE pbAtr, |
182 | | LPCGUID rgquidInterfaces, |
183 | | DWORD cguidInterfaceCount, |
184 | | WCHAR* mszCards, LPDWORD pcchCards) |
185 | 0 | { |
186 | 0 | SCARDAPI_STUB_CALL_LONG(SCardListCardsW, hContext, pbAtr, rgquidInterfaces, cguidInterfaceCount, |
187 | 0 | mszCards, pcchCards); |
188 | 0 | } |
189 | | |
190 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardListInterfacesA(SCARDCONTEXT hContext, |
191 | | LPCSTR szCard, |
192 | | LPGUID pguidInterfaces, |
193 | | LPDWORD pcguidInterfaces) |
194 | 0 | { |
195 | 0 | SCARDAPI_STUB_CALL_LONG(SCardListInterfacesA, hContext, szCard, pguidInterfaces, |
196 | 0 | pcguidInterfaces); |
197 | 0 | } |
198 | | |
199 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardListInterfacesW(SCARDCONTEXT hContext, |
200 | | LPCWSTR szCard, |
201 | | LPGUID pguidInterfaces, |
202 | | LPDWORD pcguidInterfaces) |
203 | 0 | { |
204 | 0 | SCARDAPI_STUB_CALL_LONG(SCardListInterfacesW, hContext, szCard, pguidInterfaces, |
205 | 0 | pcguidInterfaces); |
206 | 0 | } |
207 | | |
208 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardGetProviderIdA(SCARDCONTEXT hContext, |
209 | | LPCSTR szCard, |
210 | | LPGUID pguidProviderId) |
211 | 0 | { |
212 | 0 | SCARDAPI_STUB_CALL_LONG(SCardGetProviderIdA, hContext, szCard, pguidProviderId); |
213 | 0 | } |
214 | | |
215 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardGetProviderIdW(SCARDCONTEXT hContext, |
216 | | LPCWSTR szCard, |
217 | | LPGUID pguidProviderId) |
218 | 0 | { |
219 | 0 | SCARDAPI_STUB_CALL_LONG(SCardGetProviderIdW, hContext, szCard, pguidProviderId); |
220 | 0 | } |
221 | | |
222 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardGetCardTypeProviderNameA(SCARDCONTEXT hContext, |
223 | | LPCSTR szCardName, |
224 | | DWORD dwProviderId, |
225 | | CHAR* szProvider, |
226 | | LPDWORD pcchProvider) |
227 | 0 | { |
228 | 0 | SCARDAPI_STUB_CALL_LONG(SCardGetCardTypeProviderNameA, hContext, szCardName, dwProviderId, |
229 | 0 | szProvider, pcchProvider); |
230 | 0 | } |
231 | | |
232 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardGetCardTypeProviderNameW(SCARDCONTEXT hContext, |
233 | | LPCWSTR szCardName, |
234 | | DWORD dwProviderId, |
235 | | WCHAR* szProvider, |
236 | | LPDWORD pcchProvider) |
237 | 0 | { |
238 | 0 | SCARDAPI_STUB_CALL_LONG(SCardGetCardTypeProviderNameW, hContext, szCardName, dwProviderId, |
239 | 0 | szProvider, pcchProvider); |
240 | 0 | } |
241 | | |
242 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardIntroduceReaderGroupA(SCARDCONTEXT hContext, |
243 | | LPCSTR szGroupName) |
244 | 0 | { |
245 | 0 | SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderGroupA, hContext, szGroupName); |
246 | 0 | } |
247 | | |
248 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardIntroduceReaderGroupW(SCARDCONTEXT hContext, |
249 | | LPCWSTR szGroupName) |
250 | 0 | { |
251 | 0 | SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderGroupW, hContext, szGroupName); |
252 | 0 | } |
253 | | |
254 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardForgetReaderGroupA(SCARDCONTEXT hContext, |
255 | | LPCSTR szGroupName) |
256 | 0 | { |
257 | 0 | SCARDAPI_STUB_CALL_LONG(SCardForgetReaderGroupA, hContext, szGroupName); |
258 | 0 | } |
259 | | |
260 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardForgetReaderGroupW(SCARDCONTEXT hContext, |
261 | | LPCWSTR szGroupName) |
262 | 0 | { |
263 | 0 | SCARDAPI_STUB_CALL_LONG(SCardForgetReaderGroupW, hContext, szGroupName); |
264 | 0 | } |
265 | | |
266 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardIntroduceReaderA(SCARDCONTEXT hContext, |
267 | | LPCSTR szReaderName, |
268 | | LPCSTR szDeviceName) |
269 | 0 | { |
270 | 0 | SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderA, hContext, szReaderName, szDeviceName); |
271 | 0 | } |
272 | | |
273 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardIntroduceReaderW(SCARDCONTEXT hContext, |
274 | | LPCWSTR szReaderName, |
275 | | LPCWSTR szDeviceName) |
276 | 0 | { |
277 | 0 | SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderW, hContext, szReaderName, szDeviceName); |
278 | 0 | } |
279 | | |
280 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardForgetReaderA(SCARDCONTEXT hContext, |
281 | | LPCSTR szReaderName) |
282 | 0 | { |
283 | 0 | SCARDAPI_STUB_CALL_LONG(SCardForgetReaderA, hContext, szReaderName); |
284 | 0 | } |
285 | | |
286 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardForgetReaderW(SCARDCONTEXT hContext, |
287 | | LPCWSTR szReaderName) |
288 | 0 | { |
289 | 0 | SCARDAPI_STUB_CALL_LONG(SCardForgetReaderW, hContext, szReaderName); |
290 | 0 | } |
291 | | |
292 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardAddReaderToGroupA(SCARDCONTEXT hContext, |
293 | | LPCSTR szReaderName, |
294 | | LPCSTR szGroupName) |
295 | 0 | { |
296 | 0 | SCARDAPI_STUB_CALL_LONG(SCardAddReaderToGroupA, hContext, szReaderName, szGroupName); |
297 | 0 | } |
298 | | |
299 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardAddReaderToGroupW(SCARDCONTEXT hContext, |
300 | | LPCWSTR szReaderName, |
301 | | LPCWSTR szGroupName) |
302 | 0 | { |
303 | 0 | SCARDAPI_STUB_CALL_LONG(SCardAddReaderToGroupW, hContext, szReaderName, szGroupName); |
304 | 0 | } |
305 | | |
306 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardRemoveReaderFromGroupA(SCARDCONTEXT hContext, |
307 | | LPCSTR szReaderName, |
308 | | LPCSTR szGroupName) |
309 | 0 | { |
310 | 0 | SCARDAPI_STUB_CALL_LONG(SCardRemoveReaderFromGroupA, hContext, szReaderName, szGroupName); |
311 | 0 | } |
312 | | |
313 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardRemoveReaderFromGroupW(SCARDCONTEXT hContext, |
314 | | LPCWSTR szReaderName, |
315 | | LPCWSTR szGroupName) |
316 | 0 | { |
317 | 0 | SCARDAPI_STUB_CALL_LONG(SCardRemoveReaderFromGroupW, hContext, szReaderName, szGroupName); |
318 | 0 | } |
319 | | |
320 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI |
321 | | SCardIntroduceCardTypeA(SCARDCONTEXT hContext, LPCSTR szCardName, LPCGUID pguidPrimaryProvider, |
322 | | LPCGUID rgguidInterfaces, DWORD dwInterfaceCount, LPCBYTE pbAtr, |
323 | | LPCBYTE pbAtrMask, DWORD cbAtrLen) |
324 | 0 | { |
325 | 0 | SCARDAPI_STUB_CALL_LONG(SCardIntroduceCardTypeA, hContext, szCardName, pguidPrimaryProvider, |
326 | 0 | rgguidInterfaces, dwInterfaceCount, pbAtr, pbAtrMask, cbAtrLen); |
327 | 0 | } |
328 | | |
329 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI |
330 | | SCardIntroduceCardTypeW(SCARDCONTEXT hContext, LPCWSTR szCardName, LPCGUID pguidPrimaryProvider, |
331 | | LPCGUID rgguidInterfaces, DWORD dwInterfaceCount, LPCBYTE pbAtr, |
332 | | LPCBYTE pbAtrMask, DWORD cbAtrLen) |
333 | 0 | { |
334 | 0 | SCARDAPI_STUB_CALL_LONG(SCardIntroduceCardTypeW, hContext, szCardName, pguidPrimaryProvider, |
335 | 0 | rgguidInterfaces, dwInterfaceCount, pbAtr, pbAtrMask, cbAtrLen); |
336 | 0 | } |
337 | | |
338 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardSetCardTypeProviderNameA(SCARDCONTEXT hContext, |
339 | | LPCSTR szCardName, |
340 | | DWORD dwProviderId, |
341 | | LPCSTR szProvider) |
342 | 0 | { |
343 | 0 | SCARDAPI_STUB_CALL_LONG(SCardSetCardTypeProviderNameA, hContext, szCardName, dwProviderId, |
344 | 0 | szProvider); |
345 | 0 | } |
346 | | |
347 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardSetCardTypeProviderNameW(SCARDCONTEXT hContext, |
348 | | LPCWSTR szCardName, |
349 | | DWORD dwProviderId, |
350 | | LPCWSTR szProvider) |
351 | 0 | { |
352 | 0 | SCARDAPI_STUB_CALL_LONG(SCardSetCardTypeProviderNameW, hContext, szCardName, dwProviderId, |
353 | 0 | szProvider); |
354 | 0 | } |
355 | | |
356 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardForgetCardTypeA(SCARDCONTEXT hContext, |
357 | | LPCSTR szCardName) |
358 | 0 | { |
359 | 0 | SCARDAPI_STUB_CALL_LONG(SCardForgetCardTypeA, hContext, szCardName); |
360 | 0 | } |
361 | | |
362 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardForgetCardTypeW(SCARDCONTEXT hContext, |
363 | | LPCWSTR szCardName) |
364 | 0 | { |
365 | 0 | SCARDAPI_STUB_CALL_LONG(SCardForgetCardTypeW, hContext, szCardName); |
366 | 0 | } |
367 | | |
368 | | WINSCARDAPI LONG WINAPI SCardFreeMemory(SCARDCONTEXT hContext, LPVOID pvMem) |
369 | 0 | { |
370 | 0 | SCARDAPI_STUB_CALL_LONG(SCardFreeMemory, hContext, pvMem); |
371 | 0 | } |
372 | | |
373 | | WINSCARDAPI HANDLE WINAPI SCardAccessStartedEvent(void) |
374 | 0 | { |
375 | 0 | SCARDAPI_STUB_CALL_HANDLE(SCardAccessStartedEvent); |
376 | 0 | } |
377 | | |
378 | | WINSCARDAPI void WINAPI SCardReleaseStartedEvent(void) |
379 | 0 | { |
380 | 0 | SCARDAPI_STUB_CALL_VOID(SCardReleaseStartedEvent); |
381 | 0 | } |
382 | | |
383 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardLocateCardsA(SCARDCONTEXT hContext, |
384 | | LPCSTR mszCards, |
385 | | LPSCARD_READERSTATEA rgReaderStates, |
386 | | DWORD cReaders) |
387 | 0 | { |
388 | 0 | SCARDAPI_STUB_CALL_LONG(SCardLocateCardsA, hContext, mszCards, rgReaderStates, cReaders); |
389 | 0 | } |
390 | | |
391 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardLocateCardsW(SCARDCONTEXT hContext, |
392 | | LPCWSTR mszCards, |
393 | | LPSCARD_READERSTATEW rgReaderStates, |
394 | | DWORD cReaders) |
395 | 0 | { |
396 | 0 | SCARDAPI_STUB_CALL_LONG(SCardLocateCardsW, hContext, mszCards, rgReaderStates, cReaders); |
397 | 0 | } |
398 | | |
399 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI |
400 | | SCardLocateCardsByATRA(SCARDCONTEXT hContext, LPSCARD_ATRMASK rgAtrMasks, DWORD cAtrs, |
401 | | LPSCARD_READERSTATEA rgReaderStates, DWORD cReaders) |
402 | 0 | { |
403 | 0 | SCARDAPI_STUB_CALL_LONG(SCardLocateCardsByATRA, hContext, rgAtrMasks, cAtrs, rgReaderStates, |
404 | 0 | cReaders); |
405 | 0 | } |
406 | | |
407 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI |
408 | | SCardLocateCardsByATRW(SCARDCONTEXT hContext, LPSCARD_ATRMASK rgAtrMasks, DWORD cAtrs, |
409 | | LPSCARD_READERSTATEW rgReaderStates, DWORD cReaders) |
410 | 0 | { |
411 | 0 | SCARDAPI_STUB_CALL_LONG(SCardLocateCardsByATRW, hContext, rgAtrMasks, cAtrs, rgReaderStates, |
412 | 0 | cReaders); |
413 | 0 | } |
414 | | |
415 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardGetStatusChangeA( |
416 | | SCARDCONTEXT hContext, DWORD dwTimeout, LPSCARD_READERSTATEA rgReaderStates, DWORD cReaders) |
417 | 0 | { |
418 | 0 | SCARDAPI_STUB_CALL_LONG(SCardGetStatusChangeA, hContext, dwTimeout, rgReaderStates, cReaders); |
419 | 0 | } |
420 | | |
421 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardGetStatusChangeW( |
422 | | SCARDCONTEXT hContext, DWORD dwTimeout, LPSCARD_READERSTATEW rgReaderStates, DWORD cReaders) |
423 | 0 | { |
424 | 0 | SCARDAPI_STUB_CALL_LONG(SCardGetStatusChangeW, hContext, dwTimeout, rgReaderStates, cReaders); |
425 | 0 | } |
426 | | |
427 | | WINSCARDAPI LONG WINAPI SCardCancel(SCARDCONTEXT hContext) |
428 | 0 | { |
429 | 0 | SCARDAPI_STUB_CALL_LONG(SCardCancel, hContext); |
430 | 0 | } |
431 | | |
432 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardConnectA(SCARDCONTEXT hContext, LPCSTR szReader, |
433 | | DWORD dwShareMode, |
434 | | DWORD dwPreferredProtocols, |
435 | | LPSCARDHANDLE phCard, |
436 | | LPDWORD pdwActiveProtocol) |
437 | 0 | { |
438 | 0 | SCARDAPI_STUB_CALL_LONG(SCardConnectA, hContext, szReader, dwShareMode, dwPreferredProtocols, |
439 | 0 | phCard, pdwActiveProtocol); |
440 | 0 | } |
441 | | |
442 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardConnectW(SCARDCONTEXT hContext, LPCWSTR szReader, |
443 | | DWORD dwShareMode, |
444 | | DWORD dwPreferredProtocols, |
445 | | LPSCARDHANDLE phCard, |
446 | | LPDWORD pdwActiveProtocol) |
447 | 0 | { |
448 | 0 | SCARDAPI_STUB_CALL_LONG(SCardConnectW, hContext, szReader, dwShareMode, dwPreferredProtocols, |
449 | 0 | phCard, pdwActiveProtocol); |
450 | 0 | } |
451 | | |
452 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardReconnect(SCARDHANDLE hCard, DWORD dwShareMode, |
453 | | DWORD dwPreferredProtocols, |
454 | | DWORD dwInitialization, |
455 | | LPDWORD pdwActiveProtocol) |
456 | 0 | { |
457 | 0 | SCARDAPI_STUB_CALL_LONG(SCardReconnect, hCard, dwShareMode, dwPreferredProtocols, |
458 | 0 | dwInitialization, pdwActiveProtocol); |
459 | 0 | } |
460 | | |
461 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardDisconnect(SCARDHANDLE hCard, DWORD dwDisposition) |
462 | 0 | { |
463 | 0 | SCARDAPI_STUB_CALL_LONG(SCardDisconnect, hCard, dwDisposition); |
464 | 0 | } |
465 | | |
466 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardBeginTransaction(SCARDHANDLE hCard) |
467 | 0 | { |
468 | 0 | SCARDAPI_STUB_CALL_LONG(SCardBeginTransaction, hCard); |
469 | 0 | } |
470 | | |
471 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardEndTransaction(SCARDHANDLE hCard, |
472 | | DWORD dwDisposition) |
473 | 0 | { |
474 | 0 | SCARDAPI_STUB_CALL_LONG(SCardEndTransaction, hCard, dwDisposition); |
475 | 0 | } |
476 | | |
477 | | WINSCARDAPI LONG WINAPI SCardCancelTransaction(SCARDHANDLE hCard) |
478 | 0 | { |
479 | 0 | SCARDAPI_STUB_CALL_LONG(SCardCancelTransaction, hCard); |
480 | 0 | } |
481 | | |
482 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardState(SCARDHANDLE hCard, LPDWORD pdwState, |
483 | | LPDWORD pdwProtocol, LPBYTE pbAtr, |
484 | | LPDWORD pcbAtrLen) |
485 | 0 | { |
486 | 0 | SCARDAPI_STUB_CALL_LONG(SCardState, hCard, pdwState, pdwProtocol, pbAtr, pcbAtrLen); |
487 | 0 | } |
488 | | |
489 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardStatusA(SCARDHANDLE hCard, LPSTR mszReaderNames, |
490 | | LPDWORD pcchReaderLen, LPDWORD pdwState, |
491 | | LPDWORD pdwProtocol, LPBYTE pbAtr, |
492 | | LPDWORD pcbAtrLen) |
493 | 0 | { |
494 | 0 | SCARDAPI_STUB_CALL_LONG(SCardStatusA, hCard, mszReaderNames, pcchReaderLen, pdwState, |
495 | 0 | pdwProtocol, pbAtr, pcbAtrLen); |
496 | 0 | } |
497 | | |
498 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardStatusW(SCARDHANDLE hCard, LPWSTR mszReaderNames, |
499 | | LPDWORD pcchReaderLen, LPDWORD pdwState, |
500 | | LPDWORD pdwProtocol, LPBYTE pbAtr, |
501 | | LPDWORD pcbAtrLen) |
502 | 0 | { |
503 | 0 | SCARDAPI_STUB_CALL_LONG(SCardStatusW, hCard, mszReaderNames, pcchReaderLen, pdwState, |
504 | 0 | pdwProtocol, pbAtr, pcbAtrLen); |
505 | 0 | } |
506 | | |
507 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardTransmit( |
508 | | SCARDHANDLE hCard, LPCSCARD_IO_REQUEST pioSendPci, LPCBYTE pbSendBuffer, DWORD cbSendLength, |
509 | | LPSCARD_IO_REQUEST pioRecvPci, LPBYTE pbRecvBuffer, LPDWORD pcbRecvLength) |
510 | 0 | { |
511 | 0 | SCARDAPI_STUB_CALL_LONG(SCardTransmit, hCard, pioSendPci, pbSendBuffer, cbSendLength, |
512 | 0 | pioRecvPci, pbRecvBuffer, pcbRecvLength); |
513 | 0 | } |
514 | | |
515 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardGetTransmitCount(SCARDHANDLE hCard, |
516 | | LPDWORD pcTransmitCount) |
517 | 0 | { |
518 | 0 | SCARDAPI_STUB_CALL_LONG(SCardGetTransmitCount, hCard, pcTransmitCount); |
519 | 0 | } |
520 | | |
521 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardControl(SCARDHANDLE hCard, DWORD dwControlCode, |
522 | | LPCVOID lpInBuffer, DWORD cbInBufferSize, |
523 | | LPVOID lpOutBuffer, DWORD cbOutBufferSize, |
524 | | LPDWORD lpBytesReturned) |
525 | 0 | { |
526 | 0 | SCARDAPI_STUB_CALL_LONG(SCardControl, hCard, dwControlCode, lpInBuffer, cbInBufferSize, |
527 | 0 | lpOutBuffer, cbOutBufferSize, lpBytesReturned); |
528 | 0 | } |
529 | | |
530 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardGetAttrib(SCARDHANDLE hCard, DWORD dwAttrId, |
531 | | LPBYTE pbAttr, LPDWORD pcbAttrLen) |
532 | 0 | { |
533 | 0 | SCARDAPI_STUB_CALL_LONG(SCardGetAttrib, hCard, dwAttrId, pbAttr, pcbAttrLen); |
534 | 0 | } |
535 | | |
536 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardSetAttrib(SCARDHANDLE hCard, DWORD dwAttrId, |
537 | | LPCBYTE pbAttr, DWORD cbAttrLen) |
538 | 0 | { |
539 | 0 | SCARDAPI_STUB_CALL_LONG(SCardSetAttrib, hCard, dwAttrId, pbAttr, cbAttrLen); |
540 | 0 | } |
541 | | |
542 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardUIDlgSelectCardA(LPOPENCARDNAMEA_EX pDlgStruc) |
543 | 0 | { |
544 | 0 | SCARDAPI_STUB_CALL_LONG(SCardUIDlgSelectCardA, pDlgStruc); |
545 | 0 | } |
546 | | |
547 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardUIDlgSelectCardW(LPOPENCARDNAMEW_EX pDlgStruc) |
548 | 0 | { |
549 | 0 | SCARDAPI_STUB_CALL_LONG(SCardUIDlgSelectCardW, pDlgStruc); |
550 | 0 | } |
551 | | |
552 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI GetOpenCardNameA(LPOPENCARDNAMEA pDlgStruc) |
553 | 0 | { |
554 | 0 | SCARDAPI_STUB_CALL_LONG(GetOpenCardNameA, pDlgStruc); |
555 | 0 | } |
556 | | |
557 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI GetOpenCardNameW(LPOPENCARDNAMEW pDlgStruc) |
558 | 0 | { |
559 | 0 | SCARDAPI_STUB_CALL_LONG(GetOpenCardNameW, pDlgStruc); |
560 | 0 | } |
561 | | |
562 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardDlgExtendedError(void) |
563 | 0 | { |
564 | 0 | SCARDAPI_STUB_CALL_LONG(SCardDlgExtendedError); |
565 | 0 | } |
566 | | |
567 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardReadCacheA(SCARDCONTEXT hContext, |
568 | | UUID* CardIdentifier, |
569 | | DWORD FreshnessCounter, |
570 | | LPSTR LookupName, PBYTE Data, |
571 | | DWORD* DataLen) |
572 | 0 | { |
573 | 0 | SCARDAPI_STUB_CALL_LONG(SCardReadCacheA, hContext, CardIdentifier, FreshnessCounter, LookupName, |
574 | 0 | Data, DataLen); |
575 | 0 | } |
576 | | |
577 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardReadCacheW(SCARDCONTEXT hContext, |
578 | | UUID* CardIdentifier, |
579 | | DWORD FreshnessCounter, |
580 | | LPWSTR LookupName, PBYTE Data, |
581 | | DWORD* DataLen) |
582 | 0 | { |
583 | 0 | SCARDAPI_STUB_CALL_LONG(SCardReadCacheW, hContext, CardIdentifier, FreshnessCounter, LookupName, |
584 | 0 | Data, DataLen); |
585 | 0 | } |
586 | | |
587 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardWriteCacheA(SCARDCONTEXT hContext, |
588 | | UUID* CardIdentifier, |
589 | | DWORD FreshnessCounter, |
590 | | LPSTR LookupName, PBYTE Data, |
591 | | DWORD DataLen) |
592 | 0 | { |
593 | 0 | SCARDAPI_STUB_CALL_LONG(SCardWriteCacheA, hContext, CardIdentifier, FreshnessCounter, |
594 | 0 | LookupName, Data, DataLen); |
595 | 0 | } |
596 | | |
597 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardWriteCacheW(SCARDCONTEXT hContext, |
598 | | UUID* CardIdentifier, |
599 | | DWORD FreshnessCounter, |
600 | | LPWSTR LookupName, PBYTE Data, |
601 | | DWORD DataLen) |
602 | 0 | { |
603 | 0 | SCARDAPI_STUB_CALL_LONG(SCardWriteCacheW, hContext, CardIdentifier, FreshnessCounter, |
604 | 0 | LookupName, Data, DataLen); |
605 | 0 | } |
606 | | |
607 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardGetReaderIconA(SCARDCONTEXT hContext, |
608 | | LPCSTR szReaderName, LPBYTE pbIcon, |
609 | | LPDWORD pcbIcon) |
610 | 0 | { |
611 | 0 | SCARDAPI_STUB_CALL_LONG(SCardGetReaderIconA, hContext, szReaderName, pbIcon, pcbIcon); |
612 | 0 | } |
613 | | |
614 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardGetReaderIconW(SCARDCONTEXT hContext, |
615 | | LPCWSTR szReaderName, |
616 | | LPBYTE pbIcon, LPDWORD pcbIcon) |
617 | 0 | { |
618 | 0 | SCARDAPI_STUB_CALL_LONG(SCardGetReaderIconW, hContext, szReaderName, pbIcon, pcbIcon); |
619 | 0 | } |
620 | | |
621 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardGetDeviceTypeIdA(SCARDCONTEXT hContext, |
622 | | LPCSTR szReaderName, |
623 | | LPDWORD pdwDeviceTypeId) |
624 | 0 | { |
625 | 0 | SCARDAPI_STUB_CALL_LONG(SCardGetDeviceTypeIdA, hContext, szReaderName, pdwDeviceTypeId); |
626 | 0 | } |
627 | | |
628 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardGetDeviceTypeIdW(SCARDCONTEXT hContext, |
629 | | LPCWSTR szReaderName, |
630 | | LPDWORD pdwDeviceTypeId) |
631 | 0 | { |
632 | 0 | SCARDAPI_STUB_CALL_LONG(SCardGetDeviceTypeIdW, hContext, szReaderName, pdwDeviceTypeId); |
633 | 0 | } |
634 | | |
635 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI |
636 | | SCardGetReaderDeviceInstanceIdA(SCARDCONTEXT hContext, LPCSTR szReaderName, |
637 | | LPSTR szDeviceInstanceId, LPDWORD pcchDeviceInstanceId) |
638 | 0 | { |
639 | 0 | SCARDAPI_STUB_CALL_LONG(SCardGetReaderDeviceInstanceIdA, hContext, szReaderName, |
640 | 0 | szDeviceInstanceId, pcchDeviceInstanceId); |
641 | 0 | } |
642 | | |
643 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI |
644 | | SCardGetReaderDeviceInstanceIdW(SCARDCONTEXT hContext, LPCWSTR szReaderName, |
645 | | LPWSTR szDeviceInstanceId, LPDWORD pcchDeviceInstanceId) |
646 | 0 | { |
647 | 0 | SCARDAPI_STUB_CALL_LONG(SCardGetReaderDeviceInstanceIdW, hContext, szReaderName, |
648 | 0 | szDeviceInstanceId, pcchDeviceInstanceId); |
649 | 0 | } |
650 | | |
651 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardListReadersWithDeviceInstanceIdA( |
652 | | SCARDCONTEXT hContext, LPCSTR szDeviceInstanceId, LPSTR mszReaders, LPDWORD pcchReaders) |
653 | 0 | { |
654 | 0 | SCARDAPI_STUB_CALL_LONG(SCardListReadersWithDeviceInstanceIdA, hContext, szDeviceInstanceId, |
655 | 0 | mszReaders, pcchReaders); |
656 | 0 | } |
657 | | |
658 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardListReadersWithDeviceInstanceIdW( |
659 | | SCARDCONTEXT hContext, LPCWSTR szDeviceInstanceId, LPWSTR mszReaders, LPDWORD pcchReaders) |
660 | 0 | { |
661 | 0 | SCARDAPI_STUB_CALL_LONG(SCardListReadersWithDeviceInstanceIdW, hContext, szDeviceInstanceId, |
662 | 0 | mszReaders, pcchReaders); |
663 | 0 | } |
664 | | |
665 | | WINSCARDAPI WINPR_ATTR_NODISCARD LONG WINAPI SCardAudit(SCARDCONTEXT hContext, DWORD dwEvent) |
666 | 0 | { |
667 | 0 | SCARDAPI_STUB_CALL_LONG(SCardAudit, hContext, dwEvent); |
668 | 0 | } |
669 | | |
670 | | /** |
671 | | * Extended API |
672 | | */ |
673 | | |
674 | | WINSCARDAPI const char* WINAPI SCardGetErrorString(LONG errorCode) |
675 | 0 | { |
676 | 0 | switch (errorCode) |
677 | 0 | { |
678 | 0 | case SCARD_S_SUCCESS: |
679 | 0 | return "SCARD_S_SUCCESS"; |
680 | | |
681 | 0 | case SCARD_F_INTERNAL_ERROR: |
682 | 0 | return "SCARD_F_INTERNAL_ERROR"; |
683 | | |
684 | 0 | case SCARD_E_CANCELLED: |
685 | 0 | return "SCARD_E_CANCELLED"; |
686 | | |
687 | 0 | case SCARD_E_INVALID_HANDLE: |
688 | 0 | return "SCARD_E_INVALID_HANDLE"; |
689 | | |
690 | 0 | case SCARD_E_INVALID_PARAMETER: |
691 | 0 | return "SCARD_E_INVALID_PARAMETER"; |
692 | | |
693 | 0 | case SCARD_E_INVALID_TARGET: |
694 | 0 | return "SCARD_E_INVALID_TARGET"; |
695 | | |
696 | 0 | case SCARD_E_NO_MEMORY: |
697 | 0 | return "SCARD_E_NO_MEMORY"; |
698 | | |
699 | 0 | case SCARD_F_WAITED_TOO_LONG: |
700 | 0 | return "SCARD_F_WAITED_TOO_LONG"; |
701 | | |
702 | 0 | case SCARD_E_INSUFFICIENT_BUFFER: |
703 | 0 | return "SCARD_E_INSUFFICIENT_BUFFER"; |
704 | | |
705 | 0 | case SCARD_E_UNKNOWN_READER: |
706 | 0 | return "SCARD_E_UNKNOWN_READER"; |
707 | | |
708 | 0 | case SCARD_E_TIMEOUT: |
709 | 0 | return "SCARD_E_TIMEOUT"; |
710 | | |
711 | 0 | case SCARD_E_SHARING_VIOLATION: |
712 | 0 | return "SCARD_E_SHARING_VIOLATION"; |
713 | | |
714 | 0 | case SCARD_E_NO_SMARTCARD: |
715 | 0 | return "SCARD_E_NO_SMARTCARD"; |
716 | | |
717 | 0 | case SCARD_E_UNKNOWN_CARD: |
718 | 0 | return "SCARD_E_UNKNOWN_CARD"; |
719 | | |
720 | 0 | case SCARD_E_CANT_DISPOSE: |
721 | 0 | return "SCARD_E_CANT_DISPOSE"; |
722 | | |
723 | 0 | case SCARD_E_PROTO_MISMATCH: |
724 | 0 | return "SCARD_E_PROTO_MISMATCH"; |
725 | | |
726 | 0 | case SCARD_E_NOT_READY: |
727 | 0 | return "SCARD_E_NOT_READY"; |
728 | | |
729 | 0 | case SCARD_E_INVALID_VALUE: |
730 | 0 | return "SCARD_E_INVALID_VALUE"; |
731 | | |
732 | 0 | case SCARD_E_SYSTEM_CANCELLED: |
733 | 0 | return "SCARD_E_SYSTEM_CANCELLED"; |
734 | | |
735 | 0 | case SCARD_F_COMM_ERROR: |
736 | 0 | return "SCARD_F_COMM_ERROR"; |
737 | | |
738 | 0 | case SCARD_F_UNKNOWN_ERROR: |
739 | 0 | return "SCARD_F_UNKNOWN_ERROR"; |
740 | | |
741 | 0 | case SCARD_E_INVALID_ATR: |
742 | 0 | return "SCARD_E_INVALID_ATR"; |
743 | | |
744 | 0 | case SCARD_E_NOT_TRANSACTED: |
745 | 0 | return "SCARD_E_NOT_TRANSACTED"; |
746 | | |
747 | 0 | case SCARD_E_READER_UNAVAILABLE: |
748 | 0 | return "SCARD_E_READER_UNAVAILABLE"; |
749 | | |
750 | 0 | case SCARD_P_SHUTDOWN: |
751 | 0 | return "SCARD_P_SHUTDOWN"; |
752 | | |
753 | 0 | case SCARD_E_PCI_TOO_SMALL: |
754 | 0 | return "SCARD_E_PCI_TOO_SMALL"; |
755 | | |
756 | 0 | case SCARD_E_READER_UNSUPPORTED: |
757 | 0 | return "SCARD_E_READER_UNSUPPORTED"; |
758 | | |
759 | 0 | case SCARD_E_DUPLICATE_READER: |
760 | 0 | return "SCARD_E_DUPLICATE_READER"; |
761 | | |
762 | 0 | case SCARD_E_CARD_UNSUPPORTED: |
763 | 0 | return "SCARD_E_CARD_UNSUPPORTED"; |
764 | | |
765 | 0 | case SCARD_E_NO_SERVICE: |
766 | 0 | return "SCARD_E_NO_SERVICE"; |
767 | | |
768 | 0 | case SCARD_E_SERVICE_STOPPED: |
769 | 0 | return "SCARD_E_SERVICE_STOPPED"; |
770 | | |
771 | 0 | case SCARD_E_UNEXPECTED: |
772 | 0 | return "SCARD_E_UNEXPECTED"; |
773 | | |
774 | 0 | case SCARD_E_ICC_INSTALLATION: |
775 | 0 | return "SCARD_E_ICC_INSTALLATION"; |
776 | | |
777 | 0 | case SCARD_E_ICC_CREATEORDER: |
778 | 0 | return "SCARD_E_ICC_CREATEORDER"; |
779 | | |
780 | 0 | case SCARD_E_UNSUPPORTED_FEATURE: |
781 | 0 | return "SCARD_E_UNSUPPORTED_FEATURE"; |
782 | | |
783 | 0 | case SCARD_E_DIR_NOT_FOUND: |
784 | 0 | return "SCARD_E_DIR_NOT_FOUND"; |
785 | | |
786 | 0 | case SCARD_E_FILE_NOT_FOUND: |
787 | 0 | return "SCARD_E_FILE_NOT_FOUND"; |
788 | | |
789 | 0 | case SCARD_E_NO_DIR: |
790 | 0 | return "SCARD_E_NO_DIR"; |
791 | | |
792 | 0 | case SCARD_E_NO_FILE: |
793 | 0 | return "SCARD_E_NO_FILE"; |
794 | | |
795 | 0 | case SCARD_E_NO_ACCESS: |
796 | 0 | return "SCARD_E_NO_ACCESS"; |
797 | | |
798 | 0 | case SCARD_E_WRITE_TOO_MANY: |
799 | 0 | return "SCARD_E_WRITE_TOO_MANY"; |
800 | | |
801 | 0 | case SCARD_E_BAD_SEEK: |
802 | 0 | return "SCARD_E_BAD_SEEK"; |
803 | | |
804 | 0 | case SCARD_E_INVALID_CHV: |
805 | 0 | return "SCARD_E_INVALID_CHV"; |
806 | | |
807 | 0 | case SCARD_E_UNKNOWN_RES_MNG: |
808 | 0 | return "SCARD_E_UNKNOWN_RES_MNG"; |
809 | | |
810 | 0 | case SCARD_E_NO_SUCH_CERTIFICATE: |
811 | 0 | return "SCARD_E_NO_SUCH_CERTIFICATE"; |
812 | | |
813 | 0 | case SCARD_E_CERTIFICATE_UNAVAILABLE: |
814 | 0 | return "SCARD_E_CERTIFICATE_UNAVAILABLE"; |
815 | | |
816 | 0 | case SCARD_E_NO_READERS_AVAILABLE: |
817 | 0 | return "SCARD_E_NO_READERS_AVAILABLE"; |
818 | | |
819 | 0 | case SCARD_E_COMM_DATA_LOST: |
820 | 0 | return "SCARD_E_COMM_DATA_LOST"; |
821 | | |
822 | 0 | case SCARD_E_NO_KEY_CONTAINER: |
823 | 0 | return "SCARD_E_NO_KEY_CONTAINER"; |
824 | | |
825 | 0 | case SCARD_E_SERVER_TOO_BUSY: |
826 | 0 | return "SCARD_E_SERVER_TOO_BUSY"; |
827 | | |
828 | 0 | case SCARD_E_PIN_CACHE_EXPIRED: |
829 | 0 | return "SCARD_E_PIN_CACHE_EXPIRED"; |
830 | | |
831 | 0 | case SCARD_E_NO_PIN_CACHE: |
832 | 0 | return "SCARD_E_NO_PIN_CACHE"; |
833 | | |
834 | 0 | case SCARD_E_READ_ONLY_CARD: |
835 | 0 | return "SCARD_E_READ_ONLY_CARD"; |
836 | | |
837 | 0 | case SCARD_W_UNSUPPORTED_CARD: |
838 | 0 | return "SCARD_W_UNSUPPORTED_CARD"; |
839 | | |
840 | 0 | case SCARD_W_UNRESPONSIVE_CARD: |
841 | 0 | return "SCARD_W_UNRESPONSIVE_CARD"; |
842 | | |
843 | 0 | case SCARD_W_UNPOWERED_CARD: |
844 | 0 | return "SCARD_W_UNPOWERED_CARD"; |
845 | | |
846 | 0 | case SCARD_W_RESET_CARD: |
847 | 0 | return "SCARD_W_RESET_CARD"; |
848 | | |
849 | 0 | case SCARD_W_REMOVED_CARD: |
850 | 0 | return "SCARD_W_REMOVED_CARD"; |
851 | | |
852 | 0 | case SCARD_W_SECURITY_VIOLATION: |
853 | 0 | return "SCARD_W_SECURITY_VIOLATION"; |
854 | | |
855 | 0 | case SCARD_W_WRONG_CHV: |
856 | 0 | return "SCARD_W_WRONG_CHV"; |
857 | | |
858 | 0 | case SCARD_W_CHV_BLOCKED: |
859 | 0 | return "SCARD_W_CHV_BLOCKED"; |
860 | | |
861 | 0 | case SCARD_W_EOF: |
862 | 0 | return "SCARD_W_EOF"; |
863 | | |
864 | 0 | case SCARD_W_CANCELLED_BY_USER: |
865 | 0 | return "SCARD_W_CANCELLED_BY_USER"; |
866 | | |
867 | 0 | case SCARD_W_CARD_NOT_AUTHENTICATED: |
868 | 0 | return "SCARD_W_CARD_NOT_AUTHENTICATED"; |
869 | | |
870 | 0 | case SCARD_W_CACHE_ITEM_NOT_FOUND: |
871 | 0 | return "SCARD_W_CACHE_ITEM_NOT_FOUND"; |
872 | | |
873 | 0 | case SCARD_W_CACHE_ITEM_STALE: |
874 | 0 | return "SCARD_W_CACHE_ITEM_STALE"; |
875 | | |
876 | 0 | case SCARD_W_CACHE_ITEM_TOO_BIG: |
877 | 0 | return "SCARD_W_CACHE_ITEM_TOO_BIG"; |
878 | | |
879 | 0 | default: |
880 | 0 | return "SCARD_E_UNKNOWN"; |
881 | 0 | } |
882 | 0 | } |
883 | | |
884 | | WINSCARDAPI const char* WINAPI SCardGetAttributeString(DWORD dwAttrId) |
885 | 0 | { |
886 | 0 | switch (dwAttrId) |
887 | 0 | { |
888 | 0 | case SCARD_ATTR_VENDOR_NAME: |
889 | 0 | return "SCARD_ATTR_VENDOR_NAME"; |
890 | | |
891 | 0 | case SCARD_ATTR_VENDOR_IFD_TYPE: |
892 | 0 | return "SCARD_ATTR_VENDOR_IFD_TYPE"; |
893 | | |
894 | 0 | case SCARD_ATTR_VENDOR_IFD_VERSION: |
895 | 0 | return "SCARD_ATTR_VENDOR_IFD_VERSION"; |
896 | | |
897 | 0 | case SCARD_ATTR_VENDOR_IFD_SERIAL_NO: |
898 | 0 | return "SCARD_ATTR_VENDOR_IFD_SERIAL_NO"; |
899 | | |
900 | 0 | case SCARD_ATTR_CHANNEL_ID: |
901 | 0 | return "SCARD_ATTR_CHANNEL_ID"; |
902 | | |
903 | 0 | case SCARD_ATTR_PROTOCOL_TYPES: |
904 | 0 | return "SCARD_ATTR_PROTOCOL_TYPES"; |
905 | | |
906 | 0 | case SCARD_ATTR_DEFAULT_CLK: |
907 | 0 | return "SCARD_ATTR_DEFAULT_CLK"; |
908 | | |
909 | 0 | case SCARD_ATTR_MAX_CLK: |
910 | 0 | return "SCARD_ATTR_MAX_CLK"; |
911 | | |
912 | 0 | case SCARD_ATTR_DEFAULT_DATA_RATE: |
913 | 0 | return "SCARD_ATTR_DEFAULT_DATA_RATE"; |
914 | | |
915 | 0 | case SCARD_ATTR_MAX_DATA_RATE: |
916 | 0 | return "SCARD_ATTR_MAX_DATA_RATE"; |
917 | | |
918 | 0 | case SCARD_ATTR_MAX_IFSD: |
919 | 0 | return "SCARD_ATTR_MAX_IFSD"; |
920 | | |
921 | 0 | case SCARD_ATTR_POWER_MGMT_SUPPORT: |
922 | 0 | return "SCARD_ATTR_POWER_MGMT_SUPPORT"; |
923 | | |
924 | 0 | case SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE: |
925 | 0 | return "SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE"; |
926 | | |
927 | 0 | case SCARD_ATTR_USER_AUTH_INPUT_DEVICE: |
928 | 0 | return "SCARD_ATTR_USER_AUTH_INPUT_DEVICE"; |
929 | | |
930 | 0 | case SCARD_ATTR_CHARACTERISTICS: |
931 | 0 | return "SCARD_ATTR_CHARACTERISTICS"; |
932 | | |
933 | 0 | case SCARD_ATTR_CURRENT_PROTOCOL_TYPE: |
934 | 0 | return "SCARD_ATTR_CURRENT_PROTOCOL_TYPE"; |
935 | | |
936 | 0 | case SCARD_ATTR_CURRENT_CLK: |
937 | 0 | return "SCARD_ATTR_CURRENT_CLK"; |
938 | | |
939 | 0 | case SCARD_ATTR_CURRENT_F: |
940 | 0 | return "SCARD_ATTR_CURRENT_F"; |
941 | | |
942 | 0 | case SCARD_ATTR_CURRENT_D: |
943 | 0 | return "SCARD_ATTR_CURRENT_D"; |
944 | | |
945 | 0 | case SCARD_ATTR_CURRENT_N: |
946 | 0 | return "SCARD_ATTR_CURRENT_N"; |
947 | | |
948 | 0 | case SCARD_ATTR_CURRENT_W: |
949 | 0 | return "SCARD_ATTR_CURRENT_W"; |
950 | | |
951 | 0 | case SCARD_ATTR_CURRENT_IFSC: |
952 | 0 | return "SCARD_ATTR_CURRENT_IFSC"; |
953 | | |
954 | 0 | case SCARD_ATTR_CURRENT_IFSD: |
955 | 0 | return "SCARD_ATTR_CURRENT_IFSD"; |
956 | | |
957 | 0 | case SCARD_ATTR_CURRENT_BWT: |
958 | 0 | return "SCARD_ATTR_CURRENT_BWT"; |
959 | | |
960 | 0 | case SCARD_ATTR_CURRENT_CWT: |
961 | 0 | return "SCARD_ATTR_CURRENT_CWT"; |
962 | | |
963 | 0 | case SCARD_ATTR_CURRENT_EBC_ENCODING: |
964 | 0 | return "SCARD_ATTR_CURRENT_EBC_ENCODING"; |
965 | | |
966 | 0 | case SCARD_ATTR_EXTENDED_BWT: |
967 | 0 | return "SCARD_ATTR_EXTENDED_BWT"; |
968 | | |
969 | 0 | case SCARD_ATTR_ICC_PRESENCE: |
970 | 0 | return "SCARD_ATTR_ICC_PRESENCE"; |
971 | | |
972 | 0 | case SCARD_ATTR_ICC_INTERFACE_STATUS: |
973 | 0 | return "SCARD_ATTR_ICC_INTERFACE_STATUS"; |
974 | | |
975 | 0 | case SCARD_ATTR_CURRENT_IO_STATE: |
976 | 0 | return "SCARD_ATTR_CURRENT_IO_STATE"; |
977 | | |
978 | 0 | case SCARD_ATTR_ATR_STRING: |
979 | 0 | return "SCARD_ATTR_ATR_STRING"; |
980 | | |
981 | 0 | case SCARD_ATTR_ICC_TYPE_PER_ATR: |
982 | 0 | return "SCARD_ATTR_ICC_TYPE_PER_ATR"; |
983 | | |
984 | 0 | case SCARD_ATTR_ESC_RESET: |
985 | 0 | return "SCARD_ATTR_ESC_RESET"; |
986 | | |
987 | 0 | case SCARD_ATTR_ESC_CANCEL: |
988 | 0 | return "SCARD_ATTR_ESC_CANCEL"; |
989 | | |
990 | 0 | case SCARD_ATTR_ESC_AUTHREQUEST: |
991 | 0 | return "SCARD_ATTR_ESC_AUTHREQUEST"; |
992 | | |
993 | 0 | case SCARD_ATTR_MAXINPUT: |
994 | 0 | return "SCARD_ATTR_MAXINPUT"; |
995 | | |
996 | 0 | case SCARD_ATTR_DEVICE_UNIT: |
997 | 0 | return "SCARD_ATTR_DEVICE_UNIT"; |
998 | | |
999 | 0 | case SCARD_ATTR_DEVICE_IN_USE: |
1000 | 0 | return "SCARD_ATTR_DEVICE_IN_USE"; |
1001 | | |
1002 | 0 | case SCARD_ATTR_DEVICE_FRIENDLY_NAME_A: |
1003 | 0 | return "SCARD_ATTR_DEVICE_FRIENDLY_NAME_A"; |
1004 | | |
1005 | 0 | case SCARD_ATTR_DEVICE_SYSTEM_NAME_A: |
1006 | 0 | return "SCARD_ATTR_DEVICE_SYSTEM_NAME_A"; |
1007 | | |
1008 | 0 | case SCARD_ATTR_DEVICE_FRIENDLY_NAME_W: |
1009 | 0 | return "SCARD_ATTR_DEVICE_FRIENDLY_NAME_W"; |
1010 | | |
1011 | 0 | case SCARD_ATTR_DEVICE_SYSTEM_NAME_W: |
1012 | 0 | return "SCARD_ATTR_DEVICE_SYSTEM_NAME_W"; |
1013 | | |
1014 | 0 | case SCARD_ATTR_SUPRESS_T1_IFS_REQUEST: |
1015 | 0 | return "SCARD_ATTR_SUPRESS_T1_IFS_REQUEST"; |
1016 | | |
1017 | 0 | default: |
1018 | 0 | return "SCARD_ATTR_UNKNOWN"; |
1019 | 0 | } |
1020 | 0 | } |
1021 | | |
1022 | | WINSCARDAPI const char* WINAPI SCardGetProtocolString(DWORD dwProtocols) |
1023 | 0 | { |
1024 | 0 | if (dwProtocols == SCARD_PROTOCOL_UNDEFINED) |
1025 | 0 | return "SCARD_PROTOCOL_UNDEFINED"; |
1026 | | |
1027 | 0 | if (dwProtocols == SCARD_PROTOCOL_T0) |
1028 | 0 | return "SCARD_PROTOCOL_T0"; |
1029 | | |
1030 | 0 | if (dwProtocols == SCARD_PROTOCOL_T1) |
1031 | 0 | return "SCARD_PROTOCOL_T1"; |
1032 | | |
1033 | 0 | if (dwProtocols == SCARD_PROTOCOL_Tx) |
1034 | 0 | return "SCARD_PROTOCOL_Tx"; |
1035 | | |
1036 | 0 | if (dwProtocols == SCARD_PROTOCOL_RAW) |
1037 | 0 | return "SCARD_PROTOCOL_RAW"; |
1038 | | |
1039 | 0 | if (dwProtocols == SCARD_PROTOCOL_DEFAULT) |
1040 | 0 | return "SCARD_PROTOCOL_DEFAULT"; |
1041 | | |
1042 | 0 | if (dwProtocols == (SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_RAW)) |
1043 | 0 | return "SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_RAW"; |
1044 | | |
1045 | 0 | if (dwProtocols == (SCARD_PROTOCOL_T1 | SCARD_PROTOCOL_RAW)) |
1046 | 0 | return "SCARD_PROTOCOL_T1 | SCARD_PROTOCOL_RAW"; |
1047 | | |
1048 | 0 | if (dwProtocols == (SCARD_PROTOCOL_Tx | SCARD_PROTOCOL_RAW)) |
1049 | 0 | return "SCARD_PROTOCOL_Tx | SCARD_PROTOCOL_RAW"; |
1050 | | |
1051 | 0 | return "SCARD_PROTOCOL_UNKNOWN"; |
1052 | 0 | } |
1053 | | |
1054 | | WINSCARDAPI const char* WINAPI SCardGetShareModeString(DWORD dwShareMode) |
1055 | 0 | { |
1056 | 0 | switch (dwShareMode) |
1057 | 0 | { |
1058 | 0 | case SCARD_SHARE_EXCLUSIVE: |
1059 | 0 | return "SCARD_SHARE_EXCLUSIVE"; |
1060 | | |
1061 | 0 | case SCARD_SHARE_SHARED: |
1062 | 0 | return "SCARD_SHARE_SHARED"; |
1063 | | |
1064 | 0 | case SCARD_SHARE_DIRECT: |
1065 | 0 | return "SCARD_SHARE_DIRECT"; |
1066 | | |
1067 | 0 | default: |
1068 | 0 | return "SCARD_SHARE_UNKNOWN"; |
1069 | 0 | } |
1070 | 0 | } |
1071 | | |
1072 | | WINSCARDAPI const char* WINAPI SCardGetDispositionString(DWORD dwDisposition) |
1073 | 0 | { |
1074 | 0 | switch (dwDisposition) |
1075 | 0 | { |
1076 | 0 | case SCARD_LEAVE_CARD: |
1077 | 0 | return "SCARD_LEAVE_CARD"; |
1078 | | |
1079 | 0 | case SCARD_RESET_CARD: |
1080 | 0 | return "SCARD_RESET_CARD"; |
1081 | | |
1082 | 0 | case SCARD_UNPOWER_CARD: |
1083 | 0 | return "SCARD_UNPOWER_CARD"; |
1084 | | |
1085 | 0 | default: |
1086 | 0 | return "SCARD_UNKNOWN_CARD"; |
1087 | 0 | } |
1088 | 0 | } |
1089 | | |
1090 | | WINSCARDAPI const char* WINAPI SCardGetScopeString(DWORD dwScope) |
1091 | 0 | { |
1092 | 0 | switch (dwScope) |
1093 | 0 | { |
1094 | 0 | case SCARD_SCOPE_USER: |
1095 | 0 | return "SCARD_SCOPE_USER"; |
1096 | | |
1097 | 0 | case SCARD_SCOPE_TERMINAL: |
1098 | 0 | return "SCARD_SCOPE_TERMINAL"; |
1099 | | |
1100 | 0 | case SCARD_SCOPE_SYSTEM: |
1101 | 0 | return "SCARD_SCOPE_SYSTEM"; |
1102 | | |
1103 | 0 | default: |
1104 | 0 | return "SCARD_SCOPE_UNKNOWN"; |
1105 | 0 | } |
1106 | 0 | } |
1107 | | |
1108 | | WINSCARDAPI const char* WINAPI SCardGetCardStateString(DWORD dwCardState) |
1109 | 0 | { |
1110 | 0 | switch (dwCardState) |
1111 | 0 | { |
1112 | 0 | case SCARD_UNKNOWN: |
1113 | 0 | return "SCARD_UNKNOWN"; |
1114 | | |
1115 | 0 | case SCARD_ABSENT: |
1116 | 0 | return "SCARD_ABSENT"; |
1117 | | |
1118 | 0 | case SCARD_PRESENT: |
1119 | 0 | return "SCARD_PRESENT"; |
1120 | | |
1121 | 0 | case SCARD_SWALLOWED: |
1122 | 0 | return "SCARD_SWALLOWED"; |
1123 | | |
1124 | 0 | case SCARD_POWERED: |
1125 | 0 | return "SCARD_POWERED"; |
1126 | | |
1127 | 0 | case SCARD_NEGOTIABLE: |
1128 | 0 | return "SCARD_NEGOTIABLE"; |
1129 | | |
1130 | 0 | case SCARD_SPECIFIC: |
1131 | 0 | return "SCARD_SPECIFIC"; |
1132 | | |
1133 | 0 | default: |
1134 | 0 | return "SCARD_UNKNOWN"; |
1135 | 0 | } |
1136 | 0 | } |
1137 | | |
1138 | | WINSCARDAPI char* WINAPI SCardGetReaderStateString(DWORD dwReaderState) |
1139 | 0 | { |
1140 | 0 | const size_t size = 512; |
1141 | 0 | char* buffer = calloc(size, sizeof(char)); |
1142 | |
|
1143 | 0 | if (!buffer) |
1144 | 0 | return nullptr; |
1145 | | |
1146 | 0 | if (dwReaderState & SCARD_STATE_IGNORE) |
1147 | 0 | winpr_str_append("SCARD_STATE_IGNORE", buffer, size, "|"); |
1148 | |
|
1149 | 0 | if (dwReaderState & SCARD_STATE_CHANGED) |
1150 | 0 | winpr_str_append("SCARD_STATE_CHANGED", buffer, size, "|"); |
1151 | |
|
1152 | 0 | if (dwReaderState & SCARD_STATE_UNKNOWN) |
1153 | 0 | winpr_str_append("SCARD_STATE_UNKNOWN", buffer, size, "|"); |
1154 | |
|
1155 | 0 | if (dwReaderState & SCARD_STATE_UNAVAILABLE) |
1156 | 0 | winpr_str_append("SCARD_STATE_UNAVAILABLE", buffer, size, "|"); |
1157 | |
|
1158 | 0 | if (dwReaderState & SCARD_STATE_EMPTY) |
1159 | 0 | winpr_str_append("SCARD_STATE_EMPTY", buffer, size, "|"); |
1160 | |
|
1161 | 0 | if (dwReaderState & SCARD_STATE_PRESENT) |
1162 | 0 | winpr_str_append("SCARD_STATE_PRESENT", buffer, size, "|"); |
1163 | |
|
1164 | 0 | if (dwReaderState & SCARD_STATE_ATRMATCH) |
1165 | 0 | winpr_str_append("SCARD_STATE_ATRMATCH", buffer, size, "|"); |
1166 | |
|
1167 | 0 | if (dwReaderState & SCARD_STATE_EXCLUSIVE) |
1168 | 0 | winpr_str_append("SCARD_STATE_EXCLUSIVE", buffer, size, "|"); |
1169 | |
|
1170 | 0 | if (dwReaderState & SCARD_STATE_INUSE) |
1171 | 0 | winpr_str_append("SCARD_STATE_INUSE", buffer, size, "|"); |
1172 | |
|
1173 | 0 | if (dwReaderState & SCARD_STATE_MUTE) |
1174 | 0 | winpr_str_append("SCARD_STATE_MUTE", buffer, size, "|"); |
1175 | |
|
1176 | 0 | if (dwReaderState & SCARD_STATE_UNPOWERED) |
1177 | 0 | winpr_str_append("SCARD_STATE_UNPOWERED", buffer, size, "|"); |
1178 | |
|
1179 | 0 | if (!buffer[0]) |
1180 | 0 | winpr_str_append("SCARD_STATE_UNAWARE", buffer, size, "|"); |
1181 | |
|
1182 | 0 | return buffer; |
1183 | 0 | } |
1184 | | |
1185 | | #define WINSCARD_LOAD_PROC(_name) \ |
1186 | 0 | do \ |
1187 | 0 | { \ |
1188 | 0 | WINPR_PRAGMA_DIAG_PUSH \ |
1189 | 0 | WINPR_PRAGMA_DIAG_IGNORED_PEDANTIC \ |
1190 | 0 | pWinSCardApiTable->pfn##_name = GetProcAddressAs(hWinSCardLibrary, #_name, fn##_name); \ |
1191 | 0 | WINPR_PRAGMA_DIAG_POP \ |
1192 | 0 | } while (0) |
1193 | | |
1194 | | BOOL WinSCard_LoadApiTableFunctions(PSCardApiFunctionTable pWinSCardApiTable, |
1195 | | HMODULE hWinSCardLibrary) |
1196 | 0 | { |
1197 | 0 | WINPR_ASSERT(pWinSCardApiTable); |
1198 | 0 | WINPR_ASSERT(hWinSCardLibrary); |
1199 | |
|
1200 | 0 | WINSCARD_LOAD_PROC(SCardEstablishContext); |
1201 | 0 | WINSCARD_LOAD_PROC(SCardReleaseContext); |
1202 | 0 | WINSCARD_LOAD_PROC(SCardIsValidContext); |
1203 | 0 | WINSCARD_LOAD_PROC(SCardListReaderGroupsA); |
1204 | 0 | WINSCARD_LOAD_PROC(SCardListReaderGroupsW); |
1205 | 0 | WINSCARD_LOAD_PROC(SCardListReadersA); |
1206 | 0 | WINSCARD_LOAD_PROC(SCardListReadersW); |
1207 | 0 | WINSCARD_LOAD_PROC(SCardListCardsA); |
1208 | 0 | WINSCARD_LOAD_PROC(SCardListCardsW); |
1209 | 0 | WINSCARD_LOAD_PROC(SCardListInterfacesA); |
1210 | 0 | WINSCARD_LOAD_PROC(SCardListInterfacesW); |
1211 | 0 | WINSCARD_LOAD_PROC(SCardGetProviderIdA); |
1212 | 0 | WINSCARD_LOAD_PROC(SCardGetProviderIdW); |
1213 | 0 | WINSCARD_LOAD_PROC(SCardGetCardTypeProviderNameA); |
1214 | 0 | WINSCARD_LOAD_PROC(SCardGetCardTypeProviderNameW); |
1215 | 0 | WINSCARD_LOAD_PROC(SCardIntroduceReaderGroupA); |
1216 | 0 | WINSCARD_LOAD_PROC(SCardIntroduceReaderGroupW); |
1217 | 0 | WINSCARD_LOAD_PROC(SCardForgetReaderGroupA); |
1218 | 0 | WINSCARD_LOAD_PROC(SCardForgetReaderGroupW); |
1219 | 0 | WINSCARD_LOAD_PROC(SCardIntroduceReaderA); |
1220 | 0 | WINSCARD_LOAD_PROC(SCardIntroduceReaderW); |
1221 | 0 | WINSCARD_LOAD_PROC(SCardForgetReaderA); |
1222 | 0 | WINSCARD_LOAD_PROC(SCardForgetReaderW); |
1223 | 0 | WINSCARD_LOAD_PROC(SCardAddReaderToGroupA); |
1224 | 0 | WINSCARD_LOAD_PROC(SCardAddReaderToGroupW); |
1225 | 0 | WINSCARD_LOAD_PROC(SCardRemoveReaderFromGroupA); |
1226 | 0 | WINSCARD_LOAD_PROC(SCardRemoveReaderFromGroupW); |
1227 | 0 | WINSCARD_LOAD_PROC(SCardIntroduceCardTypeA); |
1228 | 0 | WINSCARD_LOAD_PROC(SCardIntroduceCardTypeW); |
1229 | 0 | WINSCARD_LOAD_PROC(SCardSetCardTypeProviderNameA); |
1230 | 0 | WINSCARD_LOAD_PROC(SCardSetCardTypeProviderNameW); |
1231 | 0 | WINSCARD_LOAD_PROC(SCardForgetCardTypeA); |
1232 | 0 | WINSCARD_LOAD_PROC(SCardForgetCardTypeW); |
1233 | 0 | WINSCARD_LOAD_PROC(SCardFreeMemory); |
1234 | 0 | WINSCARD_LOAD_PROC(SCardAccessStartedEvent); |
1235 | 0 | WINSCARD_LOAD_PROC(SCardReleaseStartedEvent); |
1236 | 0 | WINSCARD_LOAD_PROC(SCardLocateCardsA); |
1237 | 0 | WINSCARD_LOAD_PROC(SCardLocateCardsW); |
1238 | 0 | WINSCARD_LOAD_PROC(SCardLocateCardsByATRA); |
1239 | 0 | WINSCARD_LOAD_PROC(SCardLocateCardsByATRW); |
1240 | 0 | WINSCARD_LOAD_PROC(SCardGetStatusChangeA); |
1241 | 0 | WINSCARD_LOAD_PROC(SCardGetStatusChangeW); |
1242 | 0 | WINSCARD_LOAD_PROC(SCardCancel); |
1243 | 0 | WINSCARD_LOAD_PROC(SCardConnectA); |
1244 | 0 | WINSCARD_LOAD_PROC(SCardConnectW); |
1245 | 0 | WINSCARD_LOAD_PROC(SCardReconnect); |
1246 | 0 | WINSCARD_LOAD_PROC(SCardDisconnect); |
1247 | 0 | WINSCARD_LOAD_PROC(SCardBeginTransaction); |
1248 | 0 | WINSCARD_LOAD_PROC(SCardEndTransaction); |
1249 | 0 | WINSCARD_LOAD_PROC(SCardCancelTransaction); |
1250 | 0 | WINSCARD_LOAD_PROC(SCardState); |
1251 | 0 | WINSCARD_LOAD_PROC(SCardStatusA); |
1252 | 0 | WINSCARD_LOAD_PROC(SCardStatusW); |
1253 | 0 | WINSCARD_LOAD_PROC(SCardTransmit); |
1254 | 0 | WINSCARD_LOAD_PROC(SCardGetTransmitCount); |
1255 | 0 | WINSCARD_LOAD_PROC(SCardControl); |
1256 | 0 | WINSCARD_LOAD_PROC(SCardGetAttrib); |
1257 | 0 | WINSCARD_LOAD_PROC(SCardSetAttrib); |
1258 | 0 | WINSCARD_LOAD_PROC(SCardUIDlgSelectCardA); |
1259 | 0 | WINSCARD_LOAD_PROC(SCardUIDlgSelectCardW); |
1260 | 0 | WINSCARD_LOAD_PROC(GetOpenCardNameA); |
1261 | 0 | WINSCARD_LOAD_PROC(GetOpenCardNameW); |
1262 | 0 | WINSCARD_LOAD_PROC(SCardDlgExtendedError); |
1263 | 0 | WINSCARD_LOAD_PROC(SCardReadCacheA); |
1264 | 0 | WINSCARD_LOAD_PROC(SCardReadCacheW); |
1265 | 0 | WINSCARD_LOAD_PROC(SCardWriteCacheA); |
1266 | 0 | WINSCARD_LOAD_PROC(SCardWriteCacheW); |
1267 | 0 | WINSCARD_LOAD_PROC(SCardGetReaderIconA); |
1268 | 0 | WINSCARD_LOAD_PROC(SCardGetReaderIconW); |
1269 | 0 | WINSCARD_LOAD_PROC(SCardGetDeviceTypeIdA); |
1270 | 0 | WINSCARD_LOAD_PROC(SCardGetDeviceTypeIdW); |
1271 | 0 | WINSCARD_LOAD_PROC(SCardGetReaderDeviceInstanceIdA); |
1272 | 0 | WINSCARD_LOAD_PROC(SCardGetReaderDeviceInstanceIdW); |
1273 | 0 | WINSCARD_LOAD_PROC(SCardListReadersWithDeviceInstanceIdA); |
1274 | 0 | WINSCARD_LOAD_PROC(SCardListReadersWithDeviceInstanceIdW); |
1275 | 0 | WINSCARD_LOAD_PROC(SCardAudit); |
1276 | |
|
1277 | 0 | return TRUE; |
1278 | 0 | } |
1279 | | |
1280 | | static const SCardApiFunctionTable WinPR_SCardApiFunctionTable = { |
1281 | | 0, /* dwVersion */ |
1282 | | 0, /* dwFlags */ |
1283 | | |
1284 | | SCardEstablishContext, /* SCardEstablishContext */ |
1285 | | SCardReleaseContext, /* SCardReleaseContext */ |
1286 | | SCardIsValidContext, /* SCardIsValidContext */ |
1287 | | SCardListReaderGroupsA, /* SCardListReaderGroupsA */ |
1288 | | SCardListReaderGroupsW, /* SCardListReaderGroupsW */ |
1289 | | SCardListReadersA, /* SCardListReadersA */ |
1290 | | SCardListReadersW, /* SCardListReadersW */ |
1291 | | SCardListCardsA, /* SCardListCardsA */ |
1292 | | SCardListCardsW, /* SCardListCardsW */ |
1293 | | SCardListInterfacesA, /* SCardListInterfacesA */ |
1294 | | SCardListInterfacesW, /* SCardListInterfacesW */ |
1295 | | SCardGetProviderIdA, /* SCardGetProviderIdA */ |
1296 | | SCardGetProviderIdW, /* SCardGetProviderIdW */ |
1297 | | SCardGetCardTypeProviderNameA, /* SCardGetCardTypeProviderNameA */ |
1298 | | SCardGetCardTypeProviderNameW, /* SCardGetCardTypeProviderNameW */ |
1299 | | SCardIntroduceReaderGroupA, /* SCardIntroduceReaderGroupA */ |
1300 | | SCardIntroduceReaderGroupW, /* SCardIntroduceReaderGroupW */ |
1301 | | SCardForgetReaderGroupA, /* SCardForgetReaderGroupA */ |
1302 | | SCardForgetReaderGroupW, /* SCardForgetReaderGroupW */ |
1303 | | SCardIntroduceReaderA, /* SCardIntroduceReaderA */ |
1304 | | SCardIntroduceReaderW, /* SCardIntroduceReaderW */ |
1305 | | SCardForgetReaderA, /* SCardForgetReaderA */ |
1306 | | SCardForgetReaderW, /* SCardForgetReaderW */ |
1307 | | SCardAddReaderToGroupA, /* SCardAddReaderToGroupA */ |
1308 | | SCardAddReaderToGroupW, /* SCardAddReaderToGroupW */ |
1309 | | SCardRemoveReaderFromGroupA, /* SCardRemoveReaderFromGroupA */ |
1310 | | SCardRemoveReaderFromGroupW, /* SCardRemoveReaderFromGroupW */ |
1311 | | SCardIntroduceCardTypeA, /* SCardIntroduceCardTypeA */ |
1312 | | SCardIntroduceCardTypeW, /* SCardIntroduceCardTypeW */ |
1313 | | SCardSetCardTypeProviderNameA, /* SCardSetCardTypeProviderNameA */ |
1314 | | SCardSetCardTypeProviderNameW, /* SCardSetCardTypeProviderNameW */ |
1315 | | SCardForgetCardTypeA, /* SCardForgetCardTypeA */ |
1316 | | SCardForgetCardTypeW, /* SCardForgetCardTypeW */ |
1317 | | SCardFreeMemory, /* SCardFreeMemory */ |
1318 | | SCardAccessStartedEvent, /* SCardAccessStartedEvent */ |
1319 | | SCardReleaseStartedEvent, /* SCardReleaseStartedEvent */ |
1320 | | SCardLocateCardsA, /* SCardLocateCardsA */ |
1321 | | SCardLocateCardsW, /* SCardLocateCardsW */ |
1322 | | SCardLocateCardsByATRA, /* SCardLocateCardsByATRA */ |
1323 | | SCardLocateCardsByATRW, /* SCardLocateCardsByATRW */ |
1324 | | SCardGetStatusChangeA, /* SCardGetStatusChangeA */ |
1325 | | SCardGetStatusChangeW, /* SCardGetStatusChangeW */ |
1326 | | SCardCancel, /* SCardCancel */ |
1327 | | SCardConnectA, /* SCardConnectA */ |
1328 | | SCardConnectW, /* SCardConnectW */ |
1329 | | SCardReconnect, /* SCardReconnect */ |
1330 | | SCardDisconnect, /* SCardDisconnect */ |
1331 | | SCardBeginTransaction, /* SCardBeginTransaction */ |
1332 | | SCardEndTransaction, /* SCardEndTransaction */ |
1333 | | SCardCancelTransaction, /* SCardCancelTransaction */ |
1334 | | SCardState, /* SCardState */ |
1335 | | SCardStatusA, /* SCardStatusA */ |
1336 | | SCardStatusW, /* SCardStatusW */ |
1337 | | SCardTransmit, /* SCardTransmit */ |
1338 | | SCardGetTransmitCount, /* SCardGetTransmitCount */ |
1339 | | SCardControl, /* SCardControl */ |
1340 | | SCardGetAttrib, /* SCardGetAttrib */ |
1341 | | SCardSetAttrib, /* SCardSetAttrib */ |
1342 | | SCardUIDlgSelectCardA, /* SCardUIDlgSelectCardA */ |
1343 | | SCardUIDlgSelectCardW, /* SCardUIDlgSelectCardW */ |
1344 | | GetOpenCardNameA, /* GetOpenCardNameA */ |
1345 | | GetOpenCardNameW, /* GetOpenCardNameW */ |
1346 | | SCardDlgExtendedError, /* SCardDlgExtendedError */ |
1347 | | SCardReadCacheA, /* SCardReadCacheA */ |
1348 | | SCardReadCacheW, /* SCardReadCacheW */ |
1349 | | SCardWriteCacheA, /* SCardWriteCacheA */ |
1350 | | SCardWriteCacheW, /* SCardWriteCacheW */ |
1351 | | SCardGetReaderIconA, /* SCardGetReaderIconA */ |
1352 | | SCardGetReaderIconW, /* SCardGetReaderIconW */ |
1353 | | SCardGetDeviceTypeIdA, /* SCardGetDeviceTypeIdA */ |
1354 | | SCardGetDeviceTypeIdW, /* SCardGetDeviceTypeIdW */ |
1355 | | SCardGetReaderDeviceInstanceIdA, /* SCardGetReaderDeviceInstanceIdA */ |
1356 | | SCardGetReaderDeviceInstanceIdW, /* SCardGetReaderDeviceInstanceIdW */ |
1357 | | SCardListReadersWithDeviceInstanceIdA, /* SCardListReadersWithDeviceInstanceIdA */ |
1358 | | SCardListReadersWithDeviceInstanceIdW, /* SCardListReadersWithDeviceInstanceIdW */ |
1359 | | SCardAudit /* SCardAudit */ |
1360 | | }; |
1361 | | |
1362 | | const SCardApiFunctionTable* WinPR_GetSCardApiFunctionTable(void) |
1363 | 0 | { |
1364 | 0 | return &WinPR_SCardApiFunctionTable; |
1365 | 0 | } |