winscard [3/3]: implement part of pcsclite compatibility helpers

Mounir IDRASSI mounir.idrassi at idrix.fr
Fri May 25 07:52:42 CDT 2007


Hi,
This patch starts the implementation of the pcsc-lite compatibility
functions.

Mounir IDRASSI
IDRIX - Cryptography and IT Security Experts
http://www.idrix.fr

-------------- next part --------------
>From f9d480a47a69765a7c96281f1b48dd1066de2ba2 Mon Sep 17 00:00:00 2001
From: Mounir IDRASSI <mounir.idrassi at idrix.fr>
Date: Fri, 25 May 2007 14:41:25 +0200
Subject: winscard: implement part of pcsclite compatibility helpers

---
 dlls/winscard/pcsclite_helper.c |  139 +++++++++++++++++++++++++++++++++++++++
 1 files changed, 139 insertions(+), 0 deletions(-)

diff --git a/dlls/winscard/pcsclite_helper.c b/dlls/winscard/pcsclite_helper.c
index bafa1e8..8b87f56 100644
--- a/dlls/winscard/pcsclite_helper.c
+++ b/dlls/winscard/pcsclite_helper.c
@@ -75,6 +75,27 @@ static SCardSetAttribPtr           liteSCardSetAttrib = NULL;
 static void* g_pcscliteHandle = NULL;
 
 /*
+ * translate PCSC-lite errors to equivalent MS ones
+ * Actually, the only difference is for SCARD_W_INSERTED_CARD(0x8010006A) and
+ * SCARD_E_UNSUPPORTED_FEATURE (0x8010001F)
+ */
+
+#define PCSCLITE_SCARD_W_INSERTED_CARD          0x8010006A
+#define PCSCLITE_SCARD_E_UNSUPPORTED_FEATURE    0x8010001F
+
+static LONG TranslateToWin32(long lRet)
+{
+    if(lRet == PCSCLITE_SCARD_E_UNSUPPORTED_FEATURE)
+        return SCARD_E_UNSUPPORTED_FEATURE;
+    else if(lRet == PCSCLITE_SCARD_W_INSERTED_CARD)
+        return SCARD_F_UNKNOWN_ERROR; /* FIXME: is there a better WIN32 error code */
+    else
+        return (LONG) lRet;
+}
+
+#define PCSCLITE_SCARD_PROTOCOL_RAW	0x00000004
+
+/*
  * Initialize pcsclite functions pointers
  */
 void InitializePCSCLite(void)
@@ -262,3 +283,121 @@ void FinalizePCSCLite(void)
     }
 }
 
+LONG compatSCardEstablishContext(DWORD dwScope,LPCVOID pvReserved1,LPCVOID pvReserved2, LPSCARDCONTEXT phContext)
+{
+    WINE_SCARDCONTEXT hLiteContext = 0;
+    if (!liteSCardEstablishContext)
+        return (LONG) SCARD_F_INTERNAL_ERROR;
+    else if (!phContext)
+        return (LONG) SCARD_E_INVALID_PARAMETER;
+    else
+    {
+        long lRet = liteSCardEstablishContext((unsigned long) dwScope,pvReserved1,pvReserved2,&hLiteContext);
+        if (lRet == SCARD_S_SUCCESS)
+            *phContext = (SCARDCONTEXT) hLiteContext;
+        return TranslateToWin32(lRet);
+    }
+}
+
+LONG compatSCardReleaseContext(SCARDCONTEXT hContext)
+{
+    long lRet;
+    if (!liteSCardReleaseContext)
+        return (LONG) SCARD_F_INTERNAL_ERROR;
+    lRet = liteSCardReleaseContext((WINE_SCARDCONTEXT) hContext);
+    return TranslateToWin32(lRet);
+}
+
+LONG compatSCardIsValidContext(SCARDCONTEXT hContext)
+{
+    long lRet;
+    if (!liteSCardIsValidContext)
+        return (LONG) SCARD_F_INTERNAL_ERROR;
+    lRet = liteSCardIsValidContext((WINE_SCARDCONTEXT) hContext);
+    return TranslateToWin32(lRet);
+}
+
+LONG compatSCardSetTimeout(SCARDCONTEXT hContext, DWORD dwTimeout)
+{
+    long lRet;
+    if (!liteSCardSetTimeout)
+        return (LONG) SCARD_F_INTERNAL_ERROR;
+    lRet = liteSCardSetTimeout((WINE_SCARDCONTEXT) hContext, (unsigned long) dwTimeout);
+    return TranslateToWin32(lRet);
+}
+
+LONG compatSCardConnect(SCARDCONTEXT hContext, LPCSTR szReader, DWORD dwShareMode,
+    DWORD dwPreferredProtocols, LPSCARDHANDLE phCard, LPDWORD pdwActiveProtocol)
+{
+    long lRet;
+    unsigned long dwLiteProtocols = (unsigned long) dwPreferredProtocols;
+    unsigned long dwLiteActiveProtocol;
+    WINE_SCARDHANDLE hLiteCard;
+
+    if (!liteSCardConnect)
+        return (LONG) SCARD_F_INTERNAL_ERROR;
+    if (!phCard)
+        return (LONG) SCARD_E_INVALID_PARAMETER;
+    /* the value of SCARD_PROTOCOL_RAW is different between MS implementation and
+     * pcsc-lite implementation. We must change its value
+     */
+    if (dwLiteProtocols & SCARD_PROTOCOL_RAW)
+    {
+        dwLiteProtocols ^= SCARD_PROTOCOL_RAW;
+        dwLiteProtocols |= PCSCLITE_SCARD_PROTOCOL_RAW;
+    }
+    lRet = liteSCardConnect((WINE_SCARDCONTEXT) hContext,szReader,(unsigned long) dwShareMode,
+        dwLiteProtocols,&hLiteCard,&dwLiteActiveProtocol);
+    if (lRet == SCARD_S_SUCCESS)
+    {
+        *phCard = (SCARDHANDLE) hLiteCard;
+        if (pdwActiveProtocol)
+        {
+            if (dwLiteActiveProtocol & PCSCLITE_SCARD_PROTOCOL_RAW)
+            {
+                dwLiteActiveProtocol ^= PCSCLITE_SCARD_PROTOCOL_RAW;
+                dwLiteActiveProtocol |= SCARD_PROTOCOL_RAW;
+            }         
+            *pdwActiveProtocol = dwLiteActiveProtocol;
+        }
+    }
+    return TranslateToWin32(lRet);
+}
+
+LONG compatSCardReconnect(SCARDHANDLE hCard,DWORD dwShareMode,DWORD dwPreferredProtocols,
+    DWORD dwInitialization, LPDWORD pdwActiveProtocol)
+{
+    long lRet;
+    unsigned long dwLiteProtocols = (unsigned long) dwPreferredProtocols;
+    unsigned long dwLiteActiveProtocol;    
+
+    if (!liteSCardReconnect)
+        return (LONG) SCARD_F_INTERNAL_ERROR;
+    if (dwLiteProtocols & SCARD_PROTOCOL_RAW)
+    {
+        dwLiteProtocols ^= SCARD_PROTOCOL_RAW;
+        dwLiteProtocols |= PCSCLITE_SCARD_PROTOCOL_RAW;
+    }
+    lRet = liteSCardReconnect((WINE_SCARDHANDLE) hCard,(unsigned long) dwShareMode,
+        dwLiteProtocols, (unsigned long) dwInitialization,&dwLiteActiveProtocol);
+    if (lRet == SCARD_S_SUCCESS && pdwActiveProtocol)
+    {
+        if (dwLiteActiveProtocol & PCSCLITE_SCARD_PROTOCOL_RAW)
+        {
+            dwLiteActiveProtocol ^= PCSCLITE_SCARD_PROTOCOL_RAW;
+            dwLiteActiveProtocol |= SCARD_PROTOCOL_RAW;
+        }         
+        *pdwActiveProtocol = dwLiteActiveProtocol;        
+    }
+    return TranslateToWin32(lRet);
+}
+
+LONG compatSCardDisconnect(SCARDHANDLE hCard, DWORD dwDisposition)
+{
+    long lRet;
+    if (!liteSCardDisconnect)
+        return (LONG) SCARD_F_INTERNAL_ERROR;
+    lRet = liteSCardDisconnect((WINE_SCARDHANDLE) hCard, (unsigned long) dwDisposition);
+    return TranslateToWin32(lRet);
+}
+
-- 
1.4.4.2



More information about the wine-patches mailing list