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

Contents of /trunk/OpenPGPminidriver/PublicDataOperations.c

Parent Directory Parent Directory | Revision Log Revision Log


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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26