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

Contents of /trunk/OpenPGPminidriver/PublicDataOperations.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 12 - (show annotations)
Wed Mar 31 08:58:46 2010 UTC (15 years, 1 month ago) by vletoux
File MIME type: text/plain
File size: 17259 byte(s)
first msi Release
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 <stdio.h>
20 #include <cardmod.h>
21 #include "Tracing.h"
22 #include "Context.h"
23 #include "SmartCard.h"
24 #include "PublicDataOperations.h"
25 #include "CryptoOperations.h"
26 #include "tlv.h"
27
28 typedef enum _OPENPGP_FILE_TYPE
29 {
30 StoredOnSmartCard,
31 Virtual,
32 } OPENPGP_FILE_TYPE;
33
34 #define OPENPGP_FILE_OPTIONAL 1
35 #define OPENPGP_FILE_WRITE_ONLY 2
36 #define OPENPGP_FILE_NULL_LENGHT_EQUALS_MISSING 4
37 #define OPENPGP_FILE_CONF_IS_AUTH 8
38
39 typedef struct _OPENPGP_FILE
40 {
41 PCHAR szDirectory;
42 PCHAR szFile;
43 OPENPGP_FILE_TYPE dwFileType;
44 DWORD dwTag;
45 DWORD dwTlv;
46 CARD_FILE_ACCESS_CONDITION dwAccess;
47 DWORD dwFlag;
48 } OPENPGP_FILE, *POPENPGP_FILE;
49
50
51 #define szCARD_APPLICATION_FILE "cardapps"
52
53 OPENPGP_FILE Files[] =
54 {
55 {szOpenPGPDir, szOpenPGPFingerprint, StoredOnSmartCard, 0x6E, 0xC5, EveryoneReadAdminWriteAc},
56 {szOpenPGPDir, szOpenPGPStatus, StoredOnSmartCard, 0xC4, 0, EveryoneReadAdminWriteAc},
57 {szOpenPGPDir, szOpenPGPStatusPW1, StoredOnSmartCard, 0xC4, 0, EveryoneReadAdminWriteAc, OPENPGP_FILE_WRITE_ONLY},
58 {szOpenPGPDir, szOpenPGPApplicationIdentifier, StoredOnSmartCard, 0x4F, 0, UnknownAc},
59 {szOpenPGPDir, szOpenPGPLogin, StoredOnSmartCard, 0x5E, 0, EveryoneReadAdminWriteAc},
60 {szOpenPGPDir, szOpenPGPName, StoredOnSmartCard, 0x65, 0x5B, EveryoneReadAdminWriteAc},
61 {szOpenPGPDir, szOpenPGPLanguage, StoredOnSmartCard, 0x65, 0x5F2D, EveryoneReadAdminWriteAc},
62 {szOpenPGPDir, szOpenPGPSex, StoredOnSmartCard, 0x65, 0x5F35,EveryoneReadAdminWriteAc},
63 {szOpenPGPDir, szOpenPGPUrl, StoredOnSmartCard, 0x5F50, 0, EveryoneReadAdminWriteAc},
64 {szOpenPGPDir, szOpenPGPHistoricalBytes, StoredOnSmartCard, 0x5F52, 0, UnknownAc},
65 {szOpenPGPDir, szOpenPGPCertificate, StoredOnSmartCard, 0x7F21, 0, EveryoneReadAdminWriteAc},
66 {szOpenPGPDir, szOpenPGPExtendedCap, StoredOnSmartCard, 0x6E, 0xC0, UnknownAc},
67 {szOpenPGPDir, szOpenPGPAlgoAttributesSignature, StoredOnSmartCard, 0x6E, 0xC1, UnknownAc},
68 {szOpenPGPDir, szOpenPGPAlgoAttributesDecryption, StoredOnSmartCard, 0x6E, 0xC2,UnknownAc},
69 {szOpenPGPDir, szOpenPGPAlgoAttributesAuthentication, StoredOnSmartCard, 0x6E, 0xC3, UnknownAc },
70 {szOpenPGPDir, szOpenPGPPUK, StoredOnSmartCard, 0xD3, 0, UnknownAc, OPENPGP_FILE_WRITE_ONLY },
71 {szOpenPGPDir, szOpenPGPSecureMessaging, StoredOnSmartCard, 0xF4, 0, UnknownAc, OPENPGP_FILE_WRITE_ONLY },
72 {szOpenPGPDir, szOpenPGPSecureMessagingCryptographicCheksum, StoredOnSmartCard, 0xD2, 0, UnknownAc, OPENPGP_FILE_WRITE_ONLY },
73 {szOpenPGPDir, szOpenPGPSecureMessagingCryptogram, StoredOnSmartCard, 0xD1, 0, UnknownAc, OPENPGP_FILE_WRITE_ONLY },
74 {NULL, szCARD_IDENTIFIER_FILE, StoredOnSmartCard, 0x4F, 0, EveryoneReadAdminWriteAc},
75 {NULL, szCARD_APPLICATION_FILE, Virtual, 0, 0, EveryoneReadAdminWriteAc},
76 {NULL, szCACHE_FILE, Virtual, 0, 0, EveryoneReadUserWriteAc},
77 {szBASE_CSP_DIR, szCONTAINER_MAP_FILE, Virtual, 0, 0, EveryoneReadUserWriteAc},
78 {szBASE_CSP_DIR, "kxc01", StoredOnSmartCard, 0x7F21, 0, EveryoneReadAdminWriteAc, OPENPGP_FILE_NULL_LENGHT_EQUALS_MISSING | OPENPGP_FILE_CONF_IS_AUTH},
79 {szBASE_CSP_DIR, "ksc02", StoredOnSmartCard, 0x7F21, 0, EveryoneReadAdminWriteAc, OPENPGP_FILE_NULL_LENGHT_EQUALS_MISSING},
80
81 };
82
83 DWORD dwFileCount = ARRAYSIZE(Files);
84
85 DWORD OCardDirectoryList(__in PCARD_DATA pCardData,
86 __in PBYTE* pbResponse, __in_opt PDWORD pdwResponseSize)
87 {
88 // hardcoded
89 *pdwResponseSize = 16;
90 *pbResponse = pCardData->pfnCspAlloc(*pdwResponseSize);
91 if (!*pbResponse)
92 {
93 return SCARD_E_NO_MEMORY;
94 }
95 memcpy(*pbResponse, "openpgp\0mscp\0\0\0\0", *pdwResponseSize);
96 return 0;
97 }
98
99
100 // read file
101 DWORD OCardReadFile(__in PCARD_DATA pCardData,
102 __in_opt PSTR szDirectory, __in PSTR szFile,
103 __in PBYTE* ppbResponse, __in PDWORD pdwResponseSize)
104 {
105 DWORD dwI;
106 DWORD dwReturn = 0;
107 BOOL fDirectoryFound = FALSE;
108 BOOL fFileFound = FALSE;
109 BYTE pbCmd[] = {0x00, 0xCA, 0x00, 0x00, 0x00, 0x00,0x00};
110 DWORD dwCmdSize = ARRAYSIZE(pbCmd);
111 POPENPGP_CONTEXT pContext = (POPENPGP_CONTEXT) pCardData->pvVendorSpecific;
112 PBYTE pbData = NULL;
113 __try
114 {
115 *pdwResponseSize = 0;
116 for(dwI = 0; dwI < dwFileCount; dwI++)
117 {
118 BOOL fMatch = FALSE;
119 if (szDirectory == NULL)
120 {
121 if (!Files[dwI].szDirectory) fMatch = TRUE;
122 }
123 else
124 {
125 if (Files[dwI].szDirectory && _stricmp(szDirectory, Files[dwI].szDirectory) == 0) fMatch = TRUE;
126 }
127 if (fMatch)
128 {
129 fDirectoryFound = TRUE;
130 if (_stricmp(szFile, Files[dwI].szFile) == 0)
131 {
132 fFileFound = TRUE;
133 break;
134 }
135 }
136 }
137 if (!fFileFound)
138 {
139 if (fDirectoryFound)
140 {
141 dwReturn = SCARD_E_FILE_NOT_FOUND;
142 Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_FILE_NOT_FOUND %S",szFile);
143 }
144 else
145 {
146 dwReturn = SCARD_E_DIR_NOT_FOUND;
147 Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_DIR_NOT_FOUND %S",szDirectory);
148 }
149 __leave;
150 }
151 if (Files[dwI].dwFileType == StoredOnSmartCard)
152 {
153 pbCmd[2] = (BYTE) (Files[dwI].dwTag / 0x100);
154 pbCmd[3] = (BYTE) (Files[dwI].dwTag % 0x100);
155 dwReturn = OCardGetData(pCardData, pbCmd, dwCmdSize, &pbData, pdwResponseSize);
156 if (dwReturn)
157 {
158 __leave;
159 }
160 if (Files[dwI].dwTlv)
161 {
162 PBYTE pbPointer;
163 //TraceDump(0,pbData,*pdwResponseSize);
164 if (find_tlv(pbData, Files[dwI].dwTlv, *pdwResponseSize, &pbPointer, pdwResponseSize))
165 {
166 *ppbResponse = pCardData->pfnCspAlloc(*pdwResponseSize);
167 if (!*ppbResponse )
168 {
169 Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_NO_MEMORY");
170 dwReturn = SCARD_E_NO_MEMORY;
171 __leave;
172 }
173 memcpy(*ppbResponse, pbPointer, *pdwResponseSize);
174 }
175 else
176 {
177 dwReturn = SCARD_E_FILE_NOT_FOUND;
178 Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_FILE_NOT_FOUND %S",szFile);
179 __leave;
180 }
181 }
182 else
183 {
184 *ppbResponse = pbData;
185 // do not free the data !
186 pbData = NULL;
187 }
188 if (Files[dwI].dwFlag & OPENPGP_FILE_NULL_LENGHT_EQUALS_MISSING)
189 {
190 if (*pdwResponseSize == 0)
191 {
192 pCardData->pfnCspFree(*ppbResponse);
193 *pdwResponseSize = 0;
194 *ppbResponse = NULL;
195 dwReturn = SCARD_E_FILE_NOT_FOUND;
196 Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_FILE_NOT_FOUND %S OPENPGP_FILE_NULL_LENGHT_EQUALS_MISSING",szFile);
197 __leave;
198 }
199 }
200 if (Files[dwI].dwFlag & OPENPGP_FILE_CONF_IS_AUTH)
201 {
202 DWORD dwTempReturn = OCardIsConfidentialityKeyTheSameThanAuthentication(pCardData);
203 if (dwTempReturn)
204 {
205 pCardData->pfnCspFree(*ppbResponse);
206 *pdwResponseSize = 0;
207 *ppbResponse = NULL;
208 dwReturn = SCARD_E_FILE_NOT_FOUND;
209 Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_FILE_NOT_FOUND %S OPENPGP_FILE_CONF_IS_AUTH",szFile);
210 __leave;
211 }
212 }
213 }
214 else
215 {
216 if (szDirectory == NULL)
217 {
218 if (_stricmp(szFile, szCARD_APPLICATION_FILE) == 0)
219 {
220 dwReturn = OCardDirectoryList(pCardData, ppbResponse, pdwResponseSize);
221 }
222 else if (_stricmp(szFile, szCACHE_FILE) == 0)
223 {
224 *pdwResponseSize = sizeof(CARD_CACHE_FILE_FORMAT);
225 *ppbResponse = pCardData->pfnCspAlloc(*pdwResponseSize);
226 memset(*ppbResponse,0,*pdwResponseSize);
227 }
228 else
229 {
230 dwReturn = SCARD_E_FILE_NOT_FOUND;
231 Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_FILE_NOT_FOUND %S",szFile);
232 }
233 }
234 else if (_stricmp(szDirectory,szBASE_CSP_DIR) == 0)
235 {
236 if (_stricmp(szFile, szCONTAINER_MAP_FILE) == 0)
237 {
238 dwReturn = OCardReadContainerMapFile(pCardData, ppbResponse, pdwResponseSize);
239 }
240 else
241 {
242 dwReturn = SCARD_E_FILE_NOT_FOUND;
243 Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_FILE_NOT_FOUND %S",szFile);
244 }
245 }
246 else
247 {
248 dwReturn = SCARD_E_DIR_NOT_FOUND;
249 Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_DIR_NOT_FOUND %S",szDirectory);
250 }
251 }
252 if (dwReturn)
253 {
254 __leave;
255 }
256 // add to the cache
257 dwReturn = 0;
258
259 }
260 __finally
261 {
262 if( pbData)
263 pCardData->pfnCspFree(pbData);
264 }
265 Trace(WINEVENT_LEVEL_VERBOSE, L"%S\\%S dwReturn = 0x%08X size = %d",szDirectory, szFile, dwReturn, *pdwResponseSize);
266 return dwReturn;
267 }
268
269 DWORD OCardEnumFile(__in PCARD_DATA pCardData,
270 __in_opt PSTR szDirectory,
271 __in PBYTE* pbResponse, __in PDWORD pdwResponseSize)
272 {
273 DWORD dwReturn = 0, dwTempReturn;
274 DWORD dwI, dwSize;
275 BOOL fDirectoryFound = FALSE;
276 BOOL fAddToOuput;
277 __try
278 {
279 *pbResponse = NULL;
280 *pdwResponseSize = 0;
281
282 // compute the max size of the buffer
283 dwSize = 0;
284 for(dwI = 0; dwI < dwFileCount; dwI++)
285 {
286 BOOL fMatch = FALSE;
287 if (szDirectory == NULL)
288 {
289 if (!Files[dwI].szDirectory) fMatch = TRUE;
290 }
291 else
292 {
293 if (Files[dwI].szDirectory && _stricmp(szDirectory, Files[dwI].szDirectory) == 0) fMatch = TRUE;
294 }
295 if (fMatch && !(Files[dwI].dwFileType & OPENPGP_FILE_WRITE_ONLY))
296 {
297 dwSize += (DWORD) strlen( Files[dwI].szFile) + 1;
298 }
299 }
300 dwSize += 1;
301 *pbResponse = pCardData->pfnCspAlloc(dwSize);
302 if (!*pbResponse)
303 {
304 dwReturn = SCARD_E_NO_MEMORY;
305 __leave;
306 }
307 for(dwI = 0; dwI < dwFileCount; dwI++)
308 {
309 BOOL fMatch = FALSE;
310 if (szDirectory == NULL)
311 {
312 if (!Files[dwI].szDirectory) fMatch = TRUE;
313 }
314 else
315 {
316 if (Files[dwI].szDirectory && _stricmp(szDirectory, Files[dwI].szDirectory) == 0) fMatch = TRUE;
317 }
318 if (fMatch)
319 {
320 fDirectoryFound = TRUE;
321 fAddToOuput = TRUE;
322 if (Files[dwI].dwFlag & OPENPGP_FILE_WRITE_ONLY)
323 {
324 fAddToOuput = FALSE;
325 }
326 if (fAddToOuput && (Files[dwI].dwFlag & OPENPGP_FILE_NULL_LENGHT_EQUALS_MISSING))
327 {
328 PBYTE pbData = NULL;
329 DWORD dwSize;
330 fAddToOuput = FALSE;
331 // check if the file exists and be read
332 dwTempReturn = OCardReadFile(pCardData, szDirectory, Files[dwI].szFile, &pbData, &dwSize);
333 if (!dwTempReturn)
334 {
335 pCardData->pfnCspFree(pbData);
336 if (dwSize > 0)
337 {
338 fAddToOuput = TRUE;
339 }
340 }
341 }
342 if (fAddToOuput && (Files[dwI].dwFlag & OPENPGP_FILE_CONF_IS_AUTH))
343 {
344 dwTempReturn = OCardIsConfidentialityKeyTheSameThanAuthentication(pCardData);
345 if (dwTempReturn)
346 {
347 fAddToOuput = FALSE;
348 }
349 }
350 if (fAddToOuput)
351 {
352 dwSize = (DWORD) strlen( Files[dwI].szFile) + 1;
353 memcpy(*pbResponse + *pdwResponseSize, Files[dwI].szFile, dwSize);
354 *pdwResponseSize += dwSize;
355 }
356 }
357 }
358 if (!fDirectoryFound)
359 {
360 dwReturn = SCARD_E_DIR_NOT_FOUND;
361 __leave;
362 }
363 (*pbResponse)[*pdwResponseSize] = '\0';
364 *pdwResponseSize += 1;
365 dwReturn = 0;
366 }
367 __finally
368 {
369 }
370 Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn);
371 return dwReturn;
372 }
373
374 // read file
375 DWORD OCardGetFileInfo(__in PCARD_DATA pCardData,
376 __in_opt PSTR szDirectory, __in PSTR szFile,
377 __inout PCARD_FILE_INFO pCardFileInfo)
378 {
379 DWORD dwReturn = 0;
380 PBYTE pbData = NULL;
381 DWORD dwSize, dwI;
382 __try
383 {
384 dwReturn = OCardReadFile(pCardData, szDirectory, szFile, &pbData, &dwSize);
385 if (dwReturn)
386 {
387 __leave;
388 }
389 pCardData->pfnCspFree(pbData);
390 pCardFileInfo->cbFileSize = dwSize;
391 pCardFileInfo->AccessCondition = InvalidAc;
392 for(dwI = 0; dwI < dwFileCount; dwI++)
393 {
394 BOOL fMatch = FALSE;
395 if (szDirectory == NULL)
396 {
397 if (!Files[dwI].szDirectory) fMatch = TRUE;
398 }
399 else
400 {
401 if (Files[dwI].szDirectory && _stricmp(szDirectory, Files[dwI].szDirectory) == 0) fMatch = TRUE;
402 }
403 if (fMatch)
404 {
405 if (_stricmp(szFile, Files[dwI].szFile) == 0)
406 {
407 pCardFileInfo->AccessCondition = Files[dwI].dwAccess;
408 break;
409 }
410 }
411 }
412 dwReturn = 0;
413 }
414 __finally
415 {
416 }
417 Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn);
418 return dwReturn;
419 }
420
421 DWORD OCardWriteFileOnSmartCard(__in PCARD_DATA pCardData,
422 __in OPENPGP_FILE File,
423 __in PBYTE pbData, __in DWORD dwSize)
424 {
425 DWORD dwReturn = 0;
426 BYTE pbCmd[5 + 256] = {0x00, 0xDA, 0x00, 0x00, 0x00};
427 DWORD dwCmdSize = 0;
428 PBYTE pbCmdExtended = NULL;
429 __try
430 {
431 if (dwSize > 0xFFFF)
432 {
433 dwReturn = SCARD_E_INVALID_PARAMETER;
434 Trace(WINEVENT_LEVEL_ERROR, L"dwSize %d",dwSize);
435 __leave;
436 }
437 if (dwSize < 256)
438 {
439 if (File.dwTlv > 0)
440 {
441 pbCmd[2] = (BYTE) (File.dwTlv / 0x100);
442 pbCmd[3] = (BYTE) (File.dwTlv % 0x100);
443 }
444 else
445 {
446 pbCmd[2] = (BYTE) (File.dwTag / 0x100);
447 pbCmd[3] = (BYTE) (File.dwTag % 0x100);
448 }
449 pbCmd[4] = (BYTE) dwSize;
450 if (dwSize)
451 {
452 memcpy(pbCmd + 5, pbData, dwSize);
453 }
454 dwCmdSize = dwSize + 5;
455 dwReturn = OCardSendCommand(pCardData, pbCmd, dwCmdSize);
456 if (dwReturn)
457 {
458 __leave;
459 }
460 }
461 else
462 {
463 dwCmdSize = dwSize + 7;
464 pbCmdExtended = pCardData->pfnCspAlloc(dwCmdSize);
465 if (!pbCmdExtended)
466 {
467 Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_NO_MEMORY");
468 dwReturn = SCARD_E_NO_MEMORY;
469 __leave;
470 }
471 pbCmdExtended[0] = 0;
472 pbCmdExtended[1] = 0xDA;
473 if (File.dwTlv > 0)
474 {
475 pbCmdExtended[2] = (BYTE) (File.dwTlv / 0x100);
476 pbCmdExtended[3] = (BYTE) (File.dwTlv % 0x100);
477 }
478 else
479 {
480 pbCmdExtended[2] = (BYTE) (File.dwTag / 0x100);
481 pbCmdExtended[3] = (BYTE) (File.dwTag % 0x100);
482 }
483 pbCmdExtended[4] = 0;
484 pbCmdExtended[5] = (BYTE)(dwSize / 0x100);
485 pbCmdExtended[6] = (BYTE)(dwSize % 0x100);
486 memcpy(pbCmdExtended + 7, pbData, dwSize);
487 dwReturn = OCardSendCommand(pCardData, pbCmdExtended, dwCmdSize);
488 if (dwReturn)
489 {
490 __leave;
491 }
492 }
493 }
494 __finally
495 {
496 if(pbCmdExtended)
497 pCardData->pfnCspFree(pbCmdExtended);
498 }
499 Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn);
500 return dwReturn;
501 }
502
503 DWORD OCardWriteFile(__in PCARD_DATA pCardData,
504 __in_opt PSTR szDirectory, __in PSTR szFile,
505 __in PBYTE pbData, __in DWORD dwSize)
506 {
507 DWORD dwI;
508 DWORD dwReturn = 0;
509 BOOL fDirectoryFound = FALSE;
510 BOOL fFileFound = FALSE;
511 __try
512 {
513
514 for(dwI = 0; dwI < dwFileCount; dwI++)
515 {
516 BOOL fMatch = FALSE;
517 if (szDirectory == NULL)
518 {
519 if (!Files[dwI].szDirectory) fMatch = TRUE;
520 }
521 else
522 {
523 if (Files[dwI].szDirectory && _stricmp(szDirectory, Files[dwI].szDirectory) == 0) fMatch = TRUE;
524 }
525 if (fMatch)
526 {
527 fDirectoryFound = TRUE;
528 if (_stricmp(szFile, Files[dwI].szFile) == 0)
529 {
530 fFileFound = TRUE;
531 break;
532 }
533 }
534 }
535 if (!fFileFound)
536 {
537 if (fDirectoryFound)
538 {
539 dwReturn = SCARD_E_FILE_NOT_FOUND;
540 Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_FILE_NOT_FOUND %S",szFile);
541 }
542 else
543 {
544 dwReturn = SCARD_E_DIR_NOT_FOUND;
545 Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_DIR_NOT_FOUND %S",szDirectory);
546 }
547 __leave;
548 }
549 if (Files[dwI].dwFileType == StoredOnSmartCard)
550 {
551 dwReturn = OCardWriteFileOnSmartCard(pCardData, Files[dwI], pbData, dwSize);
552 }
553 else
554 {
555 dwReturn = SCARD_W_SECURITY_VIOLATION;
556 Trace(WINEVENT_LEVEL_ERROR, L"SCARD_W_SECURITY_VIOLATION %S",szFile);
557 __leave;
558 }
559 }
560 __finally
561 {
562 }
563 Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn);
564 return dwReturn;
565 }
566
567 DWORD OCardDeleteFile(__in PCARD_DATA pCardData,
568 __in_opt PSTR szDirectory, __in PSTR szFile)
569 {
570 return OCardWriteFile(pCardData, szDirectory, szFile, NULL, 0);
571 }
572
573 // just change the flag in Files
574 DWORD OCardCreateFile(__in PCARD_DATA pCardData,
575 __in_opt PSTR szDirectory, __in PSTR szFile)
576 {
577 DWORD dwI;
578 DWORD dwReturn = 0;
579 BOOL fDirectoryFound = FALSE;
580 BOOL fFileFound = FALSE;
581 __try
582 {
583 for(dwI = 0; dwI < dwFileCount; dwI++)
584 {
585 BOOL fMatch = FALSE;
586 if (szDirectory == NULL)
587 {
588 if (!Files[dwI].szDirectory) fMatch = TRUE;
589 }
590 else
591 {
592 if (Files[dwI].szDirectory && _stricmp(szDirectory, Files[dwI].szDirectory) == 0) fMatch = TRUE;
593 }
594 if (fMatch)
595 {
596 fDirectoryFound = TRUE;
597 if (_stricmp(szFile, Files[dwI].szFile) == 0)
598 {
599 fFileFound = TRUE;
600 break;
601 }
602 }
603 }
604 if (!fDirectoryFound)
605 {
606 dwReturn = SCARD_E_DIR_NOT_FOUND;
607 Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_DIR_NOT_FOUND %S",szFile);
608 __leave;
609 }
610 if (!fFileFound)
611 {
612 dwReturn = SCARD_W_SECURITY_VIOLATION;
613 Trace(WINEVENT_LEVEL_ERROR, L"SCARD_W_SECURITY_VIOLATION %S",szFile);
614 __leave;
615 }
616
617 }
618 __finally
619 {
620 }
621 Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn);
622 return dwReturn;
623 }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26