Coverage Report

Created: 2026-03-04 06:13

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