/[winpt]/trunk/Src/wptCardPCSC.c
ViewVC logotype

Annotation of /trunk/Src/wptCardPCSC.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 262 - (hide annotations)
Sat Sep 30 10:24:34 2006 UTC (18 years, 5 months ago) by twoaday
File MIME type: text/plain
File size: 2732 byte(s)


1 werner 36 /* wptCardPCSC.cpp - PC/SC card API interface
2 twoaday 262 * Copyright (C) 2003, 2006 Timo Schulz
3 werner 36 *
4     * This file is part of WinPT.
5     *
6     * WinPT is free software; you can redistribute it and/or modify
7     * it under the terms of the GNU General Public License as published by
8     * the Free Software Foundation; either version 2 of the License, or
9     * (at your option) any later version.
10     *
11     * WinPT is distributed in the hope that it will be useful,
12     * but WITHOUT ANY WARRANTY; without even the implied warranty of
13     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14     * GNU General Public License for more details.
15     *
16     * You should have received a copy of the GNU General Public License
17     * along with WinPT; if not, write to the Free Software Foundation,
18     * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19     */
20     #ifdef HAVE_CONFIG_H
21     #include <config.h>
22     #endif
23    
24     #include <stdio.h>
25     #include <windows.h>
26 twoaday 193 #ifndef __MINGW32__
27     #include <winscard.h>
28 twoaday 262 #else
29     /* mingw32 has no win32 smartcard API definitions. */
30     typedef ULONG_PTR SCARDCONTEXT;
31     #define SCARD_SCOPE_SYSTEM 2
32     #define SCARD_S_SUCCESS NO_ERROR
33 twoaday 193 #endif
34 werner 36
35     #include "gpgme.h"
36     #include "wptTypes.h"
37     #include "wptCard.h"
38    
39 werner 48
40 werner 36 static LONG (WINAPI *pcsc_establish_context) (unsigned long scope,
41     const void *reserved1,
42     const void *reserved2,
43     unsigned long *r_context);
44     static LONG (WINAPI *pcsc_release_context) (unsigned long context);
45    
46     static int pcsc_init = 0;
47    
48    
49     #define load_one_fnc(ptr, hlib, name) do { \
50     a = ptr = (void *)GetProcAddress (hlib, name); \
51     if (!a) { \
52     char msg[256]; \
53     _snprintf (msg, sizeof msg-1, "Could not load '%s'", name); \
54     MessageBox (NULL, msg, "PC/SC Driver", MB_ICONERROR|MB_OK); \
55     goto fail; \
56     } \
57     } while (0)
58    
59    
60 twoaday 262 static int
61     pcsc_loadlib (void)
62 werner 36 {
63     HMODULE hlib;
64     FARPROC a;
65    
66 twoaday 262 if (pcsc_init)
67 werner 36 return 0;
68     hlib = LoadLibrary ("WINSCARD");
69     if (!hlib)
70     goto fail;
71     load_one_fnc (pcsc_establish_context, hlib, "SCardEstablishContext");
72     load_one_fnc (pcsc_release_context, hlib, "SCardReleaseContext");
73     goto success;
74    
75     fail:
76 twoaday 262 if (hlib != NULL)
77     FreeLibrary (hlib);
78 werner 36 return -1;
79 twoaday 262
80 werner 36 success:
81     pcsc_init = 1;
82     return 0;
83     }
84    
85    
86 twoaday 262 /* Return != 0 if the PC/SC smart card interface is available.
87     The purpose of the function is to disable smart card releation
88     commands on systems with no scard readers. */
89 werner 36 int
90 twoaday 262 pcsc_available (void)
91 werner 36 {
92 twoaday 262 SCARDCONTEXT ctx;
93     LONG err;
94 werner 36
95 twoaday 262 if (pcsc_loadlib ())
96     return 0;
97 werner 36
98 twoaday 262 err = pcsc_establish_context (SCARD_SCOPE_SYSTEM, NULL, NULL, &ctx);
99     if (err == SCARD_S_SUCCESS) {
100     pcsc_release_context (ctx);
101 werner 36 return -1;
102     }
103     return 0;
104     }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26