Hi all, Followings your comments, I have rewritten the header files and split winscard.c into smaller files. You'll find attached with this email a patch containing only the headers and a skeleton for this dll. Once integrated into the source tree, I'll provide another patch (or patches) containing the rest of the implementation. I hope this time I did it right.
Cheers, Mounir IDRASSI IDRIX - Cryptography and IT Security Experts http://www.idrix.fr
From c9e8ffa28e3f100bd9e696c3a287a75bd366ccd0 Mon Sep 17 00:00:00 2001 From: Mounir IDRASSI mounir.idrassi@idrix.fr Date: Tue, 1 May 2007 15:48:25 +0200 Subject: Headers and skeleton of the wine Winscard dll
--- Makefile.in | 2 + configure | 3 + configure.ac | 1 + dlls/Makefile.in | 5 + dlls/winscard/Makefile.in | 20 ++ dlls/winscard/rsrc.rc | 33 ++++ dlls/winscard/scardcomm.c | 147 +++++++++++++++ dlls/winscard/scarddb.c | 390 ++++++++++++++++++++++++++++++++++++++ dlls/winscard/scardtracking.c | 124 ++++++++++++ dlls/winscard/winscard.c | 116 ++++++++++++ dlls/winscard/winscard.spec | 66 +++++++ include/Makefile.in | 3 + include/scarderr.h | 70 +++++++ include/winscard.h | 416 +++++++++++++++++++++++++++++++++++++++++ include/winsmcrd.h | 190 +++++++++++++++++++ 15 files changed, 1586 insertions(+), 0 deletions(-)
diff --git a/Makefile.in b/Makefile.in index 1f8f0c9..fd825a7 100644 --- a/Makefile.in +++ b/Makefile.in @@ -417,6 +417,7 @@ ALL_MAKEFILES = \ dlls/winmm/Makefile \ dlls/winmm/tests/Makefile \ dlls/winnls32/Makefile \ + dlls/winscard/Makefile \ dlls/winspool.drv/Makefile \ dlls/winspool.drv/tests/Makefile \ dlls/wintab32/Makefile \ @@ -762,6 +763,7 @@ dlls/wininet/tests/Makefile: dlls/wininet/tests/Makefile.in dlls/Maketest.rules dlls/winmm/Makefile: dlls/winmm/Makefile.in dlls/Makedll.rules dlls/winmm/tests/Makefile: dlls/winmm/tests/Makefile.in dlls/Maketest.rules dlls/winnls32/Makefile: dlls/winnls32/Makefile.in dlls/Makedll.rules +dlls/winscard/Makefile: dlls/winscard/Makefile.in dlls/Makedll.rules dlls/winspool.drv/Makefile: dlls/winspool.drv/Makefile.in dlls/Makedll.rules dlls/winspool.drv/tests/Makefile: dlls/winspool.drv/tests/Makefile.in dlls/Maketest.rules dlls/wintab32/Makefile: dlls/wintab32/Makefile.in dlls/Makedll.rules diff --git a/configure b/configure index 71a66ae..1a11b08 100755 --- a/configure +++ b/configure @@ -20839,6 +20839,8 @@ ac_config_files="$ac_config_files dlls/winmm/tests/Makefile"
ac_config_files="$ac_config_files dlls/winnls32/Makefile"
+ac_config_files="$ac_config_files dlls/winscard/Makefile" + ac_config_files="$ac_config_files dlls/winspool.drv/Makefile"
ac_config_files="$ac_config_files dlls/winspool.drv/tests/Makefile" @@ -21806,6 +21808,7 @@ do "dlls/winmm/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/winmm/Makefile" ;; "dlls/winmm/tests/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/winmm/tests/Makefile" ;; "dlls/winnls32/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/winnls32/Makefile" ;; + "dlls/winscard/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/winscard/Makefile" ;; "dlls/winspool.drv/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/winspool.drv/Makefile" ;; "dlls/winspool.drv/tests/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/winspool.drv/tests/Makefile" ;; "dlls/wintab32/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/wintab32/Makefile" ;; diff --git a/configure.ac b/configure.ac index ddec5f4..19026c6 100644 --- a/configure.ac +++ b/configure.ac @@ -1744,6 +1744,7 @@ AC_CONFIG_FILES([dlls/wininet/tests/Makefile]) AC_CONFIG_FILES([dlls/winmm/Makefile]) AC_CONFIG_FILES([dlls/winmm/tests/Makefile]) AC_CONFIG_FILES([dlls/winnls32/Makefile]) +AC_CONFIG_FILES([dlls/winscard/Makefile]) AC_CONFIG_FILES([dlls/winspool.drv/Makefile]) AC_CONFIG_FILES([dlls/winspool.drv/tests/Makefile]) AC_CONFIG_FILES([dlls/wintab32/Makefile]) diff --git a/dlls/Makefile.in b/dlls/Makefile.in index f9707e7..31f3ef8 100644 --- a/dlls/Makefile.in +++ b/dlls/Makefile.in @@ -205,6 +205,7 @@ BASEDIRS = \ wininet \ winmm \ winnls32 \ + winscard \ winspool.drv \ wintab32 \ wintrust \ @@ -571,6 +572,7 @@ IMPORT_LIBS = \ wininet/libwininet.$(IMPLIBEXT) \ winmm/libwinmm.$(IMPLIBEXT) \ winnls32/libwinnls32.$(IMPLIBEXT) \ + winscard/libwinscard.$(IMPLIBEXT) \ winspool.drv/libwinspool.$(IMPLIBEXT) \ wintab32/libwintab32.$(IMPLIBEXT) \ wintrust/libwintrust.$(IMPLIBEXT) \ @@ -920,6 +922,9 @@ winmm/libwinmm.$(IMPLIBEXT): winmm/winmm.spec $(WINEBUILD)
winnls32/libwinnls32.$(IMPLIBEXT): winnls32/winnls32.spec $(WINEBUILD) @cd winnls32 && $(MAKE) libwinnls32.$(IMPLIBEXT) + +winscard/libwinscard.$(IMPLIBEXT): winscard/winscard.spec $(WINEBUILD) + @cd winscard && $(MAKE) libwinscard.$(IMPLIBEXT)
winspool.drv/libwinspool.$(IMPLIBEXT): winspool.drv/winspool.drv.spec $(WINEBUILD) @cd winspool.drv && $(MAKE) libwinspool.$(IMPLIBEXT) diff --git a/dlls/winscard/Makefile.in b/dlls/winscard/Makefile.in new file mode 100755 index 0000000..9ce7ad6 --- /dev/null +++ b/dlls/winscard/Makefile.in @@ -0,0 +1,20 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = winscard.dll +IMPORTLIB = libwinscard.$(IMPLIBEXT) +IMPORTS = kernel32 + +C_SRCS = \ + scarddb.c \ + scardcomm.c \ + scardtracking.c \ + winscard.c + +RC_SRCS = \ + rsrc.rc + +@MAKE_DLL_RULES@ + +@DEPENDENCIES@ # everything below this line is overwritten by make depend diff --git a/dlls/winscard/rsrc.rc b/dlls/winscard/rsrc.rc new file mode 100644 index 0000000..8226e9d --- /dev/null +++ b/dlls/winscard/rsrc.rc @@ -0,0 +1,33 @@ +/* + * Top level resource file for winscard.dll + * + * Copyright 2007 Mounir IDRASSI (mounir.idrassi@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 "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "winver.h" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +#define WINE_FILEDESCRIPTION_STR "Wine Smart Card API" +#define WINE_FILENAME_STR "winscard.dll" +#define WINE_FILEVERSION 5,1,2600,2180 +#define WINE_FILEVERSION_STR "5.1.2600.2180" + +#include "wine/wine_common_ver.rc" diff --git a/dlls/winscard/scardcomm.c b/dlls/winscard/scardcomm.c new file mode 100644 index 0000000..1a3f637 --- /dev/null +++ b/dlls/winscard/scardcomm.c @@ -0,0 +1,147 @@ +/* + * Copyright 2007 Mounir IDRASSI (mounir.idrassi@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 <stdlib.h> +#include <wchar.h> +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "wine/debug.h" +#include "wine/library.h" +#include "wine/unicode.h" +#include <winscard.h> + +WINE_DEFAULT_DEBUG_CHANNEL(winscard); + +LONG WINAPI SCardEstablishContext(DWORD dwScope,LPCVOID pvReserved1, LPCVOID pvReserved2, LPSCARDCONTEXT phContext) +{ + FIXME(" 0x%08X %p %p %p\n",dwScope,pvReserved1,pvReserved2,phContext); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + + +LONG WINAPI SCardReleaseContext(SCARDCONTEXT hContext) +{ + FIXME(" 0x%08X\n", (unsigned int) hContext); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardIsValidContext(SCARDCONTEXT hContext) +{ + FIXME(" 0x%08X\n", (unsigned int) hContext); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + + +LONG WINAPI SCardConnectA( + SCARDCONTEXT hContext, + LPCSTR szReader, + DWORD dwShareMode, + DWORD dwPreferredProtocols, + LPSCARDHANDLE phCard, + LPDWORD pdwActiveProtocol) +{ + FIXME(" 0x%08X %s 0x%08X 0x%08X %p %p\n",(unsigned int) hContext,debugstr_a(szReader),dwShareMode,dwPreferredProtocols,phCard,pdwActiveProtocol); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardConnectW(SCARDCONTEXT hContext, + LPCWSTR szReader, + DWORD dwShareMode, + DWORD dwPreferredProtocols, + LPSCARDHANDLE phCard, + LPDWORD pdwActiveProtocol) +{ + FIXME(" 0x%08X %s 0x%08X 0x%08X %p %p\n",(unsigned int) hContext,debugstr_w(szReader),dwShareMode,dwPreferredProtocols,phCard,pdwActiveProtocol); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardReconnect(SCARDHANDLE hCard, + DWORD dwShareMode, + DWORD dwPreferredProtocols, + DWORD dwInitialization, + LPDWORD pdwActiveProtocol) +{ + FIXME(" 0x%08X 0x%08X 0x%08X 0x%08X %p\n",(unsigned int) hCard,dwShareMode,dwPreferredProtocols,dwInitialization,pdwActiveProtocol); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardDisconnect(SCARDHANDLE hCard, DWORD dwDisposition) +{ + FIXME(" 0x%08X 0x%08X\n",(unsigned int) hCard,dwDisposition); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardBeginTransaction(SCARDHANDLE hCard) +{ + FIXME(" 0x%08X\n",(unsigned int) hCard); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardEndTransaction(SCARDHANDLE hCard, DWORD dwDisposition) +{ + FIXME(" 0x%08X 0x%08X\n",(unsigned int) hCard,dwDisposition); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardCancelTransaction(SCARDHANDLE hCard) +{ + FIXME(" 0x%08X\n",(unsigned int) hCard); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardControl( + SCARDHANDLE hCard, + DWORD dwControlCode, + LPCVOID pbSendBuffer, + DWORD cbSendLength, + LPVOID pbRecvBuffer, + DWORD cbRecvLength, + LPDWORD lpBytesReturned) +{ + FIXME("0x%08X 0x%08X %p %d %p %d %p - stub\n",(unsigned int) hCard,dwControlCode,pbSendBuffer,cbSendLength,pbRecvBuffer,cbRecvLength,lpBytesReturned); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardTransmit( + SCARDHANDLE hCard, + LPCSCARD_IO_REQUEST pioSendPci, + const BYTE* pbSendBuffer, + DWORD cbSendLength, + LPSCARD_IO_REQUEST pioRecvPci, + LPBYTE pbRecvBuffer, + LPDWORD pcbRecvLength) +{ + FIXME("0x%08X %p %p %d %p %p %p - stub\n",(unsigned int)hCard,pioSendPci,pbSendBuffer,cbSendLength,pioRecvPci,pbRecvBuffer,pcbRecvLength); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} diff --git a/dlls/winscard/scarddb.c b/dlls/winscard/scarddb.c new file mode 100644 index 0000000..4bc31ff --- /dev/null +++ b/dlls/winscard/scarddb.c @@ -0,0 +1,390 @@ +/* + * Copyright 2007 Mounir IDRASSI (mounir.idrassi@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 <stdlib.h> +#include <wchar.h> +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "wine/debug.h" +#include "wine/library.h" +#include "wine/unicode.h" +#include <winscard.h> + +WINE_DEFAULT_DEBUG_CHANNEL(winscard); + +/* + * smar cards database functions. Almost all of them are stubs but they need to + * be present as many applications call them and are not affected if they return + * an error + */ +LONG WINAPI SCardListCardsA( + SCARDCONTEXT hContext, + const BYTE* pbAtr, + LPCGUID rgquidInterfaces, + DWORD cguidInterfaceCount, + LPSTR mszCards, + LPDWORD pcchCards) +{ + FIXME("0x%08X %p %p %d %p %p - stub\n",(unsigned int) hContext,pbAtr,rgquidInterfaces,cguidInterfaceCount,mszCards,pcchCards); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardListCardsW( + SCARDCONTEXT hContext, + const BYTE* pbAtr, + LPCGUID rgquidInterfaces, + DWORD cguidInterfaceCount, + LPWSTR mszCards, + LPDWORD pcchCards) +{ + FIXME("0x%08X %p %p %d %p %p - stub\n",(unsigned int)hContext,pbAtr,rgquidInterfaces,cguidInterfaceCount,mszCards,pcchCards); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardListInterfacesA( + SCARDCONTEXT hContext, + LPCSTR szCard, + LPGUID pguidInterfaces, + LPDWORD pcguidInterfaces) +{ + FIXME("0x%08X %s %p %p - stub\n",(unsigned int)hContext,debugstr_a(szCard),pguidInterfaces,pcguidInterfaces); + return SCARD_E_UNKNOWN_CARD; +} + +LONG WINAPI SCardListInterfacesW( + SCARDCONTEXT hContext, + LPCWSTR szCard, + LPGUID pguidInterfaces, + LPDWORD pcguidInterfaces) +{ + FIXME("0x%08X %s %p %p - stub\n",(unsigned int)hContext,debugstr_w(szCard),pguidInterfaces,pcguidInterfaces); + return SCARD_E_UNKNOWN_CARD; +} + +LONG WINAPI SCardGetProviderIdA( + SCARDCONTEXT hContext, + LPCSTR szCard, + LPGUID pguidProviderId) +{ + FIXME("0x%08X %s %p - stub\n",(unsigned int)hContext,debugstr_a(szCard),pguidProviderId); + if(!pguidProviderId) + return SCARD_E_INVALID_PARAMETER; + return SCARD_E_UNKNOWN_CARD; +} + +LONG WINAPI SCardGetProviderIdW( + SCARDCONTEXT hContext, + LPCWSTR szCard, + LPGUID pguidProviderId) +{ + FIXME("0x%08X %s %p - stub\n",(unsigned int)hContext,debugstr_w(szCard),pguidProviderId); + if(!pguidProviderId) + return SCARD_E_INVALID_PARAMETER; + return SCARD_E_UNKNOWN_CARD; +} + +LONG WINAPI SCardGetCardTypeProviderNameA( + SCARDCONTEXT hContext, + LPCSTR szCardName, + DWORD dwProviderId, + LPSTR szProvider, + LPDWORD pcchProvider) +{ + FIXME("0x%08X %s 0x%08X %p %p - stub\n",(unsigned int)hContext,debugstr_a(szCardName),dwProviderId,szProvider,pcchProvider); + return SCARD_E_UNKNOWN_CARD; +} + +LONG WINAPI SCardGetCardTypeProviderNameW( + SCARDCONTEXT hContext, + LPCWSTR szCardName, + DWORD dwProviderId, + LPWSTR szProvider, + LPDWORD pcchProvider) +{ + FIXME("0x%08X %s 0x%08X %p %p - stub\n",(unsigned int)hContext,debugstr_w(szCardName),dwProviderId,szProvider,pcchProvider); + return SCARD_E_UNKNOWN_CARD; +} + +LONG WINAPI SCardIntroduceReaderGroupA( + SCARDCONTEXT hContext, + LPCSTR szGroupName) +{ + FIXME("0x%08X %s - stub\n",(unsigned int)hContext,debugstr_a(szGroupName)); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardIntroduceReaderGroupW( + SCARDCONTEXT hContext, + LPCWSTR szGroupName) +{ + FIXME("0x%08X %s - stub\n",(unsigned int)hContext,debugstr_w(szGroupName)); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardForgetReaderGroupA( + SCARDCONTEXT hContext, + LPCSTR szGroupName) +{ + FIXME("0x%08X %s - stub\n",(unsigned int)hContext,debugstr_a(szGroupName)); + return SCARD_S_SUCCESS; +} + +LONG WINAPI SCardForgetReaderGroupW( + SCARDCONTEXT hContext, + LPCWSTR szGroupName) +{ + FIXME("0x%08X %s - stub\n",(unsigned int)hContext,debugstr_w(szGroupName)); + return SCARD_S_SUCCESS; +} + +LONG WINAPI SCardIntroduceReaderA( + SCARDCONTEXT hContext, + LPCSTR szReaderName, + LPCSTR szDeviceName) +{ + FIXME("0x%08X %s %s - stub\n",(unsigned int)hContext,debugstr_a(szReaderName),debugstr_a(szDeviceName)); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardIntroduceReaderW( + SCARDCONTEXT hContext, + LPCWSTR szReaderName, + LPCWSTR szDeviceName) +{ + FIXME("0x%08X %s %s - stub\n",(unsigned int)hContext,debugstr_w(szReaderName),debugstr_w(szDeviceName)); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardForgetReaderA( + SCARDCONTEXT hContext, + LPCSTR szReaderName) +{ + FIXME("0x%08X %s - stub\n",(unsigned int)hContext,debugstr_a(szReaderName)); + return SCARD_S_SUCCESS; +} + +LONG WINAPI SCardForgetReaderW( + SCARDCONTEXT hContext, + LPCWSTR szReaderName) +{ + FIXME("0x%08X %s - stub\n",(unsigned int)hContext,debugstr_w(szReaderName)); + return SCARD_S_SUCCESS; +} + +LONG WINAPI SCardAddReaderToGroupA( + SCARDCONTEXT hContext, + LPCSTR szReaderName, + LPCSTR szGroupName) +{ + FIXME("0x%08X %s %s - stub\n",(unsigned int) hContext, debugstr_a( szReaderName), debugstr_a(szGroupName)); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardAddReaderToGroupW( + SCARDCONTEXT hContext, + LPCWSTR szReaderName, + LPCWSTR szGroupName) +{ + FIXME("0x%08X %s %s - stub\n",(unsigned int) hContext, debugstr_w( szReaderName), debugstr_w(szGroupName)); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardRemoveReaderFromGroupA( + SCARDCONTEXT hContext, + LPCSTR szReaderName, + LPCSTR szGroupName) +{ + FIXME("0x%08X %s %s - stub\n",(unsigned int) hContext, debugstr_a( szReaderName), debugstr_a(szGroupName)); + return SCARD_S_SUCCESS; +} + +LONG WINAPI SCardRemoveReaderFromGroupW( + SCARDCONTEXT hContext, + LPCWSTR szReaderName, + LPCWSTR szGroupName) +{ + FIXME("0x%08X %s %s - stub\n",(unsigned int) hContext, debugstr_w( szReaderName), debugstr_w(szGroupName)); + return SCARD_S_SUCCESS; +} + +LONG WINAPI SCardIntroduceCardTypeA( + SCARDCONTEXT hContext, + LPCSTR szCardName, + LPCGUID pguidPrimaryProvider, + LPCGUID rgguidInterfaces, + DWORD dwInterfaceCount, + const BYTE* pbAtr, + const BYTE* pbAtrMask, + DWORD cbAtrLen) +{ + FIXME("0x%08X %s %p %p %d %p %p %d - stub\n",(unsigned int) hContext, debugstr_a(szCardName),pguidPrimaryProvider,rgguidInterfaces,dwInterfaceCount,pbAtr,pbAtrMask,cbAtrLen); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardIntroduceCardTypeW( + SCARDCONTEXT hContext, + LPCWSTR szCardName, + LPCGUID pguidPrimaryProvider, + LPCGUID rgguidInterfaces, + DWORD dwInterfaceCount, + const BYTE* pbAtr, + const BYTE* pbAtrMask, + DWORD cbAtrLen) +{ + FIXME("0x%08X %s %p %p %d %p %p %d - stub\n",(unsigned int) hContext, debugstr_w(szCardName),pguidPrimaryProvider,rgguidInterfaces,dwInterfaceCount,pbAtr,pbAtrMask,cbAtrLen); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + + +LONG WINAPI SCardSetCardTypeProviderNameA( + SCARDCONTEXT hContext, + LPCSTR szCardName, + DWORD dwProviderId, + LPCSTR szProvider) +{ + FIXME("0x%08X %s 0x%08X %s - stub\n",(unsigned int) hContext, debugstr_a(szCardName),dwProviderId,debugstr_a(szProvider)); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardSetCardTypeProviderNameW( + SCARDCONTEXT hContext, + LPCWSTR szCardName, + DWORD dwProviderId, + LPCWSTR szProvider) +{ + FIXME("0x%08X %s 0x%08X %s - stub\n",(unsigned int) hContext, debugstr_w(szCardName),dwProviderId,debugstr_w(szProvider)); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardForgetCardTypeA( + SCARDCONTEXT hContext, + LPCSTR szCardName) +{ + FIXME("0x%08X %s - stub\n",(unsigned int) hContext, debugstr_a(szCardName)); + return SCARD_E_UNKNOWN_CARD; +} + +LONG WINAPI SCardForgetCardTypeW( + SCARDCONTEXT hContext, + LPCWSTR szCardName) +{ + FIXME("0x%08X %s - stub\n",(unsigned int) hContext, debugstr_w(szCardName)); + return SCARD_E_UNKNOWN_CARD; +} + +LONG WINAPI SCardLocateCardsA( + SCARDCONTEXT hContext, + LPCSTR mszCards, + LPSCARD_READERSTATEA rgReaderStates, + DWORD cReaders) +{ + FIXME("0x%08X %s %p %d - stub\n",(unsigned int) hContext, debugstr_a(mszCards),rgReaderStates,cReaders); + return SCARD_E_UNKNOWN_CARD; +} + +LONG WINAPI SCardLocateCardsW( + SCARDCONTEXT hContext, + LPCWSTR mszCards, + LPSCARD_READERSTATEW rgReaderStates, + DWORD cReaders) +{ + FIXME("0x%08X %s %p %d - stub\n",(unsigned int) hContext, debugstr_w(mszCards),rgReaderStates,cReaders); + return SCARD_E_UNKNOWN_CARD; +} + +LONG WINAPI SCardLocateCardsByATRA( + SCARDCONTEXT hContext, + LPSCARD_ATRMASK rgAtrMasks, + DWORD cAtrs, + LPSCARD_READERSTATEA rgReaderStates, + DWORD cReaders) +{ + FIXME("0x%08X %p %d %p %d - stub\n",(unsigned int) hContext, rgAtrMasks, cAtrs, rgReaderStates, cReaders); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardLocateCardsByATRW( + SCARDCONTEXT hContext, + LPSCARD_ATRMASK rgAtrMasks, + DWORD cAtrs, + LPSCARD_READERSTATEW rgReaderStates, + DWORD cReaders) +{ + FIXME("0x%08X %p %d %p %d - stub\n",(unsigned int) hContext, rgAtrMasks, cAtrs, rgReaderStates, cReaders); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardListReaderGroupsA( + SCARDCONTEXT hContext, + LPSTR mszGroups, + LPDWORD pcchGroups) +{ + FIXME(" 0x%08X %p %p - stub\n",(unsigned int) hContext,mszGroups,pcchGroups); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardListReaderGroupsW( + SCARDCONTEXT hContext, + LPWSTR mszGroups, + LPDWORD pcchGroups) +{ + FIXME(" 0x%08X %p %p - stub\n",(unsigned int) hContext,mszGroups,pcchGroups); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardListReadersA( + SCARDCONTEXT hContext, + LPCSTR mszGroups, + LPSTR mszReaders, + LPDWORD pcchReaders) +{ + FIXME(" 0x%08X %p %p %p - stub\n",(unsigned int) hContext,mszGroups,mszReaders,pcchReaders); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardListReadersW( + SCARDCONTEXT hContext, + LPCWSTR mszGroups, + LPWSTR mszReaders, + LPDWORD pcchReaders) +{ + FIXME(" 0x%08X %p %p %p - stub\n",(unsigned int) hContext,mszGroups,mszReaders,pcchReaders); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} diff --git a/dlls/winscard/scardtracking.c b/dlls/winscard/scardtracking.c new file mode 100644 index 0000000..ede697e --- /dev/null +++ b/dlls/winscard/scardtracking.c @@ -0,0 +1,124 @@ +/* + * Copyright 2007 Mounir IDRASSI (mounir.idrassi@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 <stdlib.h> +#include <wchar.h> +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "wine/debug.h" +#include "wine/library.h" +#include "wine/unicode.h" +#include <winscard.h> + +WINE_DEFAULT_DEBUG_CHANNEL(winscard); + +LONG WINAPI SCardState( + SCARDHANDLE hCard, + LPDWORD pdwState, + LPDWORD pdwProtocol, + LPBYTE pbAtr, + LPDWORD pcbAtrLen) +{ + FIXME(" 0x%08X %p %p %p %p\n",(unsigned int) hCard,pdwState,pdwProtocol,pbAtr,pcbAtrLen); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardStatusA( + SCARDHANDLE hCard, + LPSTR mszReaderNames, + LPDWORD pcchReaderLen, + LPDWORD pdwState, + LPDWORD pdwProtocol, + LPBYTE pbAtr, + LPDWORD pcbAtrLen) +{ + FIXME(" 0x%08X %p %p %p %p %p %p\n",(unsigned int) hCard,mszReaderNames,pcchReaderLen,pdwState,pdwProtocol,pbAtr,pcbAtrLen); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardStatusW( + SCARDHANDLE hCard, + LPWSTR mszReaderNames, + LPDWORD pcchReaderLen, + LPDWORD pdwState, + LPDWORD pdwProtocol, + LPBYTE pbAtr, + LPDWORD pcbAtrLen) +{ + FIXME(" 0x%08X %p %p %p %p %p %p\n",(unsigned int) hCard,mszReaderNames,pcchReaderLen,pdwState,pdwProtocol,pbAtr,pcbAtrLen); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardGetStatusChangeA( + SCARDCONTEXT hContext, + DWORD dwTimeout, + LPSCARD_READERSTATEA rgReaderStates, + DWORD cReaders) +{ + FIXME(" 0x%08X 0x%08X %p 0x%08X\n",(unsigned int) hContext, dwTimeout,rgReaderStates,cReaders); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardGetStatusChangeW( + SCARDCONTEXT hContext, + DWORD dwTimeout, + LPSCARD_READERSTATEW rgReaderStates, + DWORD cReaders) +{ + FIXME(" 0x%08X 0x%08X %p 0x%08X\n",(unsigned int) hContext, dwTimeout,rgReaderStates,cReaders); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + + +LONG WINAPI SCardCancel(SCARDCONTEXT hContext) +{ + FIXME(" 0x%08X \n",(unsigned int) hContext); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardGetAttrib( + SCARDHANDLE hCard, + DWORD dwAttrId, + LPBYTE pbAttr, + LPDWORD pcbAttrLen) +{ + FIXME(" 0x%08X 0x%08X %p %p \n",(unsigned int) hCard, dwAttrId,pbAttr,pcbAttrLen); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + +LONG WINAPI SCardSetAttrib( + SCARDHANDLE hCard, + DWORD dwAttrId, + const BYTE* pbAttr, + DWORD cbAttrLen) +{ + FIXME(" 0x%08X 0x%08X %p 0x%08X \n",(unsigned int) hCard,dwAttrId,pbAttr,cbAttrLen); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} diff --git a/dlls/winscard/winscard.c b/dlls/winscard/winscard.c new file mode 100755 index 0000000..30186f4 --- /dev/null +++ b/dlls/winscard/winscard.c @@ -0,0 +1,116 @@ +/* + * Copyright 2007 Mounir IDRASSI (mounir.idrassi@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 <stdlib.h> +#include <wchar.h> +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "wine/debug.h" +#include "wine/library.h" +#include "wine/unicode.h" +#include <winscard.h> + +WINE_DEFAULT_DEBUG_CHANNEL(winscard); + +static HMODULE WINSCARD_hModule; + +SCARD_IO_REQUEST g_rgSCardT0Pci = { SCARD_PROTOCOL_T0, 8 }; +SCARD_IO_REQUEST g_rgSCardT1Pci = { SCARD_PROTOCOL_T1, 8 }; +SCARD_IO_REQUEST g_rgSCardRawPci = { SCARD_PROTOCOL_RAW, 8 }; + + SCARD_IO_REQUEST* SCARD_PCI_T0 = NULL; + SCARD_IO_REQUEST* SCARD_PCI_T1 = NULL; + SCARD_IO_REQUEST* SCARD_PCI_RAW = NULL; + + +BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + TRACE("%p,%x,%p\n", hinstDLL, fdwReason, lpvReserved); + + switch (fdwReason) { + case DLL_PROCESS_ATTACH: + { + DisableThreadLibraryCalls(hinstDLL); + WINSCARD_hModule = hinstDLL; + /* initialize protocol requests pointers */ + SCARD_PCI_T0 = &g_rgSCardT0Pci; + SCARD_PCI_T1 = &g_rgSCardT1Pci; + SCARD_PCI_RAW = &g_rgSCardRawPci; + break; + } + case DLL_PROCESS_DETACH: + { + + break; + } + } + + return TRUE; +} + + +/* + * events functions + */ + +HANDLE WINAPI SCardAccessNewReaderEvent() +{ + FIXME("stub\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return NULL; +} + +long WINAPI SCardReleaseAllEvents() +{ + FIXME("stub\n"); + + return SCARD_S_SUCCESS; +} + +long WINAPI SCardReleaseNewReaderEvent(HANDLE hNewReaderEventHandle) +{ + FIXME("stub\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_S_SUCCESS; +} + +HANDLE WINAPI SCardAccessStartedEvent() +{ + FIXME("stub\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return NULL; +} + +void WINAPI SCardReleaseStartedEvent(HANDLE hStartedEventHandle) +{ + FIXME("0x%08X - stub\n",(unsigned int) hStartedEventHandle); +} + + +LONG WINAPI SCardFreeMemory( SCARDCONTEXT hContext,LPCVOID pvMem) +{ + FIXME("0x%08X %p - stub\n",(unsigned int)hContext,pvMem); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return SCARD_F_UNKNOWN_ERROR; +} + + diff --git a/dlls/winscard/winscard.spec b/dlls/winscard/winscard.spec new file mode 100755 index 0000000..f636d46 --- /dev/null +++ b/dlls/winscard/winscard.spec @@ -0,0 +1,66 @@ +@ stub ClassInstall32 +@ stdcall SCardAccessNewReaderEvent() +@ stdcall SCardReleaseAllEvents() +@ stdcall SCardReleaseNewReaderEvent() +@ stdcall SCardAccessStartedEvent() +@ stdcall SCardAddReaderToGroupA(long str str) +@ stdcall SCardAddReaderToGroupW(long wstr wstr) +@ stdcall SCardBeginTransaction(long) +@ stdcall SCardCancel(long) +@ stdcall SCardConnectA(long str long long ptr ptr) +@ stdcall SCardConnectW(long wstr long long ptr ptr) +@ stdcall SCardControl(long long ptr long ptr long ptr) +@ stdcall SCardDisconnect(long long) +@ stdcall SCardEndTransaction(long long) +@ stdcall SCardEstablishContext(long ptr ptr ptr) +@ stdcall SCardForgetCardTypeA(long str) +@ stdcall SCardForgetCardTypeW(long wstr) +@ stdcall SCardForgetReaderA(long str) +@ stdcall SCardForgetReaderGroupA(long str) +@ stdcall SCardForgetReaderGroupW(long wstr) +@ stdcall SCardForgetReaderW(long wstr) +@ stdcall SCardFreeMemory(long ptr) +@ stdcall SCardGetAttrib(long long ptr ptr) +@ stdcall SCardGetCardTypeProviderNameA(long str long str ptr) +@ stdcall SCardGetCardTypeProviderNameW(long wstr long wstr ptr) +@ stdcall SCardGetProviderIdA(long str ptr) +@ stdcall SCardGetProviderIdW(long wstr ptr) +@ stdcall SCardGetStatusChangeA(long long ptr long) +@ stdcall SCardGetStatusChangeW(long long ptr long) +@ stdcall SCardIntroduceCardTypeA(long str ptr ptr long ptr ptr long) +@ stdcall SCardIntroduceCardTypeW(long wstr ptr ptr long ptr ptr long) +@ stdcall SCardIntroduceReaderA(long str str) +@ stdcall SCardIntroduceReaderGroupA(long str) +@ stdcall SCardIntroduceReaderGroupW(long wstr) +@ stdcall SCardIntroduceReaderW(long wstr wstr) +@ stdcall SCardIsValidContext(long) +@ stdcall SCardListCardsA(long ptr ptr long str ptr) +@ stdcall SCardListCardsW(long ptr ptr long wstr ptr) +@ stdcall SCardListInterfacesA(long str ptr ptr) +@ stdcall SCardListInterfacesW(long wstr ptr ptr) +@ stdcall SCardListReaderGroupsA(long str ptr) +@ stdcall SCardListReaderGroupsW(long wstr ptr) +@ stdcall SCardListReadersA(long str str ptr) +@ stdcall SCardListReadersW(long wstr wstr ptr) +@ stdcall SCardLocateCardsA(long str ptr long) +@ stdcall SCardLocateCardsByATRA(long ptr long ptr long) +@ stdcall SCardLocateCardsByATRW(long ptr long ptr long) +@ stdcall SCardLocateCardsW(long wstr ptr long) +@ stdcall SCardReconnect(long long long long ptr) +@ stdcall SCardReleaseContext(long) +@ stdcall SCardReleaseStartedEvent() +@ stdcall SCardRemoveReaderFromGroupA(long str str) +@ stdcall SCardRemoveReaderFromGroupW(long wstr wstr) +@ stdcall SCardSetAttrib(long long ptr long) +@ stdcall SCardSetCardTypeProviderNameA(long str long str) +@ stdcall SCardSetCardTypeProviderNameW(long wstr long wstr) +@ stdcall SCardState(long ptr ptr ptr ptr) +@ stdcall SCardStatusA(long str ptr ptr ptr ptr ptr) +@ stdcall SCardStatusW(long wstr ptr ptr ptr ptr ptr) +@ stdcall SCardTransmit(long ptr ptr long ptr ptr ptr) +@ extern g_rgSCardRawPci +@ extern g_rgSCardT0Pci +@ extern g_rgSCardT1Pci +@ extern SCARD_PCI_RAW +@ extern SCARD_PCI_T0 +@ extern SCARD_PCI_T1 diff --git a/include/Makefile.in b/include/Makefile.in index 2577872..7dc0cc3 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -293,6 +293,7 @@ SRCDIR_INCLUDES = \ rpcndr.h \ rpcnterr.h \ rpcproxy.h \ + scarderr.h \ schannel.h \ schemadef.h \ schnlsp.h \ @@ -351,6 +352,8 @@ SRCDIR_INCLUDES = \ winreg.h \ winres.h \ winresrc.h \ + winscard.h \ + winsmcrd.h \ winsock.h \ winsock2.h \ winspool.h \ diff --git a/include/scarderr.h b/include/scarderr.h new file mode 100755 index 0000000..c07833e --- /dev/null +++ b/include/scarderr.h @@ -0,0 +1,70 @@ +/* + * Copyright 2007 Mounir IDRASSI (mounir.idrassi@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_SCARDERR_H +#define _WINE_SCARDERR_H + + +#define SCARD_S_SUCCESS 0x00000000 +#define SCARD_F_INTERNAL_ERROR 0x80100001 /* An internal error occured while executing the operation */ +#define SCARD_E_CANCELLED 0x80100002 /* SCardCancel was called to cancel the operation */ +#define SCARD_E_INVALID_HANDLE 0x80100003 /* The given handle is not valid */ +#define SCARD_E_INVALID_PARAMETER 0x80100004 /* An invalid parameter was given in input*/ +#define SCARD_E_INVALID_TARGET 0x80100005 /* Smart card service encountered inconsistent installation information */ +#define SCARD_E_NO_MEMORY 0x80100006 /* No enough memory available to complete the operation */ +#define SCARD_F_WAITED_TOO_LONG 0x80100007 /* A timeout occured in an internal operation */ +#define SCARD_E_INSUFFICIENT_BUFFER 0x80100008 /* The output buffer is too small to receive data */ +#define SCARD_E_UNKNOWN_READER 0x80100009 /* The given reader name is unknwon to the system */ +#define SCARD_E_TIMEOUT 0x8010000A /* The operation timed out */ +#define SCARD_E_SHARING_VIOLATION 0x8010000B /* can't access the card because of other connections*/ + +#ifndef SCARD_E_NO_SMARTCARD +#define SCARD_E_NO_SMARTCARD 0x8010000C /* no smart card found on the reader*/ +#endif + +#define SCARD_E_UNKNOWN_CARD 0x8010000D /* The given card name is unknwon to the ssytem */ +#define SCARD_E_CANT_DISPOSE 0x8010000E /* The system can't handle the disposition request in SCardDisconnect or SCardEndTransaction*/ +#define SCARD_E_PROTO_MISMATCH 0x8010000F /* The given protocol is not compatible with the currenr card context */ +#define SCARD_E_NOT_READY 0x80100010 /* The reader or the card are not ready for use */ +#define SCARD_E_INVALID_VALUE 0x80100011 /* An invalid value was detected while */ +#define SCARD_E_SYSTEM_CANCELLED 0x80100012 /* The system canceld the current operation with the reader */ +#define SCARD_F_COMM_ERROR 0x80100013 /* A communication error occured with the reader */ +#define SCARD_F_UNKNOWN_ERROR 0x80100014 /* An unknown error occured */ +#define SCARD_E_INVALID_ATR 0x80100015 /* The ATR value is invalid */ +#define SCARD_E_NOT_TRANSACTED 0x80100016 /* no transaction exists */ +#define SCARD_E_READER_UNAVAILABLE 0x80100017 /* The reader is unavailable for use by the system, e.g. removed */ + +#define SCARD_E_PCI_TOO_SMALL 0x80100019 /* The PCI request receive buffer is too small*/ +#define SCARD_E_READER_UNSUPPORTED 0x8010001A /* The reader is unsupported due to the lack of capabilities*/ +#define SCARD_E_DUPLICATE_READER 0x8010001B /* more than one reader with the same name exist*/ +#define SCARD_E_CARD_UNSUPPORTED 0x8010001C /* The card inserted is not supported by the system */ +#define SCARD_E_NO_SERVICE 0x8010001D /* The Smart card resource manager is not running */ +#define SCARD_E_SERVICE_STOPPED 0x8010001E /* The Smart card resource manager has been stopped */ + +#define SCARD_E_NO_READERS_AVAILABLE 0x8010002E /* no reader found on the system */ + +#define SCARD_W_UNSUPPORTED_CARD 0x80100065 /* the card is unsupported and the reader can't communicate with it*/ +#define SCARD_W_UNRESPONSIVE_CARD 0x80100066 /* the card didn't send answer to the reset*/ +#define SCARD_W_UNPOWERED_CARD 0x80100067 /* the card is unpowered and the reader can't communicate with it*/ +#define SCARD_W_RESET_CARD 0x80100068 /* the card has been reset and any held information are invalid*/ +#define SCARD_W_REMOVED_CARD 0x80100069 /* the card has been removed from the reader*/ + + + +#endif diff --git a/include/winscard.h b/include/winscard.h new file mode 100755 index 0000000..f302a9f --- /dev/null +++ b/include/winscard.h @@ -0,0 +1,416 @@ +/* + * Copyright 2007 Mounir IDRASSI (mounir.idrassi@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_WINSCARD_H +#define _WINE_WINSCARD_H + +#include "winsmcrd.h" +#include "scarderr.h" + +/* + * these variables store pre-filled protocol requests + */ +extern SCARD_IO_REQUEST g_rgSCardT0Pci; +extern SCARD_IO_REQUEST g_rgSCardT1Pci; +extern SCARD_IO_REQUEST g_rgSCardRawPci; + +/* + * These are handy shotcuts to be used in SCardTransmit + * They are implemented here as pointer variables + */ + extern SCARD_IO_REQUEST* SCARD_PCI_T0; /* equal to (&g_rgSCardT0Pci) */ + extern SCARD_IO_REQUEST* SCARD_PCI_T1; /* equal to (&g_rgSCardT1Pci) */ + extern SCARD_IO_REQUEST* SCARD_PCI_RAW; /* equal to (&g_rgSCardRawPci) */ + + +#ifdef __cplusplus +extern "C" { +#endif + + +/* + * Smart Card service manager function + */ + +LONG WINAPI SCardEstablishContext( + DWORD dwScope, + LPCVOID pvReserved1, + LPCVOID pvReserved2, + LPSCARDCONTEXT phContext); + +LONG WINAPI SCardReleaseContext( + SCARDCONTEXT hContext); + +LONG WINAPI SCardFreeMemory( + SCARDCONTEXT hContext, + LPCVOID pvMem); + +HANDLE WINAPI SCardAccessStartedEvent(void); + +void WINAPI SCardReleaseStartedEvent( + HANDLE hStartedEventHandle); + +LONG WINAPI SCardIsValidContext( + SCARDCONTEXT hContext); + + +/* + * Smart Card database functions + */ + +LONG WINAPI SCardListReaderGroupsA( + SCARDCONTEXT hContext, + LPSTR mszGroups, + LPDWORD pcchGroups); +LONG WINAPI SCardListReaderGroupsW( + SCARDCONTEXT hContext, + LPWSTR mszGroups, + LPDWORD pcchGroups); + +#define SCardListReaderGroups WINELIB_NAME_AW(SCardListReaderGroups) + + +LONG WINAPI SCardListReadersA( + SCARDCONTEXT hContext, + LPCSTR mszGroups, + LPSTR mszReaders, + LPDWORD pcchReaders); +LONG WINAPI SCardListReadersW( + SCARDCONTEXT hContext, + LPCWSTR mszGroups, + LPWSTR mszReaders, + LPDWORD pcchReaders); + +#define SCardListReaders WINELIB_NAME_AW(SCardListReaders) + +LONG WINAPI SCardListCardsA( + SCARDCONTEXT hContext, + const BYTE* pbAtr, + LPCGUID rgquidInterfaces, + DWORD cguidInterfaceCount, + LPSTR mszCards, + LPDWORD pcchCards); +LONG WINAPI SCardListCardsW( + SCARDCONTEXT hContext, + const BYTE* pbAtr, + LPCGUID rgquidInterfaces, + DWORD cguidInterfaceCount, + LPWSTR mszCards, + LPDWORD pcchCards); + +#define SCardListCards WINELIB_NAME_AW(SCardListCards) + +LONG WINAPI SCardListInterfacesA( + SCARDCONTEXT hContext, + LPCSTR szCard, + LPGUID pguidInterfaces, + LPDWORD pcguidInterfaces); +LONG WINAPI SCardListInterfacesW( + SCARDCONTEXT hContext, + LPCWSTR szCard, + LPGUID pguidInterfaces, + LPDWORD pcguidInterfaces); + +#define SCardListInterfaces WINELIB_NAME_AW(SCardListInterfaces) + +LONG WINAPI SCardGetProviderIdA( + SCARDCONTEXT hContext, + LPCSTR szCard, + LPGUID pguidProviderId); +LONG WINAPI SCardGetProviderIdW( + SCARDCONTEXT hContext, + LPCWSTR szCard, + LPGUID pguidProviderId); + +#define SCardGetProviderId WINELIB_NAME_AW(SCardGetProviderId) + +LONG WINAPI SCardGetCardTypeProviderNameA( + SCARDCONTEXT hContext, + LPCSTR szCardName, + DWORD dwProviderId, + LPSTR szProvider, + LPDWORD pcchProvider); +LONG WINAPI SCardGetCardTypeProviderNameW( + SCARDCONTEXT hContext, + LPCWSTR szCardName, + DWORD dwProviderId, + LPWSTR szProvider, + LPDWORD pcchProvider); + +#define SCardGetCardTypeProviderName WINELIB_NAME_AW(SCardGetCardTypeProviderName) + +LONG WINAPI SCardIntroduceReaderGroupA( + SCARDCONTEXT hContext, + LPCSTR szGroupName); +LONG WINAPI SCardIntroduceReaderGroupW( + SCARDCONTEXT hContext, + LPCWSTR szGroupName); + +#define SCardIntroduceReaderGroup WINELIB_NAME_AW(SCardIntroduceReaderGroup) + +LONG WINAPI SCardForgetReaderGroupA( + SCARDCONTEXT hContext, + LPCSTR szGroupName); +LONG WINAPI SCardForgetReaderGroupW( + SCARDCONTEXT hContext, + LPCWSTR szGroupName); + +#define SCardForgetReaderGroup WINELIB_NAME_AW(SCardForgetReaderGroup) + + +LONG WINAPI SCardIntroduceReaderA( + SCARDCONTEXT hContext, + LPCSTR szReaderName, + LPCSTR szDeviceName); +LONG WINAPI SCardIntroduceReaderW( + SCARDCONTEXT hContext, + LPCWSTR szReaderName, + LPCWSTR szDeviceName); + +#define SCardIntroduceReader WINELIB_NAME_AW(SCardIntroduceReader) + +LONG WINAPI SCardForgetReaderA( + SCARDCONTEXT hContext, + LPCSTR szReaderName); +LONG WINAPI SCardForgetReaderW( + SCARDCONTEXT hContext, + LPCWSTR szReaderName); + +#define SCardForgetReader WINELIB_NAME_AW(SCardForgetReader) + +LONG WINAPI SCardAddReaderToGroupA( + SCARDCONTEXT hContext, + LPCSTR szReaderName, + LPCSTR szGroupName); +LONG WINAPI SCardAddReaderToGroupW( + SCARDCONTEXT hContext, + LPCWSTR szReaderName, + LPCWSTR szGroupName); + +#define SCardAddReaderToGroup WINELIB_NAME_AW(SCardAddReaderToGroup) + +LONG WINAPI SCardRemoveReaderFromGroupA( + SCARDCONTEXT hContext, + LPCSTR szReaderName, + LPCSTR szGroupName); +LONG WINAPI SCardRemoveReaderFromGroupW( + SCARDCONTEXT hContext, + LPCWSTR szReaderName, + LPCWSTR szGroupName); + +#define SCardRemoveReaderFromGroup WINELIB_NAME_AW(SCardRemoveReaderFromGroup) + +LONG WINAPI SCardIntroduceCardTypeA( + SCARDCONTEXT hContext, + LPCSTR szCardName, + LPCGUID pguidPrimaryProvider, + LPCGUID rgguidInterfaces, + DWORD dwInterfaceCount, + const BYTE* pbAtr, + const BYTE* pbAtrMask, + DWORD cbAtrLen); +LONG WINAPI SCardIntroduceCardTypeW( + SCARDCONTEXT hContext, + LPCWSTR szCardName, + LPCGUID pguidPrimaryProvider, + LPCGUID rgguidInterfaces, + DWORD dwInterfaceCount, + const BYTE* pbAtr, + const BYTE* pbAtrMask, + DWORD cbAtrLen); + +#define SCardIntroduceCardType WINELIB_NAME_AW(SCardIntroduceCardType) + +LONG WINAPI SCardSetCardTypeProviderNameA( + SCARDCONTEXT hContext, + LPCSTR szCardName, + DWORD dwProviderId, + LPCSTR szProvider); +LONG WINAPI SCardSetCardTypeProviderNameW( + SCARDCONTEXT hContext, + LPCWSTR szCardName, + DWORD dwProviderId, + LPCWSTR szProvider); + +#define SCardSetCardTypeProviderName WINELIB_NAME_AW(SCardSetCardTypeProviderName) + +LONG WINAPI SCardForgetCardTypeA( + SCARDCONTEXT hContext, + LPCSTR szCardName); +LONG WINAPI SCardForgetCardTypeW( + SCARDCONTEXT hContext, + LPCWSTR szCardName); + +#define SCardForgetCardType WINELIB_NAME_AW(SCardForgetCardType) + +LONG WINAPI SCardLocateCardsA( + SCARDCONTEXT hContext, + LPCSTR mszCards, + LPSCARD_READERSTATEA rgReaderStates, + DWORD cReaders); +LONG WINAPI SCardLocateCardsW( + SCARDCONTEXT hContext, + LPCWSTR mszCards, + LPSCARD_READERSTATEW rgReaderStates, + DWORD cReaders); + +#define SCardLocateCards WINELIB_NAME_AW(SCardLocateCards) + +LONG WINAPI SCardLocateCardsByATRA( + SCARDCONTEXT hContext, + LPSCARD_ATRMASK rgAtrMasks, + DWORD cAtrs, + LPSCARD_READERSTATEA rgReaderStates, + DWORD cReaders); +LONG WINAPI SCardLocateCardsByATRW( + SCARDCONTEXT hContext, + LPSCARD_ATRMASK rgAtrMasks, + DWORD cAtrs, + LPSCARD_READERSTATEW rgReaderStates, + DWORD cReaders); + +#define SCardLocateCardsByATR WINELIB_NAME_AW(SCardLocateCardsByATR) + +/* + * Smart card communication functions + */ + +LONG WINAPI SCardConnectA( + SCARDCONTEXT hContext, + LPCSTR szReader, + DWORD dwShareMode, + DWORD dwPreferredProtocols, + LPSCARDHANDLE phCard, + LPDWORD pdwActiveProtocol); +LONG WINAPI SCardConnectW( + SCARDCONTEXT hContext, + LPCWSTR szReader, + DWORD dwShareMode, + DWORD dwPreferredProtocols, + LPSCARDHANDLE phCard, + LPDWORD pdwActiveProtocol); + +#define SCardConnect WINELIB_NAME_AW(SCardConnect) + +LONG WINAPI SCardReconnect( + SCARDHANDLE hCard, + DWORD dwShareMode, + DWORD dwPreferredProtocols, + DWORD dwInitialization, + LPDWORD pdwActiveProtocol); + +LONG WINAPI SCardDisconnect( + SCARDHANDLE hCard, + DWORD dwDisposition); + +LONG WINAPI SCardBeginTransaction( + SCARDHANDLE hCard); + +LONG WINAPI SCardEndTransaction( + SCARDHANDLE hCard, + DWORD dwDisposition); + +LONG WINAPI SCardCancelTransaction( + SCARDHANDLE hCard); + +LONG WINAPI SCardControl( + SCARDHANDLE hCard, + DWORD dwControlCode, + LPCVOID pbSendBuffer, + DWORD cbSendLength, + LPVOID pbRecvBuffer, + DWORD cbRecvLength, + LPDWORD lpBytesReturned); + +LONG WINAPI SCardTransmit( + SCARDHANDLE hCard, + LPCSCARD_IO_REQUEST pioSendPci, + const BYTE* pbSendBuffer, + DWORD cbSendLength, + LPSCARD_IO_REQUEST pioRecvPci, + LPBYTE pbRecvBuffer, + LPDWORD pcbRecvLength); + +LONG WINAPI SCardCancel( + SCARDCONTEXT hContext); + + +/* + * Smart card tracking functions + */ + +LONG WINAPI SCardState( + SCARDHANDLE hCard, + LPDWORD pdwState, + LPDWORD pdwProtocol, + LPBYTE pbAtr, + LPDWORD pcbAtrLen); + +LONG WINAPI SCardStatusA( + SCARDHANDLE hCard, + LPSTR mszReaderNames, + LPDWORD pcchReaderLen, + LPDWORD pdwState, + LPDWORD pdwProtocol, + LPBYTE pbAtr, + LPDWORD pcbAtrLen); +LONG WINAPI SCardStatusW( + SCARDHANDLE hCard, + LPWSTR mszReaderNames, + LPDWORD pcchReaderLen, + LPDWORD pdwState, + LPDWORD pdwProtocol, + LPBYTE pbAtr, + LPDWORD pcbAtrLen); + +#define SCardStatus WINELIB_NAME_AW(SCardStatus) + +LONG WINAPI SCardGetStatusChangeA( + SCARDCONTEXT hContext, + DWORD dwTimeout, + LPSCARD_READERSTATEA rgReaderStates, + DWORD cReaders); +LONG WINAPI SCardGetStatusChangeW( + SCARDCONTEXT hContext, + DWORD dwTimeout, + LPSCARD_READERSTATEW rgReaderStates, + DWORD cReaders); + +#define SCardGetStatusChange WINELIB_NAME_AW(SCardGetStatusChange) + +LONG WINAPI SCardGetAttrib( + SCARDHANDLE hCard, + DWORD dwAttrId, + LPBYTE pbAttr, + LPDWORD pcbAttrLen); + +LONG WINAPI SCardSetAttrib( + SCARDHANDLE hCard, + DWORD dwAttrId, + const BYTE* pbAttr, + DWORD cbAttrLen); + + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/include/winsmcrd.h b/include/winsmcrd.h new file mode 100755 index 0000000..cc03a35 --- /dev/null +++ b/include/winsmcrd.h @@ -0,0 +1,190 @@ +/* + * Copyright 2007 Mounir IDRASSI (mounir.idrassi@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_WINSCMCRD_H +#define _WINE_WINSCMCRD_H + + +#define MAX_ATR_SIZE 36 /* Maximum ATR size */ + +#ifndef SCARD_ATR_LENGTH +#define SCARD_ATR_LENGTH MAX_ATR_SIZE +#endif + +/* + * These values define the protocol used to + * communicate with the card + */ +#define SCARD_PROTOCOL_UNDEFINED 0x00000000 /* No protocol defined */ +#define SCARD_PROTOCOL_T0 0x00000001 /* T=0 protocol. */ +#define SCARD_PROTOCOL_T1 0x00000002 /* T=1 protocol */ +#define SCARD_PROTOCOL_RAW 0x00010000 /* Raw protocol, for memory card for example */ +#define SCARD_PROTOCOL_Tx (SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1) /* Can be used in SCardConnect */ + +/* + * The following value is used as a length value + * in functions where we want the winscard dll + * to allocate memory for us + */ +#define SCARD_AUTOALLOCATE (DWORD)(-1) + +/* + * Values used by SCardEstablishContext + */ +#define SCARD_SCOPE_USER 0x0000 /* context in user scope */ +#define SCARD_SCOPE_TERMINAL 0x0001 /* context in terminal scope */ +#define SCARD_SCOPE_SYSTEM 0x0002 /* context in system scope */ + +/* + * Flags used by SCardGetStatusChange to indicate + * the reader status. + */ +#define SCARD_STATE_UNAWARE 0x0000 /* called want to know the current state */ +#define SCARD_STATE_IGNORE 0x0001 /* don't update the state for the given reader */ +#define SCARD_STATE_CHANGED 0x0002 /* reader state has not changed */ +#define SCARD_STATE_UNKNOWN 0x0004 /* reader state unknown */ +#define SCARD_STATE_UNAVAILABLE 0x0008 /* reader state unavailable */ +#define SCARD_STATE_EMPTY 0x0010 /* no card on the reader*/ +#define SCARD_STATE_PRESENT 0x0020 /* card present on the reader */ +#define SCARD_STATE_ATRMATCH 0x0040 /* card's ATR matches the given ATR */ +#define SCARD_STATE_EXCLUSIVE 0x0080 /* an exclusive connection on the card exists*/ +#define SCARD_STATE_INUSE 0x0100 /* card in use but the connection can be shared */ +#define SCARD_STATE_MUTE 0x0200 /* card is mute, doesn't answer to reset */ +#define SCARD_STATE_UNPOWERED 0x0400 /* card present but not powered */ + + +/* + * These values define how SCardConnect should + * connect to the card + */ +#define SCARD_SHARE_EXCLUSIVE 0x0001 /* connect to the card in exclusive mode (no other connection allowed) */ +#define SCARD_SHARE_SHARED 0x0002 /* connection can be shared with others */ +#define SCARD_SHARE_DIRECT 0x0003 /* access directly the reader, no other connection allowed */ + +/* + * Values used by SCardDisconnect to specify + * how the card should be treated on closing + * the connection + */ +#define SCARD_LEAVE_CARD 0x0000 /* do nothing */ +#define SCARD_RESET_CARD 0x0001 /* reset the card */ +#define SCARD_UNPOWER_CARD 0x0002 /* unpower the card */ +#define SCARD_EJECT_CARD 0x0003 /* eject the card from the reader if supported */ + +/* + * Values returned by SCardStatus indicating + * the reader's state + */ +#define SCARD_UNKNOWN 0x0001 /* state unknown */ +#define SCARD_ABSENT 0x0002 /* no card on the reader */ +#define SCARD_PRESENT 0x0004 /* card is present on the reader */ +#define SCARD_SWALLOWED 0x0008 /* card inside the reader but not powered */ +#define SCARD_POWERED 0x0010 /* card present and powered */ +#define SCARD_NEGOTIABLE 0x0020 /* card present and ready to negotiate protocol */ +#define SCARD_SPECIFIC 0x0040 /* card has ended protocol negotiation */ + +/* + * definitions used by SCardGetAttrib and SCardSetAttrib for + * requesting and setting readers attributes + * Other values maybe supported + */ +#define SCARD_ATTR_ICC_PRESENCE 0x00090300 +#define SCARD_ATTR_CURRENT_PROTOCOL_TYPE 0x00080201 +#define SCARD_ATTR_ATR_STRING 0x00090303 +#define SCARD_ATTR_DEVICE_FRIENDLY_NAME_A 0x7FFF0003 +#define SCARD_ATTR_DEVICE_FRIENDLY_NAME_W 0x7FFF0005 +#define SCARD_ATTR_DEVICE_SYSTEM_NAME_A 0x7FFF0004 +#define SCARD_ATTR_DEVICE_SYSTEM_NAME_W 0x7FFF0006 + +#define SCARD_ATTR_DEVICE_FRIENDLY_NAME WINELIB_NAME_AW(SCARD_ATTR_DEVICE_FRIENDLY_NAME_) +#define SCARD_ATTR_DEVICE_SYSTEM_NAME WINELIB_NAME_AW(SCARD_ATTR_DEVICE_SYSTEM_NAME_) + +/* + * Type definitions used by all the functions + */ +typedef ULONG_PTR SCARDCONTEXT; +typedef SCARDCONTEXT *PSCARDCONTEXT; +typedef SCARDCONTEXT *LPSCARDCONTEXT; + +typedef ULONG_PTR SCARDHANDLE; +typedef SCARDHANDLE *PSCARDHANDLE; +typedef SCARDHANDLE *LPSCARDHANDLE; + + +/* + * SCARD_READERSTATE is used by SCardGetStatusChange as an + * input/output for any change of readers states + */ +typedef struct +{ + LPCSTR szReader; + void *pvUserData; + unsigned long dwCurrentState; + unsigned long dwEventState; + unsigned long cbAtr; + unsigned char rgbAtr[MAX_ATR_SIZE]; +} +SCARD_READERSTATEA; + +typedef struct +{ + LPCWSTR szReader; + void *pvUserData; + unsigned long dwCurrentState; + unsigned long dwEventState; + unsigned long cbAtr; + unsigned char rgbAtr[MAX_ATR_SIZE]; +} +SCARD_READERSTATEW; + +typedef SCARD_READERSTATEA *PSCARD_READERSTATEA, *LPSCARD_READERSTATEA; + +typedef SCARD_READERSTATEW *PSCARD_READERSTATEW, *LPSCARD_READERSTATEW; + +DECL_WINELIB_TYPE_AW(SCARD_READERSTATE) +DECL_WINELIB_TYPE_AW(PSCARD_READERSTATE) +DECL_WINELIB_TYPE_AW(LPSCARD_READERSTATE) + +/* + * This structure is used by SCardTransmit to communicate + * with the card + */ +typedef struct _SCARD_IO_REQUEST +{ + unsigned long dwProtocol; /* protocol used for this request */ + unsigned long cbPciLength; /* total length of the request data, usually sizeof(SCARD_IO_REQUEST) */ +} +SCARD_IO_REQUEST, *PSCARD_IO_REQUEST, *LPSCARD_IO_REQUEST; + +typedef const SCARD_IO_REQUEST *LPCSCARD_IO_REQUEST; + +/* + * This structure is used by the new functions + * SCardLocateCardsByATRA and SCardLocateCardsByATRW + */ +typedef struct _SCARD_ATRMASK { + unsigned long cbAtr; /* number of used bytes in rgbAtr and rgbMask*/ + unsigned char rgbAtr[MAX_ATR_SIZE]; /* ATR bytes of the card */ + unsigned char rgbMask[MAX_ATR_SIZE]; /* Mask used for accepted ATR values */ +} SCARD_ATRMASK; + +typedef SCARD_ATRMASK *PSCARD_ATRMASK, *LPSCARD_ATRMASK; + +#endif +