Coverage Report

Created: 2025-07-01 06:46

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