/[openpgpmdrv]/trunk/OpenPGPminidriver/CardPublicDataOperation.c
ViewVC logotype

Annotation of /trunk/OpenPGPminidriver/CardPublicDataOperation.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (hide annotations)
Tue Feb 23 19:18:59 2010 UTC (15 years, 2 months ago) by vletoux
File MIME type: text/plain
File size: 11330 byte(s)


1 vletoux 1 /* OpenPGP Smart Card Mini Driver
2     Copyright (C) 2009 Vincent Le Toux
3    
4     This library is Free software; you can redistribute it and/or
5     modify it under the terms of the GNU Lesser General Public
6     License version 2.1 as published by the Free Software Foundation.
7    
8     This library is distributed in the hope that it will be useful,
9     but WITHOUT ANY WARRANTY; without even the implied warranty of
10     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11     Lesser General Public License for more details.
12    
13     You should have received a copy of the GNU Lesser General Public
14     License along with this library; if not, write to the Free Software
15     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16     */
17    
18     #include <windows.h>
19     #include <cardmod.h>
20     #include "Tracing.h"
21     #include "Context.h"
22     #include "PublicDataOperations.h"
23    
24     // 4.3 Public Data Operations
25    
26     /** This function creates a subdirectory from the root in the file system of
27     the card and applies the provided access condition. Directories are generally
28     created for segregating the files that belong to a single application on the card.
29     As an example, the files that belong to the Microsoft cryptographic application
30     are in the “mscp” directory.*/
31    
32     DWORD WINAPI CardCreateDirectory(
33     __in PCARD_DATA pCardData,
34     __in LPSTR pszDirectoryName,
35     __in CARD_DIRECTORY_ACCESS_CONDITION AccessCondition
36     )
37     {
38     Trace(WINEVENT_LEVEL_VERBOSE, L"Enter");
39     return SCARD_E_UNSUPPORTED_FEATURE;
40     }
41    
42     /** This function deletes a directory from the card. This operation fails if it violates
43     permissions on the directory or if the directory is not empty. */
44     DWORD WINAPI CardDeleteDirectory(
45     __in CARD_DATA *pCardData,
46     __in LPSTR pszDirectoryName
47     )
48     {
49     Trace(WINEVENT_LEVEL_VERBOSE, L"Enter");
50     return SCARD_E_UNSUPPORTED_FEATURE;
51     }
52    
53     /** The CardReadFile function reads the entire file at the specified location into the
54     user-supplied buffer.*/
55     DWORD WINAPI CardReadFile(
56     __in PCARD_DATA pCardData,
57     __in_opt LPSTR pszDirectoryName,
58     __in LPSTR pszFileName,
59     __in DWORD dwFlags,
60     __deref_out_bcount_opt(*pcbData) PBYTE *ppbData,
61     __out PDWORD pcbData
62     )
63     {
64     DWORD dwReturn = 0;
65     PSTR szFiles = NULL;
66    
67     Trace(WINEVENT_LEVEL_VERBOSE, L"Enter %S\\%S",pszDirectoryName,pszFileName);
68     __try
69     {
70     if ( pCardData == NULL )
71     {
72     Trace(WINEVENT_LEVEL_ERROR, L"pCardData == NULL");
73     dwReturn = SCARD_E_INVALID_PARAMETER;
74     __leave;
75     }
76     if ( pszFileName == NULL )
77     {
78     Trace(WINEVENT_LEVEL_ERROR, L"pszFileName == NULL");
79     dwReturn = SCARD_E_INVALID_PARAMETER;
80     __leave;
81     }
82     if (ppbData == NULL)
83     {
84     Trace(WINEVENT_LEVEL_ERROR, L"ppbData == NULL");
85     dwReturn = SCARD_E_INVALID_PARAMETER;
86     __leave;
87     }
88     if (pcbData == NULL)
89     {
90     Trace(WINEVENT_LEVEL_ERROR, L"pcbData == NULL");
91     dwReturn = SCARD_E_INVALID_PARAMETER;
92     __leave;
93     }
94     if (dwFlags != 0)
95     {
96     dwReturn = SCARD_E_INVALID_PARAMETER;
97     Trace(WINEVENT_LEVEL_ERROR, L"dwFlags = 0x%08X", dwFlags);
98     __leave;
99     }
100     dwReturn = CheckContext(pCardData);
101     if (dwReturn)
102     {
103     __leave;
104     }
105     dwReturn = SCardReadFile(pCardData, pszDirectoryName, pszFileName, ppbData, pcbData);
106     }
107     __finally
108     {
109     }
110     Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn);
111     return dwReturn;
112     }
113    
114     /** The CardCreateFile function creates a file on the card with a specified name and
115     access permission. This function cannot be used to create directories. If the directory
116     that is named by pszDirectoryName does not exist, the function fails with SCARD_E_DIR_NOT_FOUND.*/
117     DWORD WINAPI CardCreateFile(
118     __in PCARD_DATA pCardData,
119     __in_opt LPSTR pszDirectoryName,
120     __in LPSTR pszFileName,
121     __in DWORD cbInitialCreationSize,
122     __in CARD_FILE_ACCESS_CONDITION AccessCondition
123     )
124     {
125     DWORD dwReturn = 0;
126    
127     Trace(WINEVENT_LEVEL_VERBOSE, L"Enter");
128     __try
129     {
130     if ( pCardData == NULL )
131     {
132     Trace(WINEVENT_LEVEL_ERROR, L"pCardData == NULL");
133     dwReturn = SCARD_E_INVALID_PARAMETER;
134     __leave;
135     }
136     if ( pszFileName == NULL || pszFileName[0] == 0)
137     {
138     Trace(WINEVENT_LEVEL_ERROR, L"pszFileName == NULL or empty");
139     dwReturn = SCARD_E_INVALID_PARAMETER;
140     __leave;
141     }
142     dwReturn = CheckContext(pCardData);
143     if (dwReturn)
144     {
145     __leave;
146     }
147     dwReturn = SCardCreateFile(pCardData, pszDirectoryName, pszFileName);
148     }
149     __finally
150     {
151     }
152     Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn);
153     return dwReturn;
154     }
155    
156     /** This function retrieves information about a file, specifically its size and ACL information.*/
157    
158     DWORD WINAPI CardGetFileInfo(
159     __in PCARD_DATA pCardData,
160     __in_opt LPSTR pszDirectoryName,
161     __in LPSTR pszFileName,
162     __inout PCARD_FILE_INFO pCardFileInfo
163     )
164     {
165     DWORD dwReturn = 0;
166    
167     Trace(WINEVENT_LEVEL_VERBOSE, L"Enter");
168     __try
169     {
170     if ( pCardData == NULL )
171     {
172     Trace(WINEVENT_LEVEL_ERROR, L"pCardData == NULL");
173     dwReturn = SCARD_E_INVALID_PARAMETER;
174     __leave;
175     }
176     if ( pszFileName == NULL || pszFileName[0] == 0)
177     {
178     Trace(WINEVENT_LEVEL_ERROR, L"pszFileName == NULL or empty");
179     dwReturn = SCARD_E_INVALID_PARAMETER;
180     __leave;
181     }
182     if ( pCardFileInfo == NULL )
183     {
184     Trace(WINEVENT_LEVEL_ERROR, L"pCardFileInfo == NULL");
185     dwReturn = SCARD_E_INVALID_PARAMETER;
186     __leave;
187     }
188     dwReturn = CheckContext(pCardData);
189     if (dwReturn)
190     {
191     __leave;
192     }
193     dwReturn = SCardGetFileInfo(pCardData, pszDirectoryName, pszFileName, pCardFileInfo);
194    
195     }
196     __finally
197     {
198     }
199     Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn);
200     return dwReturn;
201     }
202    
203     /** The CardWriteFile function writes the entire contents of a data buffer to a file.
204     The file contents are replaced, starting at the beginning of the file. The file must
205     exist, or CardWriteFile fails.*/
206    
207     DWORD WINAPI CardWriteFile(
208     __in PCARD_DATA pCardData,
209     __in_opt LPSTR pszDirectoryName,
210     __in LPSTR pszFileName,
211     __in DWORD dwFlags,
212     __in_bcount(cbData) PBYTE pbData,
213     __in DWORD cbData
214     )
215     {
216     DWORD dwReturn = 0;
217    
218     Trace(WINEVENT_LEVEL_VERBOSE, L"Enter");
219     __try
220     {
221     if ( pCardData == NULL )
222     {
223     Trace(WINEVENT_LEVEL_ERROR, L"pCardData == NULL");
224     dwReturn = SCARD_E_INVALID_PARAMETER;
225     __leave;
226     }
227     if ( pszFileName == NULL || pszFileName[0] == 0)
228     {
229     Trace(WINEVENT_LEVEL_ERROR, L"pszFileName == NULL or empty");
230     dwReturn = SCARD_E_INVALID_PARAMETER;
231     __leave;
232     }
233     if ( pbData == NULL)
234     {
235     Trace(WINEVENT_LEVEL_ERROR, L"pbData == NULL");
236     dwReturn = SCARD_E_INVALID_PARAMETER;
237     __leave;
238     }
239     if ( cbData == 0)
240     {
241     Trace(WINEVENT_LEVEL_ERROR, L"cbData == 0");
242     dwReturn = SCARD_E_INVALID_PARAMETER;
243     __leave;
244     }
245     if (dwFlags)
246     {
247     Trace(WINEVENT_LEVEL_ERROR, L"dwFlags == %d", dwFlags);
248     dwReturn = SCARD_E_INVALID_PARAMETER;
249     __leave;
250     }
251     dwReturn = CheckContext(pCardData);
252     if (dwReturn)
253     {
254     __leave;
255     }
256     dwReturn = SCardWriteFile(pCardData, pszDirectoryName, pszFileName, pbData, cbData);
257     }
258     __finally
259     {
260     }
261     Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn);
262     return dwReturn;
263     }
264    
265     /** The CardDeleteFile function deletes the specified file. If the file does not exist,
266     the returned Status value should indicate that the file did not exist.*/
267    
268     DWORD WINAPI CardDeleteFile(
269     __in PCARD_DATA pCardData,
270     __in_opt LPSTR pszDirectoryName,
271     __in LPSTR pszFileName,
272     __in DWORD dwFlags
273     )
274     {
275     DWORD dwReturn = 0;
276    
277     PBYTE pbData = NULL;
278     DWORD dwSize = 0;
279     Trace(WINEVENT_LEVEL_VERBOSE, L"Enter");
280     __try
281     {
282     if ( pCardData == NULL )
283     {
284     Trace(WINEVENT_LEVEL_ERROR, L"pCardData == NULL");
285     dwReturn = SCARD_E_INVALID_PARAMETER;
286     __leave;
287     }
288     if ( pszFileName == NULL || pszFileName[0] == 0)
289     {
290     Trace(WINEVENT_LEVEL_ERROR, L"pszFileName == NULL or empty");
291     dwReturn = SCARD_E_INVALID_PARAMETER;
292     __leave;
293     }
294     if (dwFlags)
295     {
296     Trace(WINEVENT_LEVEL_ERROR, L"dwFlags == 0");
297     dwReturn = SCARD_E_INVALID_PARAMETER;
298     __leave;
299     }
300     // try to read the file to see if it exists and return the right error code
301     dwReturn = CheckContext(pCardData);
302     if (dwReturn)
303     {
304     __leave;
305     }
306     dwReturn = SCardDeleteFile(pCardData, pszDirectoryName, pszFileName);
307     }
308     __finally
309     {
310     }
311     Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn);
312     return dwReturn;
313     }
314    
315     /** The CardEnumFiles function returns name information about available files in a
316     directory as a multistring list.*/
317    
318     DWORD WINAPI CardEnumFiles(
319     __in PCARD_DATA pCardData,
320     __in_opt LPSTR pszDirectoryName,
321     __deref_out_ecount(*pdwcbFileName) LPSTR *pmszFileNames,
322     __out LPDWORD pdwcbFileName,
323     __in DWORD dwFlags
324     )
325     {
326     DWORD dwReturn = 0;
327     PSTR szFiles = NULL;
328    
329     Trace(WINEVENT_LEVEL_VERBOSE, L"Enter");
330     __try
331     {
332     if ( pCardData == NULL )
333     {
334     Trace(WINEVENT_LEVEL_ERROR, L"pCardData == NULL");
335     dwReturn = SCARD_E_INVALID_PARAMETER;
336     __leave;
337     }
338     if ( pmszFileNames == NULL )
339     {
340     Trace(WINEVENT_LEVEL_ERROR, L"pmszFileNames == NULL");
341     dwReturn = SCARD_E_INVALID_PARAMETER;
342     __leave;
343     }
344     if ( pmszFileNames == NULL )
345     {
346     Trace(WINEVENT_LEVEL_ERROR, L"pmszFileNames == NULL");
347     dwReturn = SCARD_E_INVALID_PARAMETER;
348     __leave;
349     }
350     if (dwFlags != 0)
351     {
352     dwReturn = SCARD_E_INVALID_PARAMETER;
353     Trace(WINEVENT_LEVEL_ERROR, L"dwFlags = 0x%08X", dwFlags);
354     __leave;
355     }
356     if (pszDirectoryName != NULL)
357     {
358     DWORD dwLen = (DWORD) strlen(pszDirectoryName);
359     if (dwLen > 8 || dwLen == 0)
360     {
361     dwReturn = SCARD_E_INVALID_PARAMETER;
362     Trace(WINEVENT_LEVEL_ERROR, L"Invalid directory %S", pszDirectoryName);
363     __leave;
364     }
365     }
366     dwReturn = CheckContext(pCardData);
367     if (dwReturn)
368     {
369     __leave;
370     }
371     dwReturn = SCardEnumFile(pCardData, pszDirectoryName, pmszFileNames, pdwcbFileName);
372     }
373     __finally
374     {
375     }
376     Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn);
377     return dwReturn;
378     }
379    
380     /** The CardQueryFreeSpace function determines the amount of available card storage space.*/
381     DWORD WINAPI CardQueryFreeSpace(
382     __in PCARD_DATA pCardData,
383     __in DWORD dwFlags,
384     __inout PCARD_FREE_SPACE_INFO pCardFreeSpaceInfo
385     )
386     {
387     DWORD dwReturn = 0;
388     Trace(WINEVENT_LEVEL_VERBOSE, L"Enter");
389     __try
390     {
391     if ( pCardData == NULL )
392     {
393     Trace(WINEVENT_LEVEL_ERROR, L"pCardData == NULL");
394     dwReturn = SCARD_E_INVALID_PARAMETER;
395     __leave;
396     }
397     if ( pCardFreeSpaceInfo == NULL)
398     {
399     Trace(WINEVENT_LEVEL_ERROR, L"pCardFreeSpaceInfo == NULL");
400     dwReturn = SCARD_E_INVALID_PARAMETER;
401     __leave;
402     }
403     if (dwFlags)
404     {
405     Trace(WINEVENT_LEVEL_ERROR, L"dwFlags == 0");
406     dwReturn = SCARD_E_INVALID_PARAMETER;
407     __leave;
408     }
409     pCardFreeSpaceInfo->dwVersion = CARD_FREE_SPACE_INFO_CURRENT_VERSION;
410     pCardFreeSpaceInfo->dwMaxKeyContainers = 3;
411     pCardFreeSpaceInfo->dwKeyContainersAvailable = CARD_DATA_VALUE_UNKNOWN;
412     pCardFreeSpaceInfo->dwBytesAvailable = CARD_DATA_VALUE_UNKNOWN;
413     dwReturn = 0;
414     }
415     __finally
416     {
417     }
418     Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn);
419     return dwReturn;
420     }
421    

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26