Coverage Report

Created: 2026-04-12 07:03

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