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