winscard: add pcsc-lite helpers for upcoming implementation

Mounir IDRASSI mounir.idrassi at idrix.fr
Wed May 23 21:54:29 CDT 2007


Hi,
This patch adds helper variables and functions that exposes pcsc-lite
functionalities for the use of the upcoming implementation.

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

-------------- next part --------------
>From 11f8dcadfd20d3ccddef6edfad4be747ef656d32 Mon Sep 17 00:00:00 2001
From: Mounir IDRASSI <mounir.idrassi at idrix.fr>
Date: Thu, 24 May 2007 04:37:13 +0200
Subject: winscard: add pcsc-lite helpers for upcoming implementation

---
 dlls/winscard/Makefile.in       |    1 +
 dlls/winscard/pcsclite_helper.c |  250 +++++++++++++++++++++++++++++++++++++++
 dlls/winscard/pcsclite_helper.h |   79 ++++++++++++
 dlls/winscard/winscard.c        |    3 +
 4 files changed, 333 insertions(+), 0 deletions(-)

diff --git a/dlls/winscard/Makefile.in b/dlls/winscard/Makefile.in
index de8a2b6..4684e50 100644
--- a/dlls/winscard/Makefile.in
+++ b/dlls/winscard/Makefile.in
@@ -7,6 +7,7 @@ IMPORTLIB = libwinscard.$(IMPLIBEXT)
 IMPORTS   = kernel32
 
 C_SRCS = \
+	pcsclite_helper.c \
 	winscard.c
 
 RC_SRCS = \
diff --git a/dlls/winscard/pcsclite_helper.c b/dlls/winscard/pcsclite_helper.c
new file mode 100644
index 0000000..8f34a18
--- /dev/null
+++ b/dlls/winscard/pcsclite_helper.c
@@ -0,0 +1,250 @@
+/*      PCSCLite helper functions and variables
+ *
+ * Copyright 2007 Mounir IDRASSI  (mounir.idrassi at idrix.fr, for IDRIX)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "config.h"
+#include "wine/port.h"
+#include <stdarg.h>
+#include "windef.h"
+#include "winbase.h"
+#include "wine/debug.h"
+#include "wine/library.h"
+#include <winscard.h>
+#include "pcsclite_helper.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(winscard);
+
+SCardEstablishContextPtr    liteSCardEstablishContext = NULL;
+SCardReleaseContextPtr      liteSCardReleaseContext = NULL;
+SCardIsValidContextPtr      liteSCardIsValidContext = NULL;
+SCardSetTimeoutPtr          liteSCardSetTimeout = NULL;
+SCardConnectPtr             liteSCardConnect = NULL;
+SCardReconnectPtr           liteSCardReconnect = NULL;
+SCardDisconnectPtr          liteSCardDisconnect = NULL;		
+SCardBeginTransactionPtr    liteSCardBeginTransaction = NULL;
+SCardEndTransactionPtr      liteSCardEndTransaction = NULL;
+SCardCancelTransactionPtr   liteSCardCancelTransaction = NULL;
+SCardStatusPtr              liteSCardStatus = NULL;
+SCardGetStatusChangePtr     liteSCardGetStatusChange = NULL;
+SCardControlPtr             liteSCardControl = NULL;
+SCardTransmitPtr            liteSCardTransmit = NULL;
+SCardListReaderGroupsPtr    liteSCardListReaderGroups = NULL;
+SCardListReadersPtr         liteSCardListReaders = NULL;
+SCardCancelPtr              liteSCardCancel = NULL;
+SCardGetAttribPtr           liteSCardGetAttrib = NULL;
+SCardSetAttribPtr           liteSCardSetAttrib = NULL;
+
+static void* g_pcscliteHandle = NULL;
+
+/*
+ * Initialize pcsclite functions pointers
+ */
+BOOL InitializePCSCLite(void)
+{
+    BOOL bSuccess = FALSE;
+    if (g_pcscliteHandle)
+        bSuccess = TRUE; /*already loaded*/
+    else
+    {
+        /* try to load pcsc-lite */
+        char szErr[256];
+        g_pcscliteHandle = wine_dlopen("libpcsclite.so",RTLD_LAZY | RTLD_GLOBAL,szErr,sizeof(szErr));
+        if (!g_pcscliteHandle)
+        {
+            /* error occured*/
+            WARN("loading libpcsclite.so failed.Error = %s \n",szErr);
+        }
+        else
+        {
+            /* loading entry points*/
+            bSuccess = TRUE;
+            if (bSuccess && 
+                !(liteSCardEstablishContext = (SCardEstablishContextPtr) wine_dlsym(g_pcscliteHandle,"SCardEstablishContext",szErr,sizeof(szErr))))
+            {
+                bSuccess = FALSE;
+                ERR("Failed to get SCardEstablishContext from pcsclite library. Error = %s\n",szErr);
+            }
+
+            if (bSuccess && 
+                !(liteSCardReleaseContext = (SCardReleaseContextPtr) wine_dlsym(g_pcscliteHandle,"SCardReleaseContext",szErr,sizeof(szErr))))
+            {
+                bSuccess = FALSE;
+                ERR("Failed to get SCardReleaseContext from pcsclite library. Error = %s\n",szErr);
+            }		
+
+            if (bSuccess &&
+                !(liteSCardIsValidContext = (SCardIsValidContextPtr) wine_dlsym(g_pcscliteHandle,"SCardIsValidContext",szErr,sizeof(szErr))))
+            {
+                bSuccess = FALSE;
+                ERR("Failed to get SCardIsValidContext from pcsclite library. Error = %s\n",szErr);
+            }				
+
+            if (bSuccess &&
+                !(liteSCardSetTimeout = (SCardSetTimeoutPtr) wine_dlsym(g_pcscliteHandle,"SCardSetTimeout",szErr,sizeof(szErr))))
+            {
+                bSuccess = FALSE;
+                ERR("Failed to get SCardSetTimeout from pcsclite library. Error = %s\n",szErr);
+            }
+
+            if (bSuccess && 
+                !(liteSCardConnect = (SCardConnectPtr) wine_dlsym(g_pcscliteHandle,"SCardConnect",szErr,sizeof(szErr))))
+            {
+                bSuccess = FALSE;
+                ERR("Failed to get SCardConnect from pcsclite library. Error = %s\n",szErr);
+            }			
+
+            if (bSuccess &&
+                !(liteSCardReconnect = (SCardReconnectPtr) wine_dlsym(g_pcscliteHandle,"SCardReconnect",szErr,sizeof(szErr))))
+            {
+                bSuccess = FALSE;
+                ERR("Failed to get SCardReconnect from pcsclite library. Error = %s\n",szErr);
+            }		
+
+            if (bSuccess &&
+                !(liteSCardDisconnect = (SCardDisconnectPtr) wine_dlsym(g_pcscliteHandle,"SCardDisconnect",szErr,sizeof(szErr))))
+            {
+                bSuccess = FALSE;
+                ERR("Failed to get SCardDisconnect from pcsclite library. Error = %s\n",szErr);
+            }			
+
+            if (bSuccess &&
+                !(liteSCardBeginTransaction = (SCardBeginTransactionPtr) wine_dlsym(g_pcscliteHandle,"SCardBeginTransaction",szErr,sizeof(szErr))))
+            {
+                bSuccess = FALSE;
+                ERR("Failed to get SCardBeginTransaction from pcsclite library. Error = %s\n",szErr);
+            }		
+
+            if (bSuccess &&
+                !(liteSCardEndTransaction = (SCardEndTransactionPtr) wine_dlsym(g_pcscliteHandle,"SCardEndTransaction",szErr,sizeof(szErr))))
+            {
+                bSuccess = FALSE;
+                ERR("Failed to get SCardEndTransaction from pcsclite library. Error = %s\n",szErr);
+            }		
+
+            if (bSuccess &&
+                !(liteSCardCancelTransaction = (SCardCancelTransactionPtr) wine_dlsym(g_pcscliteHandle,"SCardCancelTransaction",szErr,sizeof(szErr))))
+            {
+                bSuccess = FALSE;
+                ERR("Failed to get SCardCancelTransaction from pcsclite library. Error = %s\n",szErr);
+            }
+
+            if (bSuccess &&
+                !(liteSCardStatus = (SCardStatusPtr) wine_dlsym(g_pcscliteHandle,"SCardStatus",szErr,sizeof(szErr))))
+            {
+                bSuccess = FALSE;
+                ERR("Failed to get SCardStatus from pcsclite library. Error = %s\n",szErr);
+            }
+
+            if (bSuccess &&
+                !(liteSCardGetStatusChange = (SCardGetStatusChangePtr) wine_dlsym(g_pcscliteHandle,"SCardGetStatusChange",szErr,sizeof(szErr))))
+            {
+                bSuccess = FALSE;
+                ERR("Failed to get SCardGetStatusChange from pcsclite library. Error = %s\n",szErr);
+            }
+
+            if (bSuccess &&
+                !(liteSCardControl = (SCardControlPtr) wine_dlsym(g_pcscliteHandle,"SCardControl",szErr,sizeof(szErr))))
+            {
+                bSuccess = FALSE;
+                ERR("Failed to get SCardControl from pcsclite library. Error = %s\n",szErr);
+            }		
+
+            if (bSuccess &&
+                !(liteSCardTransmit = (SCardTransmitPtr) wine_dlsym(g_pcscliteHandle,"SCardTransmit",szErr,sizeof(szErr))))
+            {
+                bSuccess = FALSE;
+                ERR("Failed to get SCardTransmit from pcsclite library. Error = %s\n",szErr);
+            }					
+
+            if (bSuccess &&
+                !(liteSCardListReaderGroups = (SCardListReaderGroupsPtr) wine_dlsym(g_pcscliteHandle,"SCardListReaderGroups",szErr,sizeof(szErr))))
+            {
+                bSuccess = FALSE;
+                ERR("Failed to get SCardListReaderGroups from pcsclite library. Error = %s\n",szErr);
+            }	
+
+            if (bSuccess &&
+                !(liteSCardListReaders = (SCardListReadersPtr) wine_dlsym(g_pcscliteHandle,"SCardListReaders",szErr,sizeof(szErr))))
+            {
+                bSuccess = FALSE;
+                ERR("Failed to get SCardListReaders from pcsclite library. Error = %s\n",szErr);
+            }	
+
+            if (bSuccess &&
+                !(liteSCardCancel = (SCardCancelPtr) wine_dlsym(g_pcscliteHandle,"SCardCancel",szErr,sizeof(szErr))))
+            {
+                bSuccess = FALSE;
+                ERR("Failed to get SCardCancel from pcsclite library. Error = %s\n",szErr);
+            }	
+
+            if (bSuccess &&
+                !(liteSCardGetAttrib = (SCardGetAttribPtr) wine_dlsym(g_pcscliteHandle,"SCardGetAttrib",szErr,sizeof(szErr))))
+            {
+                bSuccess = FALSE;
+                ERR("Failed to get SCardGetAttrib from pcsclite library. Error = %s\n",szErr);
+            }	
+
+            if (bSuccess &&
+                !(liteSCardSetAttrib = (SCardSetAttribPtr) wine_dlsym(g_pcscliteHandle,"SCardSetAttrib",szErr,sizeof(szErr))))
+            {
+                bSuccess = FALSE;
+                ERR("Failed to get SCardSetAttrib from pcsclite library. Error = %s\n",szErr);
+            }	
+
+            if (!bSuccess)
+            {
+                /* a entry point is missing. unload the library */
+                wine_dlclose(g_pcscliteHandle,NULL,0);
+                g_pcscliteHandle = NULL;
+            }
+        }
+    }
+	
+    return bSuccess;
+}
+
+/*
+ * Release pcsclite library references
+ */
+void FinalizePCSCLite(void)
+{
+    if (g_pcscliteHandle)
+    {
+        liteSCardEstablishContext   = NULL;
+        liteSCardReleaseContext     = NULL;
+        liteSCardIsValidContext     = NULL;
+        liteSCardSetTimeout         = NULL;
+        liteSCardConnect            = NULL;
+        liteSCardReconnect          = NULL;
+        liteSCardDisconnect         = NULL;		
+        liteSCardBeginTransaction   = NULL;
+        liteSCardEndTransaction     = NULL;
+        liteSCardCancelTransaction  = NULL;
+        liteSCardStatus             = NULL;
+        liteSCardGetStatusChange    = NULL;
+        liteSCardControl            = NULL;
+        liteSCardTransmit           = NULL;
+        liteSCardListReaderGroups   = NULL;
+        liteSCardListReaders        = NULL;
+        liteSCardCancel             = NULL;
+        liteSCardGetAttrib          = NULL;
+        liteSCardSetAttrib          = NULL;	
+        wine_dlclose(g_pcscliteHandle,NULL,0);	
+        g_pcscliteHandle = NULL;			
+    }
+}
diff --git a/dlls/winscard/pcsclite_helper.h b/dlls/winscard/pcsclite_helper.h
new file mode 100644
index 0000000..79d8b2a
--- /dev/null
+++ b/dlls/winscard/pcsclite_helper.h
@@ -0,0 +1,79 @@
+/*      PCSCLite helper functions and variables
+ *
+ * Copyright 2007 Mounir IDRASSI  (mounir.idrassi at idrix.fr, for IDRIX)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _WINE_PCSCLITE_HELPER
+#define _WINE_PCSCLITE_HELPER
+
+/*
+  * pcsc-lite functions pointers
+  */
+typedef LONG (*SCardEstablishContextPtr)(DWORD dwScope,LPCVOID pvReserved1,
+    LPCVOID pvReserved2, LPSCARDCONTEXT phContext);
+typedef LONG (*SCardReleaseContextPtr)(SCARDCONTEXT hContext);
+typedef LONG (*SCardIsValidContextPtr)(SCARDCONTEXT hContext);
+typedef LONG (*SCardSetTimeoutPtr)(SCARDCONTEXT hContext, DWORD dwTimeout);
+typedef LONG (*SCardConnectPtr)(SCARDCONTEXT hContext,LPCSTR szReader,DWORD dwShareMode,
+    DWORD dwPreferredProtocols,LPSCARDHANDLE phCard, LPDWORD pdwActiveProtocol);
+typedef LONG (*SCardReconnectPtr)(SCARDHANDLE hCard,DWORD dwShareMode,
+    DWORD dwPreferredProtocols,DWORD dwInitialization, LPDWORD pdwActiveProtocol);
+typedef LONG (*SCardDisconnectPtr)(SCARDHANDLE hCard, DWORD dwDisposition);
+typedef LONG (*SCardBeginTransactionPtr)(SCARDHANDLE hCard);
+typedef LONG (*SCardEndTransactionPtr)(SCARDHANDLE hCard, DWORD dwDisposition);
+typedef LONG (*SCardCancelTransactionPtr)(SCARDHANDLE hCard);
+typedef LONG (*SCardStatusPtr)(SCARDHANDLE hCard,LPSTR mszReaderNames, LPDWORD pcchReaderLen,
+    LPDWORD pdwState,LPDWORD pdwProtocol,BYTE* pbAtr,LPDWORD pcbAtrLen);
+typedef LONG (*SCardGetStatusChangePtr)(SCARDCONTEXT hContext,DWORD dwTimeout,
+    LPSCARD_READERSTATEA rgReaderStates, DWORD cReaders);
+typedef LONG (*SCardControlPtr)(SCARDHANDLE hCard, DWORD dwControlCode,	LPCVOID pbSendBuffer, 
+    DWORD cbSendLength,LPVOID pbRecvBuffer, DWORD cbRecvLength, LPDWORD lpBytesReturned);
+typedef LONG (*SCardTransmitPtr)(SCARDHANDLE hCard,LPCSCARD_IO_REQUEST pioSendPci,
+    const BYTE* pbSendBuffer, DWORD cbSendLength,
+    LPSCARD_IO_REQUEST pioRecvPci, BYTE* pbRecvBuffer, LPDWORD pcbRecvLength);
+typedef LONG (*SCardListReaderGroupsPtr)(SCARDCONTEXT hContext,LPSTR mszGroups, LPDWORD pcchGroups);
+typedef LONG (*SCardListReadersPtr)(SCARDCONTEXT hContext,LPCSTR mszGroups,
+    LPSTR mszReaders, LPDWORD pcchReaders);
+typedef LONG (*SCardCancelPtr)(SCARDCONTEXT hContext);
+typedef LONG (*SCardGetAttribPtr)(SCARDHANDLE hCard, DWORD dwAttrId,BYTE* pbAttr, LPDWORD pcbAttrLen);
+typedef LONG (*SCardSetAttribPtr)(SCARDHANDLE hCard, DWORD dwAttrId,const BYTE* pbAttr, DWORD cbAttrLen);  
+		
+extern SCardEstablishContextPtr    liteSCardEstablishContext;
+extern SCardReleaseContextPtr      liteSCardReleaseContext;
+extern SCardIsValidContextPtr      liteSCardIsValidContext;
+extern SCardSetTimeoutPtr          liteSCardSetTimeout;
+extern SCardConnectPtr             liteSCardConnect;
+extern SCardReconnectPtr           liteSCardReconnect;
+extern SCardDisconnectPtr          liteSCardDisconnect;		
+extern SCardBeginTransactionPtr    liteSCardBeginTransaction;
+extern SCardEndTransactionPtr      liteSCardEndTransaction;
+extern SCardCancelTransactionPtr   liteSCardCancelTransaction;
+extern SCardStatusPtr              liteSCardStatus;
+extern SCardGetStatusChangePtr     liteSCardGetStatusChange;
+extern SCardControlPtr             liteSCardControl;
+extern SCardTransmitPtr            liteSCardTransmit;
+extern SCardListReaderGroupsPtr    liteSCardListReaderGroups;
+extern SCardListReadersPtr         liteSCardListReaders;
+extern SCardCancelPtr              liteSCardCancel;
+extern SCardGetAttribPtr           liteSCardGetAttrib;
+extern SCardSetAttribPtr           liteSCardSetAttrib;
+
+BOOL InitializePCSCLite(void);
+void FinalizePCSCLite(void);
+
+#endif
+
diff --git a/dlls/winscard/winscard.c b/dlls/winscard/winscard.c
index d24e0f9..9561485 100644
--- a/dlls/winscard/winscard.c
+++ b/dlls/winscard/winscard.c
@@ -22,6 +22,7 @@
 #include "winbase.h"
 #include "wine/debug.h"
 #include <winscard.h>
+#include "pcsclite_helper.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(winscard);
 
@@ -42,9 +43,11 @@ BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
         {
             DisableThreadLibraryCalls(hinstDLL);
             WINSCARD_hModule = hinstDLL;
+            InitializePCSCLite();
             break;
         }
         case DLL_PROCESS_DETACH:
+            FinalizePCSCLite();
             break;
     }
 
-- 
1.4.4.2



More information about the wine-patches mailing list