winscard: add pcsc-lite helpers for upcoming implementation (try 2)
Mounir IDRASSI
mounir.idrassi at idrix.fr
Thu May 24 00:49:37 CDT 2007
Hi,
This version of the patch supersedes the previous one: It takes into
account the comments expressed on wine-devel about it.
Mounir IDRASSI
IDRIX - Cryptography and IT Security Experts
http://www.idrix.fr
-------------- next part --------------
>From 307c4ecf3e39b1604046aaf4e2d0f5c48b42134f Mon Sep 17 00:00:00 2001
From: Mounir IDRASSI <mounir.idrassi at idrix.fr>
Date: Thu, 24 May 2007 07:35:38 +0200
Subject: winscard: add pcsc-lite helpers for upcoming implementation
---
dlls/winscard/Makefile.in | 1 +
dlls/winscard/pcsclite_helper.c | 240 +++++++++++++++++++++++++++++++++++++++
dlls/winscard/pcsclite_helper.h | 79 +++++++++++++
dlls/winscard/winscard.c | 3 +
4 files changed, 323 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..7efffee
--- /dev/null
+++ b/dlls/winscard/pcsclite_helper.c
@@ -0,0 +1,240 @@
+/* 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
+ */
+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;
+ }
+}
diff --git a/dlls/winscard/pcsclite_helper.h b/dlls/winscard/pcsclite_helper.h
new file mode 100644
index 0000000..9d93520
--- /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;
+
+void 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