Coverage Report

Created: 2026-02-26 06:50

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