/******************************************************************************* * Author : Lionel VICTOR * * Compiler : gcc, Visual C++ * Target : unix, Windows * * Description : Perl wrapper to the PCSC API * * Copyright (C) 2001 - Lionel VICTOR * Copyright (c) 2003-2010 - Ludovic ROUSSEAU * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * ******************************************************************************/ /* $Id: PCSCperl.h,v 1.22 2010-10-27 08:04:20 rousseau Exp $ */ /****************************************************************************** * Contains basic definitions for a Perl wrapper to PCSC-lite. The code * here is meant to be portable to most Unices. It should as well compile * under Microsoft Windows without modifications. * Most macros in this file help portability. ******************************************************************************/ #ifndef PCSC_PERL #define PCSC_PERL #ifdef WIN32 # include # include # define LOAD_LIB() LoadLibrary("winscard.dll") # define CLOSE_LIB FreeLibrary # define DLL_HANDLE HINSTANCE # define GET_FCT GetProcAddress /* The following defines are only set with PCSClite, we have to * declare them for use under WIN32 */ # define MAX_ATR_SIZE 33 # define MAX_BUFFER_SIZE 264 #else /* WIN32 */ /* WIN32 entry points are called with the WINAPI convention * the following hack is to handle this shit */ #define WINAPI #ifdef __APPLE__ #include #include #define LPCTSTR LPCSTR #include #include #include #include #define DLL_HANDLE CFBundleRef DLL_HANDLE LOAD_LIB() { CFStringRef bundlePath; CFURLRef bundleURL; CFBundleRef bundle; bundlePath = CFStringCreateWithCString(NULL, "/System/Library/Frameworks/PCSC.framework", kCFStringEncodingMacRoman); if (bundlePath == NULL) { return NULL; } bundleURL = CFURLCreateWithFileSystemPath(NULL, bundlePath, kCFURLPOSIXPathStyle, TRUE); CFRelease(bundlePath); if (bundleURL == NULL) { return NULL; } bundle = CFBundleCreate(NULL, bundleURL); CFRelease(bundleURL); if (bundle == NULL) { return NULL; } if (!CFBundleLoadExecutable(bundle)) { CFRelease(bundle); return NULL; } return bundle; } void* GET_FCT(CFBundleRef bundle, char *fct_name) { CFStringRef cfName; void * fct_addr=NULL; cfName = CFStringCreateWithCString(NULL, fct_name, kCFStringEncodingMacRoman); if (cfName == NULL) { return NULL; } fct_addr = CFBundleGetFunctionPointerForName(bundle, cfName); CFRelease(cfName); return fct_addr; } #else /* other Unixes */ # include # include # define LOAD_LIB() dlopen("libpcsclite.so.1", RTLD_LAZY) # define CLOSE_LIB(x) dlclose(x) # define DLL_HANDLE void* # define GET_FCT dlsym #define LPCTSTR LPCSTR #define LPTSTR LPSTR #endif /* __APPLE__ */ #endif /* WIN32 */ /* extended APDU supported? (pcsc-lite >= 1.3.2 only) */ #ifndef MAX_BUFFER_SIZE_EXTENDED #define MAX_BUFFER_SIZE_EXTENDED MAX_BUFFER_SIZE #endif /* Definitine fuctions imported from the PCSC library and used by the stub */ typedef LONG (WINAPI *TSCardEstablishContext) ( DWORD, LPCVOID, LPCVOID, LPSCARDCONTEXT ); typedef LONG (WINAPI *TSCardReleaseContext) ( SCARDCONTEXT ); typedef LONG (WINAPI *TSCardListReaders) ( SCARDCONTEXT, LPCTSTR, LPTSTR, LPDWORD ); typedef LONG (WINAPI *TSCardConnect) ( SCARDCONTEXT, LPCTSTR, DWORD, DWORD, LPSCARDHANDLE, LPDWORD ); typedef LONG (WINAPI *TSCardReconnect) ( SCARDHANDLE, DWORD, DWORD, DWORD, LPDWORD ); typedef LONG (WINAPI *TSCardDisconnect) ( SCARDHANDLE, DWORD ); typedef LONG (WINAPI *TSCardBeginTransaction) ( SCARDHANDLE ); typedef LONG (WINAPI *TSCardEndTransaction) ( SCARDHANDLE, DWORD ); typedef LONG (WINAPI *TSCardTransmit) ( SCARDHANDLE, LPCSCARD_IO_REQUEST, LPCBYTE, DWORD, LPSCARD_IO_REQUEST, LPBYTE, LPDWORD ); typedef LONG (WINAPI *TSCardControl) ( SCARDHANDLE, DWORD, LPCBYTE, DWORD, LPBYTE, DWORD, LPDWORD ); typedef LONG (WINAPI *TSCardStatus) ( SCARDHANDLE, LPTSTR, LPDWORD, LPDWORD, LPDWORD, LPBYTE, LPDWORD ); typedef LONG (WINAPI *TSCardGetStatusChange) ( SCARDHANDLE, DWORD, SCARD_READERSTATE *, DWORD ); typedef LONG (WINAPI *TSCardCancel) ( SCARDCONTEXT ); /* these functions are not used */ /* LONG SCardListReaderGroups( SCARDCONTEXT, LPSTR, LPDWORD ); */ /* Declares a variable for any imported variable */ /* static LPSCARD_IO_REQUEST gpioSCardT0Pci; static LPSCARD_IO_REQUEST gpioSCardT1Pci; static LPSCARD_IO_REQUEST gpioSCardRawPci; */ /* Declares a variable for any imported function */ static TSCardEstablishContext hEstablishContext = NULL; static TSCardReleaseContext hReleaseContext = NULL; static TSCardListReaders hListReaders = NULL; static TSCardConnect hConnect = NULL; static TSCardReconnect hReconnect = NULL; static TSCardDisconnect hDisconnect = NULL; static TSCardBeginTransaction hBeginTransaction = NULL; static TSCardEndTransaction hEndTransaction = NULL; static TSCardTransmit hTransmit = NULL; static TSCardControl hControl = NULL; static TSCardStatus hStatus = NULL; static TSCardGetStatusChange hGetStatusChange = NULL; static TSCardCancel hCancel = NULL; /* Also declares some static variables */ static DLL_HANDLE ghDll = NULL; static LONG gnLastError = SCARD_S_SUCCESS; /* these functions are not used */ /* TSCardListReaderGroups hListReaderGroups = NULL; */ #define SCARD_P_ALREADY_CONNECTED 0x22200001 #define SCARD_P_NOT_CONNECTED 0x22200002 #endif /* End of File */