Coverage Report

Created: 2024-05-20 06:11

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