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