winscard [2/3]: implement pcsclite helper functions InitializePCSCLite and FinalizePCSCLite

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


Hi,
This patch adds implementation of the functions InitializePCSCLite and
FinalizePCSCLite.

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

-------------- next part --------------
>From 6e7a973a7dadea8ebe02aec1f08f3c5100c5c718 Mon Sep 17 00:00:00 2001
From: Mounir IDRASSI <mounir.idrassi at idrix.fr>
Date: Fri, 25 May 2007 14:39:11 +0200
Subject: winscard: implement pcsclite helper functions InitializePCSCLite and FinalizePCSCLite

---
 dlls/winscard/Makefile.in       |    1 +
 dlls/winscard/pcsclite_helper.c |  264 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 265 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..bafa1e8
--- /dev/null
+++ b/dlls/winscard/pcsclite_helper.c
@@ -0,0 +1,264 @@
+/*      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);
+
+/*
+ *  pcsc-lite function pointers definitions
+ */
+typedef long (*SCardEstablishContextPtr)(unsigned long,LPCVOID,LPCVOID,LPWINE_SCARDCONTEXT);
+typedef long (*SCardReleaseContextPtr)(WINE_SCARDCONTEXT);
+typedef long (*SCardIsValidContextPtr)(WINE_SCARDCONTEXT);
+typedef long (*SCardSetTimeoutPtr)(WINE_SCARDCONTEXT,unsigned long);
+typedef long (*SCardConnectPtr)(WINE_SCARDCONTEXT,LPCSTR,unsigned long,unsigned long,LPWINE_SCARDHANDLE,unsigned long*);
+typedef long (*SCardReconnectPtr)(WINE_SCARDHANDLE,unsigned long,unsigned long,unsigned long,unsigned long*);
+typedef long (*SCardDisconnectPtr)(WINE_SCARDHANDLE,unsigned long);
+typedef long (*SCardBeginTransactionPtr)(WINE_SCARDHANDLE);
+typedef long (*SCardEndTransactionPtr)(WINE_SCARDHANDLE,unsigned long);
+typedef long (*SCardCancelTransactionPtr)(WINE_SCARDHANDLE);
+typedef long (*SCardStatusPtr)(WINE_SCARDHANDLE,LPSTR,unsigned long*,unsigned long*,unsigned long*,LPBYTE,unsigned long*);
+typedef long (*SCardGetStatusChangePtr)(WINE_SCARDCONTEXT,unsigned long,LPWINE_SCARD_READERSTATE,unsigned long);
+typedef long (*SCardControlPtr)(WINE_SCARDHANDLE,unsigned long,LPCVOID,unsigned long,LPVOID,unsigned long,unsigned long*);
+typedef long (*SCardTransmitPtr)(WINE_SCARDHANDLE,LPCWINE_SCARD_IO_REQUEST,LPCBYTE,unsigned long,LPWINE_SCARD_IO_REQUEST,LPBYTE,unsigned long*);
+typedef long (*SCardListReaderGroupsPtr)(WINE_SCARDCONTEXT,LPSTR,unsigned long*);
+typedef long (*SCardListReadersPtr)(WINE_SCARDCONTEXT,LPCSTR,LPSTR,unsigned long*);
+typedef long (*SCardCancelPtr)(WINE_SCARDCONTEXT);
+typedef long (*SCardGetAttribPtr)(WINE_SCARDHANDLE,unsigned long,LPBYTE,unsigned long*);
+typedef long (*SCardSetAttribPtr)(WINE_SCARDHANDLE,unsigned long,LPCBYTE,unsigned long);  
+
+static SCardEstablishContextPtr    liteSCardEstablishContext = NULL;
+static SCardReleaseContextPtr      liteSCardReleaseContext = NULL;
+static SCardIsValidContextPtr      liteSCardIsValidContext = NULL;
+static SCardSetTimeoutPtr          liteSCardSetTimeout = NULL;
+static SCardConnectPtr             liteSCardConnect = NULL;
+static SCardReconnectPtr           liteSCardReconnect = NULL;
+static SCardDisconnectPtr          liteSCardDisconnect = NULL;		
+static SCardBeginTransactionPtr    liteSCardBeginTransaction = NULL;
+static SCardEndTransactionPtr      liteSCardEndTransaction = NULL;
+static SCardCancelTransactionPtr   liteSCardCancelTransaction = NULL;
+static SCardStatusPtr              liteSCardStatus = NULL;
+static SCardGetStatusChangePtr     liteSCardGetStatusChange = NULL;
+static SCardControlPtr             liteSCardControl = NULL;
+static SCardTransmitPtr            liteSCardTransmit = NULL;
+static SCardListReaderGroupsPtr    liteSCardListReaderGroups = NULL;
+static SCardListReadersPtr         liteSCardListReaders = NULL;
+static SCardCancelPtr              liteSCardCancel = NULL;
+static SCardGetAttribPtr           liteSCardGetAttrib = NULL;
+static SCardSetAttribPtr           liteSCardSetAttrib = NULL;
+
+static void* g_pcscliteHandle = NULL;
+
+/*
+ * Initialize pcsclite functions pointers
+ */
+void InitializePCSCLite(void)
+{
+    BOOL bSuccess = FALSE;
+    char szErr[256];
+    /* try to load pcsc-lite */
+    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*/
+        liteSCardEstablishContext = wine_dlsym(g_pcscliteHandle,"SCardEstablishContext",szErr,sizeof(szErr));
+        if (!liteSCardEstablishContext)
+        {
+            ERR("Failed to get SCardEstablishContext from pcsclite library. Error = %s\n",szErr);
+            goto end;
+        }
+
+        liteSCardReleaseContext = wine_dlsym(g_pcscliteHandle,"SCardReleaseContext",szErr,sizeof(szErr));
+        if (!liteSCardReleaseContext)
+        {
+            ERR("Failed to get SCardReleaseContext from pcsclite library. Error = %s\n",szErr);
+            goto end;
+        }		
+
+        liteSCardIsValidContext = wine_dlsym(g_pcscliteHandle,"SCardIsValidContext",szErr,sizeof(szErr));
+        if (!liteSCardIsValidContext)
+        {
+            ERR("Failed to get SCardIsValidContext from pcsclite library. Error = %s\n",szErr);
+            goto end;
+        }				
+
+        liteSCardSetTimeout = wine_dlsym(g_pcscliteHandle,"SCardSetTimeout",szErr,sizeof(szErr));
+        if (!liteSCardSetTimeout)
+        {
+            ERR("Failed to get SCardSetTimeout from pcsclite library. Error = %s\n",szErr);
+            goto end;
+        }
+
+        liteSCardConnect = wine_dlsym(g_pcscliteHandle,"SCardConnect",szErr,sizeof(szErr));
+        if (!liteSCardConnect)
+        {
+            ERR("Failed to get SCardConnect from pcsclite library. Error = %s\n",szErr);
+            goto end;
+        }			
+
+        liteSCardReconnect = wine_dlsym(g_pcscliteHandle,"SCardReconnect",szErr,sizeof(szErr));
+        if (!liteSCardReconnect)
+        {
+            ERR("Failed to get SCardReconnect from pcsclite library. Error = %s\n",szErr);
+            goto end;
+        }		
+
+        liteSCardDisconnect = wine_dlsym(g_pcscliteHandle,"SCardDisconnect",szErr,sizeof(szErr));
+        if (!liteSCardDisconnect)
+        {
+            ERR("Failed to get SCardDisconnect from pcsclite library. Error = %s\n",szErr);
+            goto end;
+        }			
+
+        liteSCardBeginTransaction = wine_dlsym(g_pcscliteHandle,"SCardBeginTransaction",szErr,sizeof(szErr));
+        if (!liteSCardBeginTransaction)
+        {
+            ERR("Failed to get SCardBeginTransaction from pcsclite library. Error = %s\n",szErr);
+            goto end;
+        }		
+
+        liteSCardEndTransaction = wine_dlsym(g_pcscliteHandle,"SCardEndTransaction",szErr,sizeof(szErr));
+        if (!liteSCardEndTransaction)
+        {
+            ERR("Failed to get SCardEndTransaction from pcsclite library. Error = %s\n",szErr);
+            goto end;
+        }		
+
+        liteSCardCancelTransaction = wine_dlsym(g_pcscliteHandle,"SCardCancelTransaction",szErr,sizeof(szErr));
+        if (!liteSCardCancelTransaction)
+        {
+            ERR("Failed to get SCardCancelTransaction from pcsclite library. Error = %s\n",szErr);
+            goto end;
+        }
+
+        liteSCardStatus = wine_dlsym(g_pcscliteHandle,"SCardStatus",szErr,sizeof(szErr));
+        if (!liteSCardStatus)
+        {
+            ERR("Failed to get SCardStatus from pcsclite library. Error = %s\n",szErr);
+            goto end;
+        }
+
+        liteSCardGetStatusChange = wine_dlsym(g_pcscliteHandle,"SCardGetStatusChange",szErr,sizeof(szErr));
+        if (!liteSCardGetStatusChange)
+        {
+            ERR("Failed to get SCardGetStatusChange from pcsclite library. Error = %s\n",szErr);
+            goto end;
+        }
+
+        liteSCardControl = wine_dlsym(g_pcscliteHandle,"SCardControl",szErr,sizeof(szErr));
+        if (!liteSCardControl)
+        {
+            ERR("Failed to get SCardControl from pcsclite library. Error = %s\n",szErr);
+            goto end;
+        }		
+
+        liteSCardTransmit = wine_dlsym(g_pcscliteHandle,"SCardTransmit",szErr,sizeof(szErr));
+        if (!liteSCardTransmit)
+        {
+            ERR("Failed to get SCardTransmit from pcsclite library. Error = %s\n",szErr);
+            goto end;
+        }					
+
+        liteSCardListReaderGroups = wine_dlsym(g_pcscliteHandle,"SCardListReaderGroups",szErr,sizeof(szErr));
+        if (!liteSCardListReaderGroups)
+        {
+            ERR("Failed to get SCardListReaderGroups from pcsclite library. Error = %s\n",szErr);
+            goto end;
+        }	
+
+        liteSCardListReaders = wine_dlsym(g_pcscliteHandle,"SCardListReaders",szErr,sizeof(szErr));
+        if (!liteSCardListReaders)
+        {
+            ERR("Failed to get SCardListReaders from pcsclite library. Error = %s\n",szErr);
+            goto end;
+        }	
+
+        liteSCardCancel = wine_dlsym(g_pcscliteHandle,"SCardCancel",szErr,sizeof(szErr));
+        if (!liteSCardCancel)
+        {
+            ERR("Failed to get SCardCancel from pcsclite library. Error = %s\n",szErr);
+            goto end;
+        }	
+
+        liteSCardGetAttrib = wine_dlsym(g_pcscliteHandle,"SCardGetAttrib",szErr,sizeof(szErr));
+        if (!liteSCardGetAttrib)
+        {
+            ERR("Failed to get SCardGetAttrib from pcsclite library. Error = %s\n",szErr);
+            goto end;
+        }	
+
+        liteSCardSetAttrib = wine_dlsym(g_pcscliteHandle,"SCardSetAttrib",szErr,sizeof(szErr));
+        if (!liteSCardSetAttrib)
+        {
+            ERR("Failed to get SCardSetAttrib from pcsclite library. Error = %s\n",szErr);
+            goto end;
+        }
+        bSuccess = TRUE;
+    }
+
+end:
+    if (!bSuccess)
+        FinalizePCSCLite();
+}
+
+/*
+ * 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;			
+    }
+}
+
-- 
1.4.4.2



More information about the wine-patches mailing list