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

Diff of /trunk/OpenPGPminidriver/SmartCard.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1 by vletoux, Tue Feb 23 19:18:59 2010 UTC revision 8 by vletoux, Thu Mar 11 20:32:26 2010 UTC
# Line 24  Line 24 
24    
25  #pragma comment(lib,"Winscard")  #pragma comment(lib,"Winscard")
26    
27    DWORD SelectOpenPGPApplication(__in PCARD_DATA  pCardData);
28    
29  DWORD SCardSendCommand(__in PCARD_DATA  pCardData, __in PBYTE pbCmd, __in DWORD dwCmdSize)  DWORD OCardReconnect(__in PCARD_DATA  pCardData)
30    {
31            DWORD     dwAP;
32            DWORD dwReturn;
33            __try
34            {
35                    // reset the card
36                    Trace(WINEVENT_LEVEL_VERBOSE, L"Enter");
37                    dwReturn = SCardReconnect(pCardData->hScard,
38                             SCARD_SHARE_SHARED,
39                             SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1,
40                             SCARD_LEAVE_CARD,
41                             &dwAP );
42                    if (dwReturn)
43                    {
44                            Trace(WINEVENT_LEVEL_ERROR, L"SCardReconnect 0x%08X", dwReturn);
45                            __leave;
46                    }
47    
48                    dwReturn = SelectOpenPGPApplication(pCardData);
49            }
50            __finally
51            {
52            }
53            return dwReturn;
54    }
55    
56    DWORD OCardSendCommand(__in PCARD_DATA  pCardData, __in PBYTE pbCmd, __in DWORD dwCmdSize)
57  {  {
58          DWORD             dwReturn = 0;          DWORD             dwReturn = 0;
59    
# Line 46  DWORD SCardSendCommand(__in PCARD_DATA Line 74  DWORD SCardSendCommand(__in PCARD_DATA
74                                                                          &recvlen);                                                                          &recvlen);
75                  if ( dwReturn != SCARD_S_SUCCESS )                  if ( dwReturn != SCARD_S_SUCCESS )
76                  {                  {
77                            if (dwReturn == SCARD_W_RESET_CARD)
78                            {
79                                    dwReturn = OCardReconnect(pCardData);
80                                    if (dwReturn)
81                                    {
82                                            __leave;
83                                    }
84                                    dwReturn = OCardSendCommand(pCardData,pbCmd, dwCmdSize);
85                                    __leave;
86                            }
87                          Trace(WINEVENT_LEVEL_ERROR, L"SCardTransmit errorcode: [0x%02X]", dwReturn);                          Trace(WINEVENT_LEVEL_ERROR, L"SCardTransmit errorcode: [0x%02X]", dwReturn);
88                          __leave;                          __leave;
89                  }                  }
# Line 92  DWORD SelectOpenPGPApplication(__in PCAR Line 130  DWORD SelectOpenPGPApplication(__in PCAR
130                                          0x00                                          0x00
131                                          };                                          };
132                    
133          return SCardSendCommand(pCardData, pbCmd, sizeof(pbCmd));          return OCardSendCommand(pCardData, pbCmd, sizeof(pbCmd));
134  }  }
135    
136    
137  DWORD SCardGetData(__in PCARD_DATA  pCardData,  DWORD OCardGetData(__in PCARD_DATA  pCardData,
138                                          __in PBYTE pbCmd, __in DWORD dwCmdSize,                                          __in PBYTE pbCmd, __in DWORD dwCmdSize,
139                                          __in PBYTE* pbResponse, __in_opt PDWORD pdwResponseSize)                                          __in PBYTE* pbResponse, __in_opt PDWORD pdwResponseSize)
140  {  {
# Line 129  DWORD SCardGetData(__in PCARD_DATA  pCar Line 167  DWORD SCardGetData(__in PCARD_DATA  pCar
167                  {                  {
168                          if ( dwReturn != SCARD_S_SUCCESS )                          if ( dwReturn != SCARD_S_SUCCESS )
169                          {                          {
170                                    if (dwReturn == SCARD_W_RESET_CARD)
171                                    {
172                                            dwReturn = OCardReconnect(pCardData);
173                                            if (dwReturn)
174                                            {
175                                                    __leave;
176                                            }
177                                            dwReturn = OCardGetData(pCardData,pbCmd, dwCmdSize,pbResponse, pdwResponseSize);
178                                            __leave;
179                                    }
180                                  Trace(WINEVENT_LEVEL_ERROR, L"SCardTransmit errorcode: [0x%02X]", dwReturn);                                  Trace(WINEVENT_LEVEL_ERROR, L"SCardTransmit errorcode: [0x%02X]", dwReturn);
181                                  __leave;                                  __leave;
182                          }                          }
# Line 138  DWORD SCardGetData(__in PCARD_DATA  pCar Line 186  DWORD SCardGetData(__in PCARD_DATA  pCar
186                          {                          {
187                                  dwDataSize = recvlen-2;                                  dwDataSize = recvlen-2;
188                                  *pbResponse = pCardData->pfnCspAlloc(dwDataSize);                                  *pbResponse = pCardData->pfnCspAlloc(dwDataSize);
189                                    if (! *pbResponse)
190                                    {
191                                            Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_NO_MEMORY");
192                                            dwReturn = SCARD_E_NO_MEMORY;
193                                            __leave;
194                                    }
195                                  memcpy(*pbResponse, recvbuf, dwDataSize);                                  memcpy(*pbResponse, recvbuf, dwDataSize);
196                          }                          }
197                          else if (SW1 == 0x61)                          else if (SW1 == 0x61)
# Line 178  DWORD SCardGetData(__in PCARD_DATA  pCar Line 232  DWORD SCardGetData(__in PCARD_DATA  pCar
232                                  dwReturn = SCARD_E_FILE_NOT_FOUND;                                  dwReturn = SCARD_E_FILE_NOT_FOUND;
233                                  __leave;                                  __leave;
234                          }                          }
                         else if ( (SW1 == 0x69) && (SW2 == 0x85) )  
                         {  
                                 Trace(WINEVENT_LEVEL_ERROR, L"SCARD_W_SECURITY_VIOLATION");  
                                 dwReturn = SCARD_W_SECURITY_VIOLATION;  
                                 __leave;  
                         }  
235                          else                          else
236                          {                          {
237                                  TraceDump(WINEVENT_LEVEL_ERROR, pbCmd,dwCmdSize);                                  TraceDump(WINEVENT_LEVEL_ERROR, pbCmd,dwCmdSize);

Legend:
Removed from v.1  
changed lines
  Added in v.8

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26