[SmartcardServices-Changes] [113] trunk/SmartCardServices/src/PKCS11dotNetV2

source_changes at macosforge.org source_changes at macosforge.org
Mon Feb 8 01:41:17 PST 2010


Revision: 113
          http://trac.macosforge.org/projects/smartcardservices/changeset/113
Author:   ludovic.rousseau at gmail.com
Date:     2010-02-08 01:41:15 -0800 (Mon, 08 Feb 2010)
Log Message:
-----------
resync with upstream (release 2.1.3)

Modified Paths:
--------------
    trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/application.cpp
    trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/beroctet.cpp
    trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/cardcache.cpp
    trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/dataobject.h
    trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/log.cpp
    trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/log.h
    trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/pkcs11.cpp
    trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/pkcs11.h
    trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/pkcs11f.h
    trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/pkcs11t.h
    trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/platconfig.h
    trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/sctoken.cpp
    trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/sctoken.h
    trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/secretkeyobject.h
    trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/session.cpp
    trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/slot.cpp
    trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/slot.h
    trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/x509pubkeycertobject.h
    trunk/SmartCardServices/src/PKCS11dotNetV2/configure.in
    trunk/SmartCardServices/src/PKCS11dotNetV2/cppMarshaller/Marshaller.cpp
    trunk/SmartCardServices/src/PKCS11dotNetV2/cppMarshaller/PCSC.cpp

Modified: trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/application.cpp
===================================================================
--- trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/application.cpp	2010-02-04 14:54:20 UTC (rev 112)
+++ trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/application.cpp	2010-02-08 09:41:15 UTC (rev 113)
@@ -66,13 +66,13 @@
 #ifndef _XCL_
 CK_RV Application::InitApplication( )
 {
-   Log::begin( "Application::InitApplication" );
+   //Log::begin( "Application::InitApplication" );
 
    // do the enumeration of slots
    CK_ULONG hResult = SCardEstablishContext( SCARD_SCOPE_USER, NULL, NULL, &Application::_hContext );
 
-   Log::log( "Application::InitApplication - SCardEstablishContext <%#02x>", hResult );
-   Log::log( "Application::InitApplication - Application::_hContext <%#02x>", Application::_hContext );
+   //Log::log( "Application::InitApplication - SCardEstablishContext <%#02x>", hResult );
+   //Log::log( "Application::InitApplication - Application::_hContext <%#02x>", Application::_hContext );
 
    if( SCARD_S_SUCCESS != hResult )
    {
@@ -88,7 +88,7 @@
    }
 #endif
 
-   Log::end( "Application::InitApplication" );
+   //Log::end( "Application::InitApplication" );
 
    return CKR_OK;
 }
@@ -97,7 +97,7 @@
 
 CK_RV Application::InitApplication( )
 {
-    Log::begin( "Application::InitApplication" );
+    //Log::begin( "Application::InitApplication" );
     u4 deviceID;
     u4 rv;
     xCL_DevicePtr deviceList;
@@ -143,7 +143,7 @@
 
 CK_RV Application::Enumerate( CK_BBOOL tokenPresent, CK_SLOT_ID_PTR pSlotList, CK_ULONG_PTR pulCount )
 {
-   Log::begin( "Application::Enumerate" );
+   //Log::begin( "Application::Enumerate" );
 
    CK_ULONG   slotNb              = 0;
    LPTSTR     pReader             = NULL;
@@ -152,7 +152,7 @@
 
    if( NULL_PTR == pulCount )
    {
-      Log::error( "Application::Enumerate", "CKR_ARGUMENTS_BAD" );
+      //Log::error( "Application::Enumerate", "CKR_ARGUMENTS_BAD" );
       return CKR_ARGUMENTS_BAD;
    }
 
@@ -164,35 +164,35 @@
       if( NULL_PTR != Application::_slotCache[ i ] )
       {
          currentCache[ i ] = *(Application::_slotCache[ i ]->_readerName);
-         Log::log( "Application::Enumerate - currentCache[ %d ] <%s>", i, currentCache[ i ].c_str( ) );
+         //Log::log( "Application::Enumerate - currentCache[ %d ] <%s>", i, currentCache[ i ].c_str( ) );
       }
    }
 
    // Get the readers from the PCSC layer
    DWORD readerListCharLength = 0;
    hResult = SCardListReaders( Application::_hContext, NULL, NULL, &readerListCharLength );
-   Log::log( "Application::Enumerate - readerListCharLength <%#02x>", readerListCharLength );
-   Log::log( "Application::Enumerate - SCardListReaders <%#02x>", hResult );
+   //Log::log( "Application::Enumerate - readerListCharLength <%#02x>", readerListCharLength );
+   //Log::log( "Application::Enumerate - SCardListReaders <%#02x>", hResult );
    if( SCARD_S_SUCCESS != hResult )
    {
-      Log::error( "Application::Enumerate", "CKR_GENERAL_ERROR" );
+      //Log::error( "Application::Enumerate", "CKR_GENERAL_ERROR" );
       return CKR_GENERAL_ERROR;
    }
 
    LPTSTR pReaderList = (lpCharPtr)malloc( sizeof(char) * readerListCharLength );
    if( NULL == pReaderList )
    {
-      Log::error( "Application::Enumerate", "CKR_HOST_MEMORY" );
+      //Log::error( "Application::Enumerate", "CKR_HOST_MEMORY" );
       return CKR_HOST_MEMORY;
    }
    memset( pReaderList, 0, sizeof(char) * readerListCharLength );
 
    hResult = SCardListReaders( Application::_hContext, NULL, pReaderList, &readerListCharLength);
-   Log::log( "Application::Enumerate - SCardListReaders 2 <%#02x>", hResult );
+   //Log::log( "Application::Enumerate - SCardListReaders 2 <%#02x>", hResult );
    if( SCARD_S_SUCCESS != hResult )
    {
       free( pReaderList );
-      Log::error( "Application::Enumerate", "CKR_GENERAL_ERROR" );
+      //Log::error( "Application::Enumerate", "CKR_GENERAL_ERROR" );
       return CKR_GENERAL_ERROR;
    }
 
@@ -207,13 +207,13 @@
    while( pReader && ( '\0' != *pReader ) )
    {
       currentPcscList[ i ] = pReader;
-      Log::log( "Application::Enumerate - PCSC List[ %d ] <%s>", i, currentPcscList[ i ].c_str( ) );
+      //Log::log( "Application::Enumerate - PCSC List[ %d ] <%s>", i, currentPcscList[ i ].c_str( ) );
       i++;
       if( i > CONFIG_MAX_SLOT )
       {
          /*
          free( pReaderList );
-         Log::error( "Application::Enumerate", "CKR_HOST_MEMORY" );
+         //Log::error( "Application::Enumerate", "CKR_HOST_MEMORY" );
          return CKR_HOST_MEMORY;
          */
          break;
@@ -282,7 +282,7 @@
             CK_RV rv = addSlot( currentPcscList[ i ] );
             if( CKR_OK != rv )
             {
-               Log::error( "Application::Enumerate", "addSlot failed" );
+               //Log::error( "Application::Enumerate", "addSlot failed" );
                return rv;
             }
          }
@@ -313,13 +313,13 @@
             {
                // We found a card in this reader
                Application::_slotCache[i]->_slotInfo.flags |= CKF_TOKEN_PRESENT;
-               Log::log( "Application::Enumerate - New Cache[ %d ] - Name <%s> - Token present", i, Application::_slotCache[ i ]->_readerName->c_str( ) );
+               //Log::log( "Application::Enumerate - New Cache[ %d ] - Name <%s> - Token present", i, Application::_slotCache[ i ]->_readerName->c_str( ) );
             }
             else
             {
                // No card in this reader
                Application::_slotCache[i]->_slotInfo.flags &= ~CKF_TOKEN_PRESENT;
-               Log::log( "Application::Enumerate - New Cache[ %d ] - Name <%s> - Token NOT present", i, Application::_slotCache[ i ]->_readerName->c_str( ) );
+               //Log::log( "Application::Enumerate - New Cache[ %d ] - Name <%s> - Token NOT present", i, Application::_slotCache[ i ]->_readerName->c_str( ) );
             }
          }
 
@@ -342,7 +342,7 @@
    if((pSlotList != NULL_PTR)&&(*pulCount < slotNb))
    {
       *pulCount = slotNb;
-      Log::error( "Application::Enumerate", "CKR_BUFFER_TOO_SMALL" );
+      //Log::error( "Application::Enumerate", "CKR_BUFFER_TOO_SMALL" );
       return CKR_BUFFER_TOO_SMALL;
    }
 
@@ -380,7 +380,7 @@
       }
    }
 
-   Log::end( "Application::Enumerate" );
+   //Log::end( "Application::Enumerate" );
 
    return CKR_OK;
 }
@@ -564,20 +564,20 @@
 */
 void Application::ClearCache(void)
 {
+   Log::begin( "Application::ClearCache" );
+
    // initialize the slot cache
-   CK_SLOT_ID sid = 0;
-   for(;sid<CONFIG_MAX_SLOT;sid++)
+   for( int sid = 0 ; sid < CONFIG_MAX_SLOT ; sid++ )
    {
-      if(Application::_slotCache[sid] != NULL_PTR)
+      Slot* slot = Application::_slotCache[ sid ];
+      if( NULL_PTR != slot )
       {
-         Slot* slot = Application::_slotCache[sid];
 #ifdef INCLUDE_EVENTING
          if(slot->_tracker != NULL_PTR)
          {
-            slot->_tracker->stop();
+            slot->_tracker->stop( );
          }
 #endif
-
          delete slot;
          Application::_slotCache[sid] = NULL_PTR;
       }
@@ -590,6 +590,8 @@
    // we should just signal all the events
    CryptokiEvent.Signal();
 #endif
+
+   Log::end( "Application::ClearCache" );
 }
 
 

Modified: trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/beroctet.cpp
===================================================================
--- trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/beroctet.cpp	2010-02-04 14:54:20 UTC (rev 112)
+++ trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/beroctet.cpp	2010-02-08 09:41:15 UTC (rev 113)
@@ -27,6 +27,8 @@
 
 #include <string.h>
 #include <stdlib.h>
+#include <stdio.h>
+
 #include "beroctet.h"
 
 using namespace std;

Modified: trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/cardcache.cpp
===================================================================
--- trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/cardcache.cpp	2010-02-04 14:54:20 UTC (rev 112)
+++ trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/cardcache.cpp	2010-02-08 09:41:15 UTC (rev 113)
@@ -28,7 +28,7 @@
 #define KEYSPEC_KEYEXCHANGE  0x01
 #define KEYSPEC_SIGNATURE    0x02
 #define MAX_RETRY 2
-#define LOW_MEMORY_LIMIT 5000
+#define LOW_MEMORY_LIMIT 25000
 
 
 /* Constructor
@@ -47,12 +47,16 @@
 {
    try
    {
-      s4 freeMemory = _mscm->GetMemory( );
+      if( NULL != _mscm )
+      {
+         s4 freeMemory = _mscm->GetMemory( );
 
-      if ( freeMemory < LOW_MEMORY_LIMIT )
-      {
-          Log::error( "CardCache::ManageGC", "ForceGarbageCollector" );
-         _mscm->ForceGarbageCollector( );
+         if ( freeMemory < LOW_MEMORY_LIMIT )
+         {
+             //printf( "\nCardCache::ManageGC - ForceGarbageCollector\n" );
+             Log::error( "CardCache::ManageGC", "ForceGarbageCollector" );
+            _mscm->ForceGarbageCollector( );
+         }
       }
    }
    catch( ... )
@@ -72,9 +76,9 @@
    {
       try
       {
-         ManageGC( );
          ntry++;
          _mscm->WriteFile( const_cast< std::string* >( &path ), const_cast< u1Array* >( &data ) );
+         ManageGC( );
          _fileCache[ path ] = data;
          break;
       }
@@ -110,6 +114,8 @@
 */
 const u1Array & CardCache::ReadFile( std::string const & path )
 {
+   //Log::log( "***** CardCache::ReadFile - path <%s>", path.c_str( ) );
+
    // V2+ cards may throw OutOfMemoryException from ReadFile, however
    // it may recover from this by forcing the garbage collection to
    // occur. In fact as a result of a ReadFile command that throws
@@ -119,14 +125,16 @@
    map<string, u1Array>::const_iterator ifile = _fileCache.find( path );
    if( ifile == _fileCache.end( ) )
    {
+      //Log::log( "****** CardCache::ReadFile - read card" );
+
       int ntry = 0;
       while( ntry < MAX_RETRY )
       {
          try
          {
-            ManageGC( );
             ntry++;
             auto_ptr< u1Array > data( _mscm->ReadFile( const_cast< std::string* >( &path ), 0 ) );
+            ManageGC( );
             _fileCache[ path ] = *data;
             break;
          }
@@ -246,9 +254,9 @@
       {
          try
          {
-            ManageGC( );
             ntry++;
             auto_ptr<StringArray> files( _mscm->GetFiles( const_cast<string*>( &dir ) ) );
+            ManageGC( );
             for( u4 i = 0; i < files->GetLength( ) ; i++ )
             {
                vfile.push_back( *files->GetStringAt( i ) );

Modified: trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/dataobject.h
===================================================================
--- trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/dataobject.h	2010-02-04 14:54:20 UTC (rev 112)
+++ trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/dataobject.h	2010-02-08 09:41:15 UTC (rev 113)
@@ -34,7 +34,7 @@
 public:
 
     DataObject();
-    ~DataObject();
+    virtual ~DataObject();
 
     CK_BBOOL Compare(CK_ATTRIBUTE attribute);
     CK_RV SetAttribute(CK_ATTRIBUTE attribute,CK_BBOOL objCreation);

Modified: trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/log.cpp
===================================================================
--- trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/log.cpp	2010-02-04 14:54:20 UTC (rev 112)
+++ trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/log.cpp	2010-02-08 09:41:15 UTC (rev 113)
@@ -27,6 +27,7 @@
 #define T_KEY_GEN_MECHANISM 7
 #define T_UNKNOWN 8
 
+unsigned long Log::m_ulStart = 0;
 
 /* Log a message into the log file
 */
@@ -2180,3 +2181,27 @@
 #endif
 }
 
+
+/*
+*/
+void Log::start( void )
+{
+#ifdef __DEBUG_GEMALTO__
+#ifdef WIN32
+   m_ulStart = GetTickCount( );
+#endif
+#endif
+}
+
+
+/*
+*/
+void Log::stop( const char* a_pMethod )
+{
+#ifdef __DEBUG_GEMALTO__
+#ifdef WIN32
+   unsigned long ulTickCount = GetTickCount( ) - m_ulStart;
+   Log::log( "%s - Spend <%ld> milliseconds", a_pMethod, ulTickCount );
+#endif
+#endif
+}

Modified: trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/log.h
===================================================================
--- trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/log.h	2010-02-04 14:54:20 UTC (rev 112)
+++ trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/log.h	2010-02-08 09:41:15 UTC (rev 113)
@@ -42,6 +42,9 @@
    static void begin( const char* a_pMethod );
    static void end( const char* a_pMethod );
 
+   static void start( void );
+   static void stop( const char* a_pMethod );
+
    static void logCK_SLOT_ID_PTR( const char*, CK_SLOT_ID_PTR, CK_ULONG_PTR );
    static void logCK_SLOT_INFO_PTR( const char*, CK_SLOT_INFO_PTR );
    static void logCK_C_INITIALIZE_ARGS_PTR( const char*, CK_C_INITIALIZE_ARGS_PTR );
@@ -84,6 +87,9 @@
 
    template<typename T> static void classtoString( const T & value, std::string &result );
 
+   static unsigned long m_ulStart;
+
+
 };
 
 

Modified: trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/pkcs11.cpp
===================================================================
--- trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/pkcs11.cpp	2010-02-04 14:54:20 UTC (rev 112)
+++ trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/pkcs11.cpp	2010-02-08 09:41:15 UTC (rev 113)
@@ -58,6 +58,9 @@
 // require significant work.
 CCriticalSection _critSect;
 
+CCriticalSection _critSectAPI;
+
+
 static const CK_FUNCTION_LIST FunctionList = {
    { CRYPTOKIVERSION_LIBRARY_MAJOR, CRYPTOKIVERSION_LIBRARY_MINOR },
 
@@ -113,70 +116,79 @@
    * @param pInitArgs
    */
    CK_DEFINE_FUNCTION( CK_RV, C_Initialize )( CK_VOID_PTR pInitArgs )
-   {
-      Log::begin( "C_Initialize" );
-      Log::in( "C_Initialize" );
-      Log::log( "C_Initialize - pInitArgs <%#02x>", pInitArgs );
-      Log::log( "C_Initialize - isInitialized <%#02x>", _isInitialized );
-
+   {     
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-
-      // Already Initialized
-      if( TRUE == _isInitialized )
+      
+      try
       {
-         Log::error( "C_Initialize", "CKR_CRYPTOKI_ALREADY_INITIALIZED" );
-         rv = CKR_CRYPTOKI_ALREADY_INITIALIZED;
-      }
-      else if( NULL_PTR != pInitArgs )
-      {
-         CK_C_INITIALIZE_ARGS initArgs = *(CK_C_INITIALIZE_ARGS_PTR)pInitArgs;
+         Log::begin( "C_Initialize" );
+         Log::in( "C_Initialize" );
+         Log::log( "C_Initialize - pInitArgs <%#02x>", pInitArgs );
+         //SLog::log( S"C_Initialize - isInitialized <%#02x>", _isInitialized );
 
-         Log::logCK_C_INITIALIZE_ARGS_PTR( "C_Initialize", (CK_C_INITIALIZE_ARGS_PTR)pInitArgs );
-
-         if( NULL_PTR != initArgs.pReserved )
+         // Already Initialized
+         if( TRUE == _isInitialized )
          {
-            Log::error( "C_Initialize", "CKR_ARGUMENTS_BAD" );
-            rv = CKR_ARGUMENTS_BAD;
+            Log::error( "C_Initialize", "CKR_CRYPTOKI_ALREADY_INITIALIZED" );
+            rv = CKR_CRYPTOKI_ALREADY_INITIALIZED;
          }
-         else if( initArgs.flags & CKF_LIBRARY_CANT_CREATE_OS_THREADS )
+         else if( NULL_PTR != pInitArgs )
          {
-            Log::error( "C_Initialize", "CKR_NEED_TO_CREATE_THREADS" );
-            rv = CKR_NEED_TO_CREATE_THREADS;
-         }
-         else if( initArgs.flags & CKF_OS_LOCKING_OK )
-         {
-            if( initArgs.CreateMutex || initArgs.DestroyMutex || initArgs.LockMutex || initArgs.UnlockMutex )
+            CK_C_INITIALIZE_ARGS initArgs = *(CK_C_INITIALIZE_ARGS_PTR)pInitArgs;
+
+            Log::logCK_C_INITIALIZE_ARGS_PTR( "C_Initialize", (CK_C_INITIALIZE_ARGS_PTR)pInitArgs );
+
+            if( NULL_PTR != initArgs.pReserved )
             {
-               Log::error( "C_Initialize", "CKR_CANT_LOCK" );
-               rv = CKR_CANT_LOCK;
-            }
-         }
-         else if( initArgs.CreateMutex || initArgs.DestroyMutex || initArgs.LockMutex || initArgs.UnlockMutex )
-         {
-            if( !initArgs.CreateMutex || !initArgs.DestroyMutex || !initArgs.LockMutex || !initArgs.UnlockMutex )
-            {
                Log::error( "C_Initialize", "CKR_ARGUMENTS_BAD" );
                rv = CKR_ARGUMENTS_BAD;
             }
-            else if( !( initArgs.flags & CKF_OS_LOCKING_OK ) )
+            else if( initArgs.flags & CKF_LIBRARY_CANT_CREATE_OS_THREADS )
             {
-               Log::error( "C_Initialize", "CKR_CANT_LOCK" );
-               rv = CKR_CANT_LOCK;
+               Log::error( "C_Initialize", "CKR_NEED_TO_CREATE_THREADS" );
+               rv = CKR_NEED_TO_CREATE_THREADS;
             }
+            else if( initArgs.flags & CKF_OS_LOCKING_OK )
+            {
+               if( initArgs.CreateMutex || initArgs.DestroyMutex || initArgs.LockMutex || initArgs.UnlockMutex )
+               {
+                  Log::error( "C_Initialize", "CKR_CANT_LOCK" );
+                  rv = CKR_CANT_LOCK;
+               }
+            }
+            else if( initArgs.CreateMutex || initArgs.DestroyMutex || initArgs.LockMutex || initArgs.UnlockMutex )
+            {
+               if( !initArgs.CreateMutex || !initArgs.DestroyMutex || !initArgs.LockMutex || !initArgs.UnlockMutex )
+               {
+                  Log::error( "C_Initialize", "CKR_ARGUMENTS_BAD" );
+                  rv = CKR_ARGUMENTS_BAD;
+               }
+               else if( !( initArgs.flags & CKF_OS_LOCKING_OK ) )
+               {
+                  Log::error( "C_Initialize", "CKR_CANT_LOCK" );
+                  rv = CKR_CANT_LOCK;
+               }
+            }
          }
+
+         if (rv == CKR_OK)
+         {
+            Application::InitApplication( );
+            _isInitialized = TRUE;
+         }
+
+         Log::log( "C_Initialize - isInitialized <%#02x>", _isInitialized );
+
+         Log::logCK_RV( "C_Initialize", rv );
+         Log::end( "C_Initialize\n" );
       }
-
-      if (rv == CKR_OK)
+      catch( ... )
       {
-         Application::InitApplication( );
-         _isInitialized = TRUE;
+         rv = CKR_GENERAL_ERROR;
       }
 
-      Log::log( "C_Initialize - isInitialized <%#02x>", _isInitialized );
-
-      Log::logCK_RV( "C_Initialize", rv );
-      Log::end( "C_Initialize" );
-
       return rv;
    }
 
@@ -189,32 +201,41 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_Finalize )( CK_VOID_PTR pReserved )
    {
-      Log::begin( "C_Finalize" );
-      Log::in( "C_Finalize" );
-      Log::log( "C_Finalize - pReserved <%#02x>", pReserved );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
+      
+      try
+      {
+         Log::begin( "C_Finalize" );
+         Log::in( "C_Finalize" );
+         Log::log( "C_Finalize - pReserved <%#02x>", pReserved );
 
-      // Not Initialized
-      if( !_isInitialized )
-      {
-         Log::error( "C_Finalize", "CKR_CRYPTOKI_NOT_INITIALIZED" );
-         rv = CKR_CRYPTOKI_NOT_INITIALIZED;
+         // Not Initialized
+         if( !_isInitialized )
+         {
+            Log::error( "C_Finalize", "CKR_CRYPTOKI_NOT_INITIALIZED" );
+            rv = CKR_CRYPTOKI_NOT_INITIALIZED;
+         }
+         else if( NULL_PTR != pReserved )
+         {
+            Log::error( "C_Finalize", "CKR_ARGUMENTS_BAD" );
+            rv = CKR_ARGUMENTS_BAD;
+         }
+         else
+         {
+            _isInitialized = FALSE;
+            Application::End( );
+         }
+
+         Log::logCK_RV( "C_Finalize", rv );
+         Log::end( "C_Finalize\n" );
       }
-      else if( NULL_PTR != pReserved )
+      catch( ... )
       {
-         Log::error( "C_Finalize", "CKR_ARGUMENTS_BAD" );
-         rv = CKR_ARGUMENTS_BAD;
+         rv = CKR_GENERAL_ERROR;
       }
-      else
-      {
-         _isInitialized = FALSE;
-         Application::End( );
-      }
 
-      Log::logCK_RV( "C_Finalize", rv );
-      Log::end( "C_Finalize" );
-
       return rv;
    }
 
@@ -226,37 +247,47 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_GetInfo )( CK_INFO_PTR pInfo )
    {
-      Log::begin( "C_GetInfo" );
-      Log::in( "C_GetInfo" );
-      Log::logCK_INFO( "C_GetInfo", pInfo );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      if( FALSE == _isInitialized )
+      
+      try
       {
-         rv = CKR_CRYPTOKI_NOT_INITIALIZED;
+         Log::begin( "C_GetInfo" );
+         Log::in( "C_GetInfo" );
+         Log::logCK_INFO( "C_GetInfo", pInfo );
+
+         if( FALSE == _isInitialized )
+         {
+            rv = CKR_CRYPTOKI_NOT_INITIALIZED;
+         }
+         else if( NULL_PTR == pInfo )
+         {
+            rv = CKR_ARGUMENTS_BAD;
+         }
+         else
+         {
+            pInfo->cryptokiVersion.major = CRYPTOKIVERSION_INTERFACE_MAJOR;
+            pInfo->cryptokiVersion.minor = CRYPTOKIVERSION_INTERFACE_MINOR;
+            pInfo->flags = 0;
+            memset(pInfo->libraryDescription, ' ', sizeof(pInfo->libraryDescription));
+            memcpy(pInfo->libraryDescription, LIBRARY_DESCRIPTION, strlen(LIBRARY_DESCRIPTION));
+            memset(pInfo->manufacturerID, ' ', sizeof(pInfo->manufacturerID));
+            memcpy(pInfo->manufacturerID, MANUFACTURER_ID, strlen(MANUFACTURER_ID));
+            pInfo->libraryVersion.major  = CRYPTOKIVERSION_LIBRARY_MAJOR;
+            pInfo->libraryVersion.minor  = CRYPTOKIVERSION_LIBRARY_MINOR;
+         }
+
+         Log::logCK_RV( "C_GetInfo", rv );
+         Log::out( "C_GetInfo" );
+         Log::logCK_INFO( "C_GetInfo", pInfo );
+         Log::end( "C_GetInfo\n" );
       }
-      else if( NULL_PTR == pInfo )
+      catch( ... )
       {
-         rv = CKR_ARGUMENTS_BAD;
+         rv = CKR_GENERAL_ERROR;
       }
-      else
-      {
-         pInfo->cryptokiVersion.major = CRYPTOKIVERSION_INTERFACE_MAJOR;
-         pInfo->cryptokiVersion.minor = CRYPTOKIVERSION_INTERFACE_MINOR;
-         pInfo->flags = 0;
-         memset(pInfo->libraryDescription, ' ', sizeof(pInfo->libraryDescription));
-         memcpy(pInfo->libraryDescription, LIBRARY_DESCRIPTION, strlen(LIBRARY_DESCRIPTION));
-         memset(pInfo->manufacturerID, ' ', sizeof(pInfo->manufacturerID));
-         memcpy(pInfo->manufacturerID, MANUFACTURER_ID, strlen(MANUFACTURER_ID));
-         pInfo->libraryVersion.major  = CRYPTOKIVERSION_LIBRARY_MAJOR;
-         pInfo->libraryVersion.minor  = CRYPTOKIVERSION_LIBRARY_MINOR;
-      }
 
-      Log::logCK_RV( "C_GetInfo", rv );
-      Log::out( "C_GetInfo" );
-      Log::logCK_INFO( "C_GetInfo", pInfo );
-      Log::end( "C_GetInfo" );
-
       return rv;
    }
 
@@ -267,26 +298,36 @@
    */
    CK_DEFINE_FUNCTION( CK_RV,C_GetFunctionList )( CK_FUNCTION_LIST_PTR_PTR ppFunctionList )
    {
-      Log::begin( "C_GetFunctionList" );
-      Log::in( "C_GetFunctionList" );
-      Log::log( "C_GetFunctionList - CK_FUNCTION_LIST_PTR_PTR <%#02x>", ppFunctionList );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      if( NULL_PTR == ppFunctionList )
+      
+      try
       {
-         rv = CKR_ARGUMENTS_BAD;
+         Log::begin( "C_GetFunctionList" );
+         Log::in( "C_GetFunctionList" );
+         Log::log( "C_GetFunctionList - CK_FUNCTION_LIST_PTR_PTR <%#02x>", ppFunctionList );
+
+         if( NULL_PTR == ppFunctionList )
+         {
+            rv = CKR_ARGUMENTS_BAD;
+         }
+         else
+         {
+            // this is the only function which an application can call before calling C_Initialize
+            *ppFunctionList = (CK_FUNCTION_LIST_PTR)&FunctionList;
+         }
+
+         Log::logCK_RV( "C_GetFunctionList", rv );
+         Log::out( "C_GetFunctionList" );
+         Log::log( "C_GetFunctionList - CK_FUNCTION_LIST_PTR_PTR <%#02x>", ppFunctionList );
+         Log::end( "C_GetFunctionList\n" );
       }
-      else
+      catch( ... )
       {
-         // this is the only function which an application can call before calling C_Initialize
-         *ppFunctionList = (CK_FUNCTION_LIST_PTR)&FunctionList;
+         rv = CKR_GENERAL_ERROR;
       }
 
-      Log::logCK_RV( "C_GetFunctionList", rv );
-      Log::out( "C_GetFunctionList" );
-      Log::log( "C_GetFunctionList - CK_FUNCTION_LIST_PTR_PTR <%#02x>", ppFunctionList );
-      Log::end( "C_GetFunctionList" );
-
       return rv;
    }
 
@@ -300,23 +341,35 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_GetSlotList )( CK_BBOOL tokenPresent, CK_SLOT_ID_PTR pSlotList, CK_ULONG_PTR pulCount )
    {
-      Log::begin( "C_GetSlotList" );
-      Log::in( "C_GetSlotList" );
-      Log::log( "C_GetSlotList - tokenPresent <%d>", tokenPresent );
-      Log::logCK_SLOT_ID_PTR( "C_GetSlotList", pSlotList, pulCount );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Application::Enumerate( tokenPresent, pSlotList, pulCount );
+         Log::begin( "C_GetSlotList" );
+         Log::in( "C_GetSlotList" );
+         Log::log( "C_GetSlotList - tokenPresent <%d>", tokenPresent );
+         Log::logCK_SLOT_ID_PTR( "C_GetSlotList", pSlotList, pulCount );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv = Application::Enumerate( tokenPresent, pSlotList, pulCount );
+         }
+         PKCS11_CATCH( rv )
+         Log::stop( "C_GetSlotList" );
+
+         Log::logCK_RV( "C_GetSlotList", rv );
+         Log::out( "C_GetSlotList" );
+         Log::logCK_SLOT_ID_PTR( "C_GetSlotList", pSlotList, pulCount );
+         Log::end( "C_GetSlotList\n" );
       }
-      PKCS11_CATCH( rv )
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_GetSlotList", rv );
-      Log::out( "C_GetSlotList" );
-      Log::logCK_SLOT_ID_PTR( "C_GetSlotList", pSlotList, pulCount );
-      Log::end( "C_GetSlotList" );
-
       return rv;
    }
 
@@ -330,38 +383,51 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_GetSlotInfo )( CK_SLOT_ID slotID, CK_SLOT_INFO_PTR pInfo )
    {
-      Log::begin( "C_GetSlotInfo" );
-      Log::in( "C_GetSlotInfo" );
-      Log::log( "C_GetSlotInfo - slotID <%ld>", slotID );
-      Log::logCK_SLOT_INFO_PTR( "C_GetSlotInfo", pInfo );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-        if(Application::_numSlots == 0)
+         Log::begin( "C_GetSlotInfo" );
+         Log::in( "C_GetSlotInfo" );
+         Log::log( "C_GetSlotInfo - slotID <%ld>", slotID );
+         Log::logCK_SLOT_INFO_PTR( "C_GetSlotInfo", pInfo );
+
+         Log::start( );
+         PKCS11_TRY
          {
-            CK_ULONG slotCount = 0;
-            Application::Enumerate(CK_FALSE,NULL_PTR,&slotCount);
-            CK_SLOT_ID_PTR slots = (CK_SLOT_ID_PTR)malloc(sizeof(CK_SLOT_ID)*slotCount);
-            Application::Enumerate(CK_FALSE,slots,&slotCount);
-            free(slots);
-         }
+           //if(Application::_numSlots == 0)
+           // {
+           //    //CK_ULONG slotCount = 0;
+           //    //Application::Enumerate(CK_FALSE,NULL_PTR,&slotCount);
+           //    CK_ULONG slotCount = 32;
+           //    CK_SLOT_ID_PTR slots = (CK_SLOT_ID_PTR) malloc( sizeof( CK_SLOT_ID ) * slotCount );
+           //    Application::Enumerate( CK_FALSE, slots, &slotCount );
+           //    free(slots);
+           // }
 
-         Slot* pSlot = NULL_PTR;
-         rv = Application::GetSlotFromSlotId( slotID, &pSlot );
+            Slot* pSlot = NULL_PTR;
+            rv = Application::GetSlotFromSlotId( slotID, &pSlot );
 
-         if(rv == CKR_OK)
-         {
-            rv = pSlot->GetInfo( pInfo );
+            if(rv == CKR_OK)
+            {
+               rv = pSlot->GetInfo( pInfo );
+            }
          }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_GetSlotInfo" );
+
+         Log::logCK_RV( "C_GetSlotInfo", rv );
+         Log::out( "C_GetSlotInfo" );
+         Log::logCK_SLOT_INFO_PTR( "C_GetSlotInfo", pInfo );
+         Log::end( "C_GetSlotInfo\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_GetSlotInfo", rv );
-      Log::out( "C_GetSlotInfo" );
-      Log::logCK_SLOT_INFO_PTR( "C_GetSlotInfo", pInfo );
-      Log::end( "C_GetSlotInfo" );
-
       return rv;
    }
 
@@ -375,59 +441,71 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_GetTokenInfo )( CK_SLOT_ID slotID, CK_TOKEN_INFO_PTR pInfo )
    {
-      Log::begin( "C_GetTokenInfo" );
-      Log::in( "C_GetTokenInfo" );
-      Log::log( "C_GetTokenInfo - slotID <%ld>", slotID );
-      Log::logCK_TOKEN_INFO_PTR( "C_GetTokenInfo", pInfo );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
+      
+      try
+      {
+         Log::begin( "C_GetTokenInfo" );
+         Log::in( "C_GetTokenInfo" );
+         Log::log( "C_GetTokenInfo - slotID <%ld>", slotID );
+         Log::logCK_TOKEN_INFO_PTR( "C_GetTokenInfo", pInfo );
 
-      PKCS11_TRY
-      {
-         if(Application::_numSlots == 0)
+         Log::start( );
+         PKCS11_TRY
          {
-            CK_ULONG slotCount = 0;
-            Application::Enumerate(CK_FALSE,NULL_PTR,&slotCount);
-            CK_SLOT_ID_PTR slots = (CK_SLOT_ID_PTR)malloc(sizeof(CK_SLOT_ID)*slotCount);
-            Application::Enumerate(CK_FALSE,slots,&slotCount);
-            free(slots);
-         }
+            //if(Application::_numSlots == 0)
+            //{
+            //   //CK_ULONG slotCount = 0;
+            //   //Application::Enumerate(CK_FALSE,NULL_PTR,&slotCount);
+            //   CK_ULONG slotCount = 32;
+            //   CK_SLOT_ID_PTR slots = (CK_SLOT_ID_PTR) malloc( sizeof( CK_SLOT_ID ) * slotCount );
+            //   Application::Enumerate( CK_FALSE, slots, &slotCount );
+            //   free(slots);
+            //}
 
-         Slot* slot = NULL_PTR;
-         rv = Application::GetSlotFromSlotId(slotID,&slot);
+            Slot* slot = NULL_PTR;
+            rv = Application::GetSlotFromSlotId(slotID,&slot);
 
-         if(rv == CKR_OK)
+            if(rv == CKR_OK)
+            {
+               rv = slot->GetTokenInfo(pInfo);
+            }
+         }
+         //PKCS11_CATCH(rv)
+         catch( CkError & e )
          {
-            rv = slot->GetTokenInfo(pInfo);
+            rv = e.Error( );
+            //Log::log( "C_GetTokenInfo - ## Error ## CkError <%s> <%#02x>", e.what( ), e.Error( ) );
          }
+         catch( PcscError & /*e*/ )
+         {
+            rv = CKR_FUNCTION_FAILED;
+            //Log::log( "C_GetTokenInfo - ## Error ## PcscError <%s> <%#02x> <%#02x>", e.what( ), e.Error( ), rv );
+         }
+         catch( Marshaller::Exception & e )
+         {
+            rv = CkError::CheckMarshallerException( e );
+            //Log::log( "C_GetTokenInfo - ## Error ## PcscError <%s> <%#02x>", e.what( ), rv );
+         }
+         catch( ... )
+         {
+            rv = CKR_GENERAL_ERROR;
+            //Log::log( "C_GetTokenInfo - ## Error ## (...) <%#02x>", rv );
+         }
+         Log::stop( "C_GetTokenInfo" );
+
+         Log::logCK_RV( "C_GetTokenInfo", rv );
+         Log::out( "C_GetTokenInfo" );
+         Log::logCK_TOKEN_INFO_PTR( "C_GetTokenInfo", pInfo );
+         Log::end( "C_GetTokenInfo\n" );
       }
-      //PKCS11_CATCH(rv)
-      catch( CkError & e )
-      {
-         rv = e.Error( );
-         Log::log( "C_GetTokenInfo - ## Error ## CkError <%s> <%#02x>", e.what( ), e.Error( ) );
-      }
-      catch( PcscError & e )
-      {
-         rv = CKR_FUNCTION_FAILED;
-         Log::log( "C_GetTokenInfo - ## Error ## PcscError <%s> <%#02x> <%#02x>", e.what( ), e.Error( ), rv );
-      }
-      catch( Marshaller::Exception & e )
-      {
-         rv = CkError::CheckMarshallerException( e );
-         Log::log( "C_GetTokenInfo - ## Error ## PcscError <%s> <%#02x>", e.what( ), rv );
-      }
       catch( ... )
       {
          rv = CKR_GENERAL_ERROR;
-         Log::log( "C_GetTokenInfo - ## Error ## (...) <%#02x>", rv );
       }
 
-      Log::logCK_RV( "C_GetTokenInfo", rv );
-      Log::out( "C_GetTokenInfo" );
-      Log::logCK_TOKEN_INFO_PTR( "C_GetTokenInfo", pInfo );
-      Log::end( "C_GetTokenInfo" );
-
       return rv;
    }
 
@@ -442,38 +520,51 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_GetMechanismList )( CK_SLOT_ID slotID, CK_MECHANISM_TYPE_PTR pMechanismList, CK_ULONG_PTR pulCount )
    {
-      Log::begin( "C_GetMechanismList" );
-      Log::in( "C_GetMechanismList" );
-      Log::log( "C_GetMechanismList - slotID <%#02x>", slotID );
-      Log::logCK_MECHANISM_TYPE( "C_GetMechanismList", pMechanismList, pulCount );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
+      
+      try
+      {
+         Log::begin( "C_GetMechanismList" );
+         Log::in( "C_GetMechanismList" );
+         Log::log( "C_GetMechanismList - slotID <%#02x>", slotID );
+         Log::logCK_MECHANISM_TYPE( "C_GetMechanismList", pMechanismList, pulCount );
 
-      PKCS11_TRY
-      {
-         if(Application::_numSlots == 0)
+         Log::start( );
+         PKCS11_TRY
          {
-            CK_ULONG slotCount = 0;
-            Application::Enumerate(CK_FALSE,NULL_PTR,&slotCount);
-            CK_SLOT_ID_PTR slots = (CK_SLOT_ID_PTR)malloc(sizeof(CK_SLOT_ID)*slotCount);
-            Application::Enumerate(CK_FALSE,slots,&slotCount);
-            free(slots);
-         }
+            //if(Application::_numSlots == 0)
+            //{
+            //   //CK_ULONG slotCount = 0;
+            //   //Application::Enumerate(CK_FALSE,NULL_PTR,&slotCount);
+            //   CK_ULONG slotCount = 32;
+            //   CK_SLOT_ID_PTR slots = (CK_SLOT_ID_PTR) malloc( sizeof( CK_SLOT_ID ) * slotCount );
+            //   Application::Enumerate( CK_FALSE, slots, &slotCount );
+            //   free(slots);
+            //}
 
-         Slot* slot = NULL_PTR;
-         rv    = Application::GetSlotFromSlotId(slotID,&slot);
+            Slot* slot = NULL_PTR;
+            rv    = Application::GetSlotFromSlotId(slotID,&slot);
 
-         if(rv == CKR_OK)
-         {
-            rv = slot->GetMechanismList(pMechanismList,pulCount);
+            if(rv == CKR_OK)
+            {
+               rv = slot->GetMechanismList(pMechanismList,pulCount);
+            }
          }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_GetMechanismList" );
+
+         Log::logCK_RV( "C_GetMechanismList", rv );
+         Log::out( "C_GetMechanismList" );
+         Log::logCK_MECHANISM_TYPE( "C_GetMechanismList", pMechanismList, pulCount );
+         Log::end( "C_GetMechanismList\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_GetMechanismList", rv );
-      Log::out( "C_GetMechanismList" );
-      Log::logCK_MECHANISM_TYPE( "C_GetMechanismList", pMechanismList, pulCount );
-      Log::end( "C_GetMechanismList" );
       return rv;
    }
 
@@ -488,39 +579,52 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_GetMechanismInfo )( CK_SLOT_ID slotID, CK_MECHANISM_TYPE type, CK_MECHANISM_INFO_PTR pInfo )
    {
-      Log::begin( "C_GetMechanismInfo" );
-      Log::in( "C_GetMechanismInfo" );
-      Log::log( "C_GetMechanismInfo - slotID <%#02x>", slotID );
-      Log::logCK_MECHANISM_TYPE( "C_GetMechanismInfo", type );
-      Log::logCK_MECHANISM_INFO_PTR( "C_GetMechanismInfo", pInfo );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
+      
+      try
+      {
+         Log::begin( "C_GetMechanismInfo" );
+         Log::in( "C_GetMechanismInfo" );
+         Log::log( "C_GetMechanismInfo - slotID <%#02x>", slotID );
+         Log::logCK_MECHANISM_TYPE( "C_GetMechanismInfo", type );
+         Log::logCK_MECHANISM_INFO_PTR( "C_GetMechanismInfo", pInfo );
 
-      PKCS11_TRY
-      {
-         if(Application::_numSlots == 0)
+         Log::start( );
+         PKCS11_TRY
          {
-            CK_ULONG slotCount = 0;
-            Application::Enumerate(CK_FALSE,NULL_PTR,&slotCount);
-            CK_SLOT_ID_PTR slots = (CK_SLOT_ID_PTR)malloc(sizeof(CK_SLOT_ID)*slotCount);
-            Application::Enumerate(CK_FALSE,slots,&slotCount);
-            free(slots);
-         }
+            //if(Application::_numSlots == 0)
+            //{
+            //   //CK_ULONG slotCount = 0;
+            //   //Application::Enumerate(CK_FALSE,NULL_PTR,&slotCount);
+            //   CK_ULONG slotCount = 32;
+            //   CK_SLOT_ID_PTR slots = (CK_SLOT_ID_PTR) malloc( sizeof( CK_SLOT_ID ) * slotCount );
+            //   Application::Enumerate( CK_FALSE, slots, &slotCount );
+            //   free(slots);
+            //}
 
-         Slot* slot = NULL_PTR;
-         rv    = Application::GetSlotFromSlotId(slotID,&slot);
+            Slot* slot = NULL_PTR;
+            rv    = Application::GetSlotFromSlotId(slotID,&slot);
 
-         if(rv == CKR_OK)
-         {
-            rv = slot->GetMechanismInfo(type,pInfo);
+            if(rv == CKR_OK)
+            {
+               rv = slot->GetMechanismInfo(type,pInfo);
+            }
          }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_GetMechanismInfo" );
+
+         Log::logCK_RV( "C_GetMechanismInfo", rv );
+         Log::out( "C_GetMechanismInfo" );
+         Log::logCK_MECHANISM_INFO_PTR( "C_GetMechanismInfo", pInfo );
+         Log::end( "C_GetMechanismInfo\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_GetMechanismInfo", rv );
-      Log::out( "C_GetMechanismInfo" );
-      Log::logCK_MECHANISM_INFO_PTR( "C_GetMechanismInfo", pInfo );
-      Log::end( "C_GetMechanismInfo" );
       return rv;
    }
 
@@ -535,36 +639,50 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_InitToken )( CK_SLOT_ID slotID, CK_UTF8CHAR_PTR pPin, CK_ULONG ulPinLen, CK_UTF8CHAR_PTR pLabel )
    {
-      Log::begin( "C_InitToken" );
-      Log::in( "C_InitToken" );
-      Log::log( "C_InitToken - slotID <%#02x>", slotID );
-      Log::logCK_UTF8CHAR_PTR( "C_InitToken - pPin", pPin, ulPinLen );
-      Log::logCK_UTF8CHAR_PTR( "C_InitToken - pLabel", pLabel, 32 );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         if(Application::_numSlots == 0)
+         Log::begin( "C_InitToken" );
+         Log::in( "C_InitToken" );
+         Log::log( "C_InitToken - slotID <%#02x>", slotID );
+         Log::logCK_UTF8CHAR_PTR( "C_InitToken - pPin", pPin, ulPinLen );
+         Log::logCK_UTF8CHAR_PTR( "C_InitToken - pLabel", pLabel, 32 );
+
+         Log::start( );
+         PKCS11_TRY
          {
-            CK_ULONG slotCount = 0;
-            Application::Enumerate(CK_FALSE,NULL_PTR,&slotCount);
-            CK_SLOT_ID_PTR slots = (CK_SLOT_ID_PTR)malloc(sizeof(CK_SLOT_ID)*slotCount);
-            Application::Enumerate(CK_FALSE,slots,&slotCount);
-            free(slots);
-         }
+            //if(Application::_numSlots == 0)
+            //{
+            //   //CK_ULONG slotCount = 0;
+            //   //Application::Enumerate(CK_FALSE,NULL_PTR,&slotCount);
+            //   CK_ULONG slotCount = 32;
+            //   CK_SLOT_ID_PTR slots = (CK_SLOT_ID_PTR) malloc( sizeof( CK_SLOT_ID ) * slotCount );
+            //   Application::Enumerate( CK_FALSE, slots, &slotCount );
+            //   free(slots);
+            //}
 
-         Slot* slot = NULL_PTR;
-         rv    = Application::GetSlotFromSlotId(slotID,&slot);
+            Slot* slot = NULL_PTR;
+            rv    = Application::GetSlotFromSlotId(slotID,&slot);
 
-         if(rv == CKR_OK)
-         {
-            rv = slot->InitToken(pPin,ulPinLen,pLabel);
+            if(rv == CKR_OK)
+            {
+               rv = slot->InitToken(pPin,ulPinLen,pLabel);
+            }
          }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_InitToken" );
+
+         Log::logCK_RV( "C_InitToken", rv );
+         Log::end( "C_InitToken\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_InitToken", rv );
-      Log::end( "C_InitToken" );
       return rv;
    }
 
@@ -578,20 +696,32 @@
    */
    CK_DEFINE_FUNCTION( CK_RV,C_InitPIN )( CK_SESSION_HANDLE hSession, CK_UTF8CHAR_PTR pPin, CK_ULONG ulPinLen )
    {
-      Log::begin( "C_InitPIN" );
-      Log::in( "C_InitPIN" );
-      Log::log( "C_InitPIN - hSession <%#02x>", hSession );
-      Log::logCK_UTF8CHAR_PTR( "C_InitPIN - pPin", pPin, ulPinLen );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::InitPIN( hSession, pPin, ulPinLen );
+         Log::begin( "C_InitPIN" );
+         Log::in( "C_InitPIN" );
+         Log::log( "C_InitPIN - hSession <%#02x>", hSession );
+         Log::logCK_UTF8CHAR_PTR( "C_InitPIN - pPin", pPin, ulPinLen );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv = Slot::InitPIN( hSession, pPin, ulPinLen );
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_InitPIN" );
+
+         Log::logCK_RV( "C_InitPIN", rv );
+         Log::end( "C_InitPIN\n" );
       }
-      PKCS11_CATCH(rv)
-
-      Log::logCK_RV( "C_InitPIN", rv );
-      Log::end( "C_InitPIN" );
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
       return rv;
    }
 
@@ -607,21 +737,35 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_SetPIN )( CK_SESSION_HANDLE hSession, CK_UTF8CHAR_PTR pOldPin, CK_ULONG ulOldLen, CK_UTF8CHAR_PTR pNewPin, CK_ULONG ulNewLen )
    {
-      Log::begin( "C_SetPIN" );
-      Log::in( "C_SetPIN" );
-      Log::log( "C_SetPIN - hSession <%#02x>", hSession );
-      Log::logCK_UTF8CHAR_PTR( "C_SetPIN - pOldPin", pOldPin, ulOldLen );
-      Log::logCK_UTF8CHAR_PTR( "C_SetPIN - pNewPin", pNewPin, ulNewLen );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::SetPIN( hSession, pOldPin, ulOldLen, pNewPin, ulNewLen );
+         Log::begin( "C_SetPIN" );
+         Log::in( "C_SetPIN" );
+         Log::log( "C_SetPIN - hSession <%#02x>", hSession );
+         Log::logCK_UTF8CHAR_PTR( "C_SetPIN - pOldPin", pOldPin, ulOldLen );
+         Log::logCK_UTF8CHAR_PTR( "C_SetPIN - pNewPin", pNewPin, ulNewLen );
+
+         Log::start( );
+         CK_RV rv = CKR_OK;
+         PKCS11_TRY
+         {
+            rv = Slot::SetPIN( hSession, pOldPin, ulOldLen, pNewPin, ulNewLen );
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_SetPIN" );
+
+         Log::logCK_RV( "C_SetPIN", rv );
+         Log::end( "C_SetPIN\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_SetPIN", rv );
-      Log::end( "C_SetPIN" );
       return rv;
    }
 
@@ -638,41 +782,55 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_OpenSession )( CK_SLOT_ID slotID, CK_FLAGS flags, CK_VOID_PTR pApplication, CK_NOTIFY Notify, CK_SESSION_HANDLE_PTR phSession )
    {
-      Log::begin( "C_OpenSession" );
-      Log::in( "C_OpenSession" );
-      Log::log( "C_OpenSession - slotID <%#02x>", slotID );
-      Log::logSessionFlags( "C_OpenSession", flags );
-      Log::log( "C_OpenSession - pApplication <%#02x>", pApplication );
-      Log::log( "C_OpenSession - Notify <%#02x>", Notify );
-      Log::log( "C_OpenSession - phSession <%#02x> (%#02x)", phSession, ( ( NULL_PTR != phSession ) ? *phSession : 0 ) );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         if(Application::_numSlots == 0)
+         Log::begin( "C_OpenSession" );
+         Log::in( "C_OpenSession" );
+         Log::log( "C_OpenSession - slotID <%#02x>", slotID );
+         Log::logSessionFlags( "C_OpenSession", flags );
+         Log::log( "C_OpenSession - pApplication <%#02x>", pApplication );
+         Log::log( "C_OpenSession - Notify <%#02x>", Notify );
+         Log::log( "C_OpenSession - phSession <%#02x> (%#02x)", phSession, ( ( NULL_PTR != phSession ) ? *phSession : 0 ) );
+
+         Log::start( );
+         PKCS11_TRY
          {
-            CK_ULONG slotCount = 0;
-            Application::Enumerate(CK_FALSE,NULL_PTR,&slotCount);
-            CK_SLOT_ID_PTR slots = (CK_SLOT_ID_PTR)malloc(sizeof(CK_SLOT_ID)*slotCount);
-            Application::Enumerate(CK_FALSE,slots,&slotCount);
-            free(slots);
-         }
+            //if(Application::_numSlots == 0)
+            //{
+            //   //CK_ULONG slotCount = 0;
+            //   //Application::Enumerate(CK_FALSE,NULL_PTR,&slotCount);
+            //   CK_ULONG slotCount = 32;
+            //   CK_SLOT_ID_PTR slots = (CK_SLOT_ID_PTR) malloc( sizeof( CK_SLOT_ID ) * slotCount );
+            //   Application::Enumerate( CK_FALSE, slots, &slotCount );
+            //   free(slots);
+            //}
 
-         Slot* slot = NULL_PTR;
-         rv = Application::GetSlotFromSlotId(slotID,&slot);
+            Slot* slot = NULL_PTR;
+            rv = Application::GetSlotFromSlotId(slotID,&slot);
 
-         if(rv == CKR_OK)
-         {
-            PKCS11_ASSERT(slot != NULL_PTR);
-            rv = slot->OpenSession(flags,pApplication,Notify,phSession);
+            if(rv == CKR_OK)
+            {
+               PKCS11_ASSERT(slot != NULL_PTR);
+               rv = slot->OpenSession(flags,pApplication,Notify,phSession);
+            }
          }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_OpenSession" );
+
+         Log::logCK_RV( "C_OpenSession", rv );
+         Log::out( "C_OpenSession" );
+         Log::log( "C_OpenSession - phSession <%#02x> (%ld)", phSession, ( ( NULL_PTR != phSession ) ? *phSession : 0 ) );
+         Log::end( "C_OpenSession\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_OpenSession", rv );
-      Log::out( "C_OpenSession" );
-      Log::log( "C_OpenSession - phSession <%#02x> (%ld)", phSession, ( ( NULL_PTR != phSession ) ? *phSession : 0 ) );
-      Log::end( "C_OpenSession" );
       return rv;
    }
 
@@ -685,19 +843,32 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_CloseSession )( CK_SESSION_HANDLE hSession )
    {
-      Log::begin( "C_CloseSession" );
-      Log::in( "C_CloseSession" );
-      Log::log( "C_CloseSession - hSession <%#02x>", hSession );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::CloseSession(hSession);
+         Log::begin( "C_CloseSession" );
+         Log::in( "C_CloseSession" );
+         Log::log( "C_CloseSession - hSession <%#02x>", hSession );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv = Slot::CloseSession(hSession);
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_CloseSession" );
+
+         Log::logCK_RV( "C_CloseSession", rv );
+         Log::end( "C_CloseSession\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_CloseSession", rv );
-      Log::end( "C_CloseSession" );
       return rv;
    }
 
@@ -709,34 +880,48 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_CloseAllSessions )( CK_SLOT_ID slotID )
    {
-      Log::begin( "C_CloseAllSessions" );
-      Log::in( "C_CloseAllSessions" );
-      Log::log( "C_CloseAllSessions - slotID <%#02x>", slotID );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         if(Application::_numSlots == 0)
+         Log::begin( "C_CloseAllSessions" );
+         Log::in( "C_CloseAllSessions" );
+         Log::log( "C_CloseAllSessions - slotID <%#02x>", slotID );
+
+         Log::start( );
+         PKCS11_TRY
          {
-            CK_ULONG slotCount = 0;
-            Application::Enumerate(CK_FALSE,NULL_PTR,&slotCount);
-            CK_SLOT_ID_PTR slots = (CK_SLOT_ID_PTR)malloc(sizeof(CK_SLOT_ID)*slotCount);
-            Application::Enumerate(CK_FALSE,slots,&slotCount);
-            free(slots);
-         }
+            //if(Application::_numSlots == 0)
+            //{
+            //   //CK_ULONG slotCount = 0;
+            //   //Application::Enumerate(CK_FALSE,NULL_PTR,&slotCount);
+            //   CK_ULONG slotCount = 32;
+            //   CK_SLOT_ID_PTR slots = (CK_SLOT_ID_PTR) malloc( sizeof( CK_SLOT_ID ) * slotCount );
+            //   Application::Enumerate( CK_FALSE, slots, &slotCount );
+            //   free(slots);
+            //}
 
-         Slot* slot = NULL_PTR;
-         rv    = Application::GetSlotFromSlotId(slotID,&slot);
+            Slot* slot = NULL_PTR;
+            rv    = Application::GetSlotFromSlotId(slotID,&slot);
 
-         if(rv == CKR_OK)
-         {
-            rv = slot->CloseAllSessions();
+            if(rv == CKR_OK)
+            {
+               rv = slot->CloseAllSessions();
+            }
          }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_CloseAllSessions" );
+
+         Log::logCK_RV( "C_CloseAllSessions", rv );
+         Log::end( "C_CloseAllSessions\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_CloseAllSessions", rv );
-      Log::end( "C_CloseAllSessions" );
       return rv;
    }
 
@@ -749,22 +934,35 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_GetSessionInfo )( CK_SESSION_HANDLE hSession, CK_SESSION_INFO_PTR pInfo )
    {
-      Log::begin( "C_GetSessionInfo" );
-      Log::in( "C_GetSessionInfo" );
-      Log::log( "C_GetSessionInfo - hSession <%#02x>", hSession );
-      Log::logCK_SESSION_INFO_PTR( "C_GetSessionInfo", pInfo );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::GetSessionInfo(hSession,pInfo);
+         Log::begin( "C_GetSessionInfo" );
+         Log::in( "C_GetSessionInfo" );
+         Log::log( "C_GetSessionInfo - hSession <%#02x>", hSession );
+         Log::logCK_SESSION_INFO_PTR( "C_GetSessionInfo", pInfo );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv = Slot::GetSessionInfo(hSession,pInfo);
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_GetSessionInfo" );
+
+         Log::logCK_RV( "C_GetSessionInfo", rv );
+         Log::out( "C_GetSessionInfo" );
+         Log::logCK_SESSION_INFO_PTR( "C_GetSessionInfo", pInfo );
+         Log::end( "C_GetSessionInfo\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_GetSessionInfo", rv );
-      Log::out( "C_GetSessionInfo" );
-      Log::logCK_SESSION_INFO_PTR( "C_GetSessionInfo", pInfo );
-      Log::end( "C_GetSessionInfo" );
       return rv;
    }
 
@@ -787,7 +985,7 @@
          rv = CKR_FUNCTION_NOT_SUPPORTED;
       }
       Log::logCK_RV( "C_GetOperationState", rv );
-      Log::end( "C_GetOperationState" );
+      Log::end( "C_GetOperationState\n" );
       return rv;
    }
 
@@ -812,7 +1010,7 @@
          rv = CKR_FUNCTION_NOT_SUPPORTED;
       }
       Log::logCK_RV( "C_SetOperationState", rv );
-      Log::end( "C_SetOperationState" );
+      Log::end( "C_SetOperationState\n" );
       return rv;
    }
 
@@ -826,22 +1024,35 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_Login )( CK_SESSION_HANDLE hSession, CK_USER_TYPE userType, CK_UTF8CHAR_PTR pPin, CK_ULONG ulPinLen )
    {
-      Log::begin( "C_Login" );
-      Log::in( "C_Login" );
-      Log::log( "C_Login - hSession <%#02x>", hSession );
-      Log::logCK_USER_TYPE( "C_Login", userType );
-      Log::logCK_UTF8CHAR_PTR( "C_Login - pPin", pPin, ulPinLen );
-      Log::log( "C_Login - ulPinLen <%ld>", ulPinLen );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::Login(hSession,userType,pPin,ulPinLen);
+         Log::begin( "C_Login" );
+         Log::in( "C_Login" );
+         Log::log( "C_Login - hSession <%#02x>", hSession );
+         Log::logCK_USER_TYPE( "C_Login", userType );
+         Log::logCK_UTF8CHAR_PTR( "C_Login - pPin", pPin, ulPinLen );
+         Log::log( "C_Login - ulPinLen <%ld>", ulPinLen );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv = Slot::Login(hSession,userType,pPin,ulPinLen);
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_Login" );
+
+         Log::logCK_RV( "C_Login", rv );
+         Log::end( "C_Login\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_Login", rv );
-      Log::end( "C_Login" );
       return rv;
    }
 
@@ -853,19 +1064,32 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_Logout )( CK_SESSION_HANDLE hSession )
    {
-      Log::begin( "C_Logout" );
-      Log::in( "C_Logout" );
-      Log::log( "C_Logout - hSession <%#02x>", hSession );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::Logout(hSession);
+         Log::begin( "C_Logout" );
+         Log::in( "C_Logout" );
+         Log::log( "C_Logout - hSession <%#02x>", hSession );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv = Slot::Logout(hSession);
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_Logout" );
+
+         Log::logCK_RV( "C_Logout", rv );
+         Log::end( "C_Logout\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_Logout", rv );
-      Log::end( "C_Logout" );
       return rv;
    }
 
@@ -880,23 +1104,36 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_CreateObject )( CK_SESSION_HANDLE hSession, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, CK_OBJECT_HANDLE_PTR phObject )
    {
-      Log::begin( "C_CreateObject" );
-      Log::in( "C_CreateObject" );
-      Log::log( "C_CreateObject - hSession <%#02x>", hSession );
-      Log::logCK_ATTRIBUTE_PTR( "C_CreateObject", pTemplate, ulCount );
-      Log::log( "C_CreateObject - phObject <%#02x>", phObject );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::CreateObject( hSession, pTemplate, ulCount, phObject );
+         Log::begin( "C_CreateObject" );
+         Log::in( "C_CreateObject" );
+         Log::log( "C_CreateObject - hSession <%#02x>", hSession );
+         Log::logCK_ATTRIBUTE_PTR( "C_CreateObject", pTemplate, ulCount );
+         Log::log( "C_CreateObject - phObject <%#02x>", phObject );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv = Slot::CreateObject( hSession, pTemplate, ulCount, phObject );
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_CreateObject" );
+
+         Log::logCK_RV( "C_CreateObject", rv );
+         Log::out( "C_CreateObject" );
+         Log::log( "C_CreateObject - phObject <%#02x> (%#02x)", phObject, ( ( NULL_PTR != phObject ) ? *phObject : 0 ) );
+         Log::end( "C_CreateObject\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_CreateObject", rv );
-      Log::out( "C_CreateObject" );
-      Log::log( "C_CreateObject - phObject <%#02x> (%ld)", phObject, ( ( NULL_PTR != phObject ) ? *phObject : 0 ) );
-      Log::end( "C_CreateObject" );
       return rv;
    }
 
@@ -914,7 +1151,7 @@
       }
 
       Log::logCK_RV( "C_CopyObject", rv );
-      Log::end( "C_CopyObject" );
+      Log::end( "C_CopyObject\n" );
       return rv;
    }
 
@@ -928,20 +1165,33 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_DestroyObject )( CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject )
    {
-      Log::begin( "C_DestroyObject" );
-      Log::in( "C_DestroyObject" );
-      Log::log( "C_DestroyObject - hSession <%#02x>", hSession );
-      Log::log( "C_DestroyObject - hObject <%#02x>", hObject );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::DestroyObject( hSession, hObject );
+         Log::begin( "C_DestroyObject" );
+         Log::in( "C_DestroyObject" );
+         Log::log( "C_DestroyObject - hSession <%#02x>", hSession );
+         Log::log( "C_DestroyObject - hObject <%#02x>", hObject );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv = Slot::DestroyObject( hSession, hObject );
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_DestroyObject" );
+
+         Log::logCK_RV( "C_DestroyObject", rv );
+         Log::end( "C_DestroyObject\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_DestroyObject", rv );
-      Log::end( "C_DestroyObject" );
       return rv;
    }
 
@@ -958,7 +1208,7 @@
       }
 
       Log::logCK_RV( "C_GetObjectSize", rv );
-      Log::end( "C_GetObjectSize" );
+      Log::end( "C_GetObjectSize\n" );
       return rv;
    }
 
@@ -974,23 +1224,36 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_GetAttributeValue )( CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount )
    {
-      Log::begin( "C_GetAttributeValue" );
-      Log::in( "C_GetAttributeValue" );
-      Log::log( "C_GetAttributeValue - hSession <%#02x>", hSession );
-      Log::logCK_ATTRIBUTE_PTR( "C_GetAttributeValue", pTemplate, ulCount );
-      Log::log( "C_GetAttributeValue - hObject <%#02x>", hObject );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::GetAttributeValue(hSession,hObject,pTemplate,ulCount);
+         Log::begin( "C_GetAttributeValue" );
+         Log::in( "C_GetAttributeValue" );
+         Log::log( "C_GetAttributeValue - hSession <%#02x>", hSession );
+         Log::logCK_ATTRIBUTE_PTR( "C_GetAttributeValue", pTemplate, ulCount );
+         Log::log( "C_GetAttributeValue - hObject <%#02x>", hObject );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv = Slot::GetAttributeValue(hSession,hObject,pTemplate,ulCount);
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_GetAttributeValue" );
+
+         Log::logCK_RV( "C_GetAttributeValue", rv );
+         Log::out( "C_GetAttributeValue" );
+         Log::logCK_ATTRIBUTE_PTR( "C_GetAttributeValue", pTemplate, ulCount );
+         Log::end( "C_GetAttributeValue\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_GetAttributeValue", rv );
-      Log::out( "C_GetAttributeValue" );
-      Log::logCK_ATTRIBUTE_PTR( "C_GetAttributeValue", pTemplate, ulCount );
-      Log::end( "C_GetAttributeValue" );
       return rv;
    }
 
@@ -1006,21 +1269,34 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_SetAttributeValue )( CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount )
    {
-      Log::begin( "C_SetAttributeValue" );
-      Log::in( "C_SetAttributeValue" );
-      Log::log( "C_SetAttributeValue - hSession <%#02x>", hSession );
-      Log::logCK_ATTRIBUTE_PTR( "C_SetAttributeValue", pTemplate, ulCount );
-      Log::log( "C_SetAttributeValue - hObject <%#02x>", hObject );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::SetAttributeValue( hSession, hObject, pTemplate, ulCount );
+         Log::begin( "C_SetAttributeValue" );
+         Log::in( "C_SetAttributeValue" );
+         Log::log( "C_SetAttributeValue - hSession <%#02x>", hSession );
+         Log::logCK_ATTRIBUTE_PTR( "C_SetAttributeValue", pTemplate, ulCount );
+         Log::log( "C_SetAttributeValue - hObject <%#02x>", hObject );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv = Slot::SetAttributeValue( hSession, hObject, pTemplate, ulCount );
+         }
+         PKCS11_CATCH( rv )
+         Log::stop( "C_SetAttributeValue" );
+
+         Log::logCK_RV( "C_SetAttributeValue", rv );
+         Log::end( "C_SetAttributeValue\n" );
       }
-      PKCS11_CATCH( rv )
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_SetAttributeValue", rv );
-      Log::end( "C_SetAttributeValue" );
       return rv;
    }
 
@@ -1035,20 +1311,32 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_FindObjectsInit )( CK_SESSION_HANDLE hSession, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount )
    {
-      Log::begin( "C_FindObjectsInit" );
-      Log::in( "C_FindObjectsInit" );
-      Log::log( "C_FindObjectsInit - hSession <%#02x>", hSession );
-      Log::logCK_ATTRIBUTE_PTR( "C_FindObjectsInit", pTemplate, ulCount );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::FindObjectsInit(hSession,pTemplate,ulCount);
+         Log::begin( "C_FindObjectsInit" );
+         Log::in( "C_FindObjectsInit" );
+         Log::log( "C_FindObjectsInit - hSession <%#02x>", hSession );
+         Log::logCK_ATTRIBUTE_PTR( "C_FindObjectsInit", pTemplate, ulCount );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv = Slot::FindObjectsInit(hSession,pTemplate,ulCount);
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_FindObjectsInit" );
+
+         Log::logCK_RV( "C_FindObjectsInit", rv );
+         Log::end( "C_FindObjectsInit\n" );
       }
-      PKCS11_CATCH(rv)
-
-      Log::logCK_RV( "C_FindObjectsInit", rv );
-      Log::end( "C_FindObjectsInit" );
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
       return rv;
    }
 
@@ -1065,25 +1353,38 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_FindObjects )(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE_PTR phObject, CK_ULONG ulMaxObjectCount, CK_ULONG_PTR pulObjectCount )
    {
-      Log::begin( "C_FindObjects" );
-      Log::in( "C_FindObjects" );
-      Log::log( "C_FindObjects - hSession <%#02x>", hSession );
-      Log::log( "C_FindObjects - phObject <%#02x> (%#02x)", phObject, ( ( NULL_PTR != phObject ) ? *phObject : 0 ) );
-      Log::log( "C_FindObjects - ulMaxObjectCount <%#02x>", ulMaxObjectCount );
-      Log::log( "C_FindObjects - pulObjectCount <%#02x> (%#02x)", pulObjectCount, ( ( NULL_PTR != pulObjectCount ) ? *pulObjectCount : 0 ) );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::FindObjects( hSession, phObject, ulMaxObjectCount, pulObjectCount );
+         Log::begin( "C_FindObjects" );
+         Log::in( "C_FindObjects" );
+         Log::log( "C_FindObjects - hSession <%#02x>", hSession );
+         Log::log( "C_FindObjects - phObject <%#02x> (%#02x)", phObject, ( ( NULL_PTR != phObject ) ? *phObject : 0 ) );
+         Log::log( "C_FindObjects - ulMaxObjectCount <%#02x>", ulMaxObjectCount );
+         Log::log( "C_FindObjects - pulObjectCount <%#02x> (%#02x)", pulObjectCount, ( ( NULL_PTR != pulObjectCount ) ? *pulObjectCount : 0 ) );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv = Slot::FindObjects( hSession, phObject, ulMaxObjectCount, pulObjectCount );
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_FindObjects" );
+
+         Log::logCK_RV( "C_FindObjects", rv );
+         Log::out( "C_FindObjects" );
+         Log::log( "C_FindObjects - phObject <%#02x> (%#02x)", phObject, ( ( NULL_PTR != phObject ) ? *phObject : 0 ) );
+         Log::log( "C_FindObjects - pulObjectCount <%#02x> (%#02x)", pulObjectCount, ( ( NULL_PTR != pulObjectCount ) ? *pulObjectCount : 0 ) );
+         Log::end( "C_FindObjects\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_FindObjects", rv );
-      Log::out( "C_FindObjects" );
-      Log::log( "C_FindObjects - phObject <%#02x> (%#02x)", phObject, ( ( NULL_PTR != phObject ) ? *phObject : 0 ) );
-      Log::log( "C_FindObjects - pulObjectCount <%#02x> (%#02x)", pulObjectCount, ( ( NULL_PTR != pulObjectCount ) ? *pulObjectCount : 0 ) );
-      Log::end( "C_FindObjects" );
       return rv;
    }
 
@@ -1096,19 +1397,32 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_FindObjectsFinal )( CK_SESSION_HANDLE hSession )
    {
-      Log::begin( "C_FindObjectsFinal" );
-      Log::in( "C_FindObjectsFinal" );
-      Log::log( "C_FindObjectsFinal - hSession <%#02x>", hSession );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::FindObjectsFinal(hSession);
+         Log::begin( "C_FindObjectsFinal" );
+         Log::in( "C_FindObjectsFinal" );
+         Log::log( "C_FindObjectsFinal - hSession <%#02x>", hSession );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv = Slot::FindObjectsFinal(hSession);
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_FindObjectsFinal" );
+
+         Log::logCK_RV( "C_FindObjectsFinal", rv );
+         Log::end( "C_FindObjectsFinal\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_FindObjectsFinal", rv );
-      Log::end( "C_FindObjectsFinal" );
       return rv;
    }
 
@@ -1122,21 +1436,34 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_EncryptInit )( CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hKey )
    {
-      Log::begin( "C_EncryptInit" );
-      Log::in( "C_EncryptInit" );
-      Log::log( "C_EncryptInit - hSession <%#02x>", hSession );
-      Log::logCK_MECHANISM_PTR( "C_EncryptInit", pMechanism );
-      Log::log( "C_EncryptInit - hKey <%#02x>", hKey );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::EncryptInit(hSession,pMechanism,hKey);
+         Log::begin( "C_EncryptInit" );
+         Log::in( "C_EncryptInit" );
+         Log::log( "C_EncryptInit - hSession <%#02x>", hSession );
+         Log::logCK_MECHANISM_PTR( "C_EncryptInit", pMechanism );
+         Log::log( "C_EncryptInit - hKey <%#02x>", hKey );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv = Slot::EncryptInit(hSession,pMechanism,hKey);
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_EncryptInit" );
+
+         Log::logCK_RV( "C_EncryptInit", rv );
+         Log::end( "C_EncryptInit\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_EncryptInit", rv );
-      Log::end( "C_EncryptInit" );
       return rv;
    }
 
@@ -1152,23 +1479,36 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_Encrypt )( CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pEncryptedData, CK_ULONG_PTR pulEncryptedDataLen )
    {
-      Log::begin( "C_Encrypt" );
-      Log::in( "C_Encrypt" );
-      Log::log( "C_Encrypt - hSession <%#02x>", hSession );
-      Log::logCK_UTF8CHAR_PTR( "C_Encrypt - pData", pData, ulDataLen );
-      Log::logCK_UTF8CHAR_PTR( "C_Encrypt - pEncryptedData", pEncryptedData, (NULL_PTR == pulEncryptedDataLen) ? 0 : *pulEncryptedDataLen );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::Encrypt( hSession, pData, ulDataLen, pEncryptedData, pulEncryptedDataLen );
+         Log::begin( "C_Encrypt" );
+         Log::in( "C_Encrypt" );
+         Log::log( "C_Encrypt - hSession <%#02x>", hSession );
+         Log::logCK_UTF8CHAR_PTR( "C_Encrypt - pData", pData, ulDataLen );
+         Log::logCK_UTF8CHAR_PTR( "C_Encrypt - pEncryptedData", pEncryptedData, (NULL_PTR == pulEncryptedDataLen) ? 0 : *pulEncryptedDataLen );
+
+         Log::start( );      
+         PKCS11_TRY
+         {
+            rv = Slot::Encrypt( hSession, pData, ulDataLen, pEncryptedData, pulEncryptedDataLen );
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_Encrypt" );
+
+         Log::logCK_RV( "C_Encrypt", rv );
+         Log::out( "C_Encrypt" );
+         Log::logCK_UTF8CHAR_PTR( "C_Encrypt - pEncryptedData", pEncryptedData, (NULL_PTR == pulEncryptedDataLen) ? 0 : *pulEncryptedDataLen );
+         Log::end( "C_Encrypt\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_Encrypt", rv );
-      Log::out( "C_Encrypt" );
-      Log::logCK_UTF8CHAR_PTR( "C_Encrypt - pEncryptedData", pEncryptedData, (NULL_PTR == pulEncryptedDataLen) ? 0 : *pulEncryptedDataLen );
-      Log::end( "C_Encrypt" );
       return rv;
    }
 
@@ -1195,7 +1535,7 @@
       }
 
       Log::logCK_RV( "C_EncryptUpdate", rv );
-      Log::end( "C_EncryptUpdate" );
+      Log::end( "C_EncryptUpdate\n" );
       return rv;
    }
 
@@ -1219,7 +1559,7 @@
       }
 
       Log::logCK_RV( "C_EncryptFinal", rv );
-      Log::end( "C_EncryptFinal" );
+      Log::end( "C_EncryptFinal\n" );
       return rv;
    }
 
@@ -1233,21 +1573,34 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_DecryptInit )( CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hKey )
    {
-      Log::begin( "C_DecryptInit" );
-      Log::in( "C_DecryptInit" );
-      Log::log( "C_DecryptInit - hSession <%#02x>", hSession );
-      Log::logCK_MECHANISM_PTR( "C_DecryptInit", pMechanism );
-      Log::log( "C_DecryptInit - hKey <%#02x>", hKey );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::DecryptInit( hSession, pMechanism, hKey );
+         Log::begin( "C_DecryptInit" );
+         Log::in( "C_DecryptInit" );
+         Log::log( "C_DecryptInit - hSession <%#02x>", hSession );
+         Log::logCK_MECHANISM_PTR( "C_DecryptInit", pMechanism );
+         Log::log( "C_DecryptInit - hKey <%#02x>", hKey );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv = Slot::DecryptInit( hSession, pMechanism, hKey );
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_DecryptInit" );
+
+         Log::logCK_RV( "C_DecryptInit", rv );
+         Log::end( "C_DecryptInit\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_DecryptInit", rv );
-      Log::end( "C_DecryptInit" );
       return rv;
    }
 
@@ -1264,23 +1617,36 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_Decrypt )( CK_SESSION_HANDLE hSession, CK_BYTE_PTR pEncryptedData, CK_ULONG ulEncryptedDataLen, CK_BYTE_PTR pData, CK_ULONG_PTR pulDataLen )
    {
-      Log::begin( "C_Decrypt" );
-      Log::in( "C_Decrypt" );
-      Log::log( "C_Decrypt - hSession <%#02x>", hSession );
-      Log::logCK_UTF8CHAR_PTR( "C_Decrypt - pEncryptedData", pEncryptedData, ulEncryptedDataLen );
-      Log::logCK_UTF8CHAR_PTR( "C_Decrypt - pData", pData, (NULL_PTR == pulDataLen) ? 0 : *pulDataLen );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::Decrypt(hSession,pEncryptedData,ulEncryptedDataLen,pData,pulDataLen);
+         Log::begin( "C_Decrypt" );
+         Log::in( "C_Decrypt" );
+         Log::log( "C_Decrypt - hSession <%#02x>", hSession );
+         Log::logCK_UTF8CHAR_PTR( "C_Decrypt - pEncryptedData", pEncryptedData, ulEncryptedDataLen );
+         Log::logCK_UTF8CHAR_PTR( "C_Decrypt - pData", pData, (NULL_PTR == pulDataLen) ? 0 : *pulDataLen );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv = Slot::Decrypt(hSession,pEncryptedData,ulEncryptedDataLen,pData,pulDataLen);
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_Decrypt" );
+
+         Log::logCK_RV( "C_Decrypt", rv );
+         Log::out( "C_Decrypt" );
+         Log::logCK_UTF8CHAR_PTR( "C_Decrypt - pData", pData, (NULL_PTR == pulDataLen) ? 0 : *pulDataLen );
+         Log::end( "C_Decrypt\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_Decrypt", rv );
-      Log::out( "C_Decrypt" );
-      Log::logCK_UTF8CHAR_PTR( "C_Decrypt - pData", pData, (NULL_PTR == pulDataLen) ? 0 : *pulDataLen );
-      Log::end( "C_Decrypt" );
       return rv;
    }
 
@@ -1306,7 +1672,7 @@
       }
 
       Log::logCK_RV( "C_DecryptUpdate", rv );
-      Log::end( "C_DecryptUpdate" );
+      Log::end( "C_DecryptUpdate\n" );
       return rv;
    }
 
@@ -1330,7 +1696,7 @@
       }
 
       Log::logCK_RV( "C_DecryptFinal", rv );
-      Log::end( "C_DecryptFinal" );
+      Log::end( "C_DecryptFinal\n" );
       return rv;
    }
 
@@ -1343,20 +1709,33 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_DigestInit )( CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism )
    {
-      Log::begin( "C_DigestInit" );
-      Log::in( "C_DigestInit" );
-      Log::log( "C_DigestInit - hSession <%#02x>", hSession );
-      Log::logCK_MECHANISM_PTR( "C_DigestInit", pMechanism );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::DigestInit(hSession,pMechanism);
+          Log::begin( "C_DigestInit" );
+         Log::in( "C_DigestInit" );
+         Log::log( "C_DigestInit - hSession <%#02x>", hSession );
+         Log::logCK_MECHANISM_PTR( "C_DigestInit", pMechanism );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv = Slot::DigestInit(hSession,pMechanism);
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_DigestInit" );
+
+         Log::logCK_RV( "C_DigestInit", rv );
+         Log::end( "C_DigestInit\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_DigestInit", rv );
-      Log::end( "C_DigestInit" );
       return rv;
    }
 
@@ -1372,23 +1751,36 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_Digest )( CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pDigest, CK_ULONG_PTR pulDigestLen )
    {
-      Log::begin( "C_Digest" );
-      Log::in( "C_Digest" );
-      Log::log( "C_Digest - hSession <%#02x>", hSession );
-      Log::logCK_UTF8CHAR_PTR( "C_Digest - pData", pData, ulDataLen );
-      Log::logCK_UTF8CHAR_PTR( "C_Digest - pDigest", pDigest, (NULL_PTR == pulDigestLen) ? 0 : *pulDigestLen );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::Digest( hSession, pData, ulDataLen, pDigest, pulDigestLen );
+         Log::begin( "C_Digest" );
+         Log::in( "C_Digest" );
+         Log::log( "C_Digest - hSession <%#02x>", hSession );
+         Log::logCK_UTF8CHAR_PTR( "C_Digest - pData", pData, ulDataLen );
+         Log::logCK_UTF8CHAR_PTR( "C_Digest - pDigest", pDigest, (NULL_PTR == pulDigestLen) ? 0 : *pulDigestLen );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv = Slot::Digest( hSession, pData, ulDataLen, pDigest, pulDigestLen );
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_Digest" );
+
+         Log::logCK_RV( "C_Digest", rv );
+         Log::out( "C_Digest" );
+         Log::logCK_UTF8CHAR_PTR( "C_Digest - pDigest", pDigest, (NULL_PTR == pulDigestLen) ? 0 : *pulDigestLen );
+         Log::end( "C_Digest\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_Digest", rv );
-      Log::out( "C_Digest" );
-      Log::logCK_UTF8CHAR_PTR( "C_Digest - pDigest", pDigest, (NULL_PTR == pulDigestLen) ? 0 : *pulDigestLen );
-      Log::end( "C_Digest" );
       return rv;
    }
 
@@ -1403,20 +1795,33 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_DigestUpdate )( CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, CK_ULONG ulPartLen )
    {
-      Log::begin( "C_DigestUpdate" );
-      Log::in( "C_DigestUpdate" );
-      Log::log( "C_DigestUpdate - hSession <%#02x>", hSession );
-      Log::logCK_UTF8CHAR_PTR( "C_DigestUpdate - pPart", pPart, ulPartLen );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::DigestUpdate( hSession, pPart, ulPartLen );
+         Log::begin( "C_DigestUpdate" );
+         Log::in( "C_DigestUpdate" );
+         Log::log( "C_DigestUpdate - hSession <%#02x>", hSession );
+         Log::logCK_UTF8CHAR_PTR( "C_DigestUpdate - pPart", pPart, ulPartLen );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv = Slot::DigestUpdate( hSession, pPart, ulPartLen );
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_DigestUpdate" );
+
+         Log::logCK_RV( "C_DigestUpdate", rv );
+         Log::end( "C_DigestUpdate\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_DigestUpdate", rv );
-      Log::end( "C_DigestUpdate" );
       return rv;
    }
 
@@ -1435,7 +1840,7 @@
       }
 
       Log::logCK_RV( "C_DigestKey", rv );
-      Log::end( "C_DigestKey" );
+      Log::end( "C_DigestKey\n" );
       return rv;
    }
 
@@ -1451,22 +1856,35 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_DigestFinal )( CK_SESSION_HANDLE hSession, CK_BYTE_PTR pDigest, CK_ULONG_PTR pulDigestLen )
    {
-      Log::begin( "C_DigestFinal" );
-      Log::in( "C_DigestFinal" );
-      Log::log( "C_DigestFinal - hSession <%#02x>", hSession );
-      Log::logCK_UTF8CHAR_PTR( "C_DigestFinal - pDigest", pDigest, (NULL_PTR == pulDigestLen) ? 0 : *pulDigestLen );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::DigestFinal( hSession, pDigest, pulDigestLen );
+         Log::begin( "C_DigestFinal" );
+         Log::in( "C_DigestFinal" );
+         Log::log( "C_DigestFinal - hSession <%#02x>", hSession );
+         Log::logCK_UTF8CHAR_PTR( "C_DigestFinal - pDigest", pDigest, (NULL_PTR == pulDigestLen) ? 0 : *pulDigestLen );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv = Slot::DigestFinal( hSession, pDigest, pulDigestLen );
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_DigestFinal" );
+
+         Log::logCK_RV( "C_DigestFinal", rv );
+         Log::out( "C_DigestFinal" );
+         Log::logCK_UTF8CHAR_PTR( "C_DigestFinal - pDigest", pDigest, (NULL_PTR == pulDigestLen) ? 0 : *pulDigestLen );
+         Log::end( "C_DigestFinal\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_DigestFinal", rv );
-      Log::out( "C_DigestFinal" );
-      Log::logCK_UTF8CHAR_PTR( "C_DigestFinal - pDigest", pDigest, (NULL_PTR == pulDigestLen) ? 0 : *pulDigestLen );
-      Log::end( "C_DigestFinal" );
       return rv;
    }
 
@@ -1483,21 +1901,34 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_SignInit )( CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hKey )
    {
-      Log::begin( "C_SignInit" );
-      Log::in( "C_SignInit" );
-      Log::log( "C_SignInit - hSession <%#02x>", hSession );
-      Log::logCK_MECHANISM_PTR( "C_SignInit", pMechanism );
-      Log::log( "C_SignInit - hKey <%#02x>", hKey );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::SignInit(hSession,pMechanism,hKey);
+         Log::begin( "C_SignInit" );
+         Log::in( "C_SignInit" );
+         Log::log( "C_SignInit - hSession <%#02x>", hSession );
+         Log::logCK_MECHANISM_PTR( "C_SignInit", pMechanism );
+         Log::log( "C_SignInit - hKey <%#02x>", hKey );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv = Slot::SignInit(hSession,pMechanism,hKey);
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_SignInit" );
+         
+         Log::logCK_RV( "C_SignInit", rv );
+         Log::end( "C_SignInit\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_SignInit", rv );
-      Log::end( "C_SignInit" );
       return rv;
    }
 
@@ -1516,23 +1947,36 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_Sign )( CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pSignature, CK_ULONG_PTR pulSignatureLen )
    {
-      Log::begin( "C_Sign" );
-      Log::in( "C_Sign" );
-      Log::log( "C_Sign - hSession <%#02x>", hSession );
-      Log::logCK_UTF8CHAR_PTR( "C_Sign - pData", pData, ulDataLen );
-      Log::logCK_UTF8CHAR_PTR( "C_Sign - pSignature", pSignature, (NULL_PTR == pulSignatureLen) ? 0 : *pulSignatureLen );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::Sign( hSession, pData, ulDataLen, pSignature, pulSignatureLen );
+         Log::begin( "C_Sign" );
+         Log::in( "C_Sign" );
+         Log::log( "C_Sign - hSession <%#02x>", hSession );
+         Log::logCK_UTF8CHAR_PTR( "C_Sign - pData", pData, ulDataLen );
+         Log::logCK_UTF8CHAR_PTR( "C_Sign - pSignature", pSignature, (NULL_PTR == pulSignatureLen) ? 0 : *pulSignatureLen );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv = Slot::Sign( hSession, pData, ulDataLen, pSignature, pulSignatureLen );
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_Sign" );
+         
+         Log::logCK_RV( "C_Sign", rv );
+         Log::out( "C_Sign" );
+         Log::logCK_UTF8CHAR_PTR( "C_Sign - pSignature", pSignature, (NULL_PTR == pulSignatureLen) ? 0 : *pulSignatureLen );
+         Log::end( "C_Sign\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_Sign", rv );
-      Log::out( "C_Sign" );
-      Log::logCK_UTF8CHAR_PTR( "C_Sign - pSignature", pSignature, (NULL_PTR == pulSignatureLen) ? 0 : *pulSignatureLen );
-      Log::end( "C_Sign" );
       return rv;
    }
 
@@ -1548,20 +1992,33 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_SignUpdate )( CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, CK_ULONG ulPartLen )
    {
-      Log::begin( "C_SignUpdate" );
-      Log::in( "C_SignUpdate" );
-      Log::log( "C_SignUpdate - hSession <%#02x>", hSession );
-      Log::logCK_UTF8CHAR_PTR( "C_SignUpdate - pPart", pPart, ulPartLen );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::SignUpdate(hSession,pPart,ulPartLen);
+         Log::begin( "C_SignUpdate" );
+         Log::in( "C_SignUpdate" );
+         Log::log( "C_SignUpdate - hSession <%#02x>", hSession );
+         Log::logCK_UTF8CHAR_PTR( "C_SignUpdate - pPart", pPart, ulPartLen );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv = Slot::SignUpdate(hSession,pPart,ulPartLen);
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_SignUpdate" );
+
+         Log::logCK_RV( "C_SignUpdate", rv );
+         Log::end( "C_SignUpdate\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_SignUpdate", rv );
-      Log::end( "C_SignUpdate" );
       return rv;
    }
 
@@ -1576,22 +2033,35 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_SignFinal )( CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSignature, CK_ULONG_PTR pulSignatureLen )
    {
-      Log::begin( "C_SignFinal" );
-      Log::in( "C_SignFinal" );
-      Log::log( "C_SignFinal - hSession <%#02x>", hSession );
-      Log::logCK_UTF8CHAR_PTR( "C_SignFinal - pSignature", pSignature, (NULL_PTR == pulSignatureLen) ? 0 : *pulSignatureLen );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv =  Slot::SignFinal(hSession,pSignature,pulSignatureLen);
+         Log::begin( "C_SignFinal" );
+         Log::in( "C_SignFinal" );
+         Log::log( "C_SignFinal - hSession <%#02x>", hSession );
+         Log::logCK_UTF8CHAR_PTR( "C_SignFinal - pSignature", pSignature, (NULL_PTR == pulSignatureLen) ? 0 : *pulSignatureLen );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv =  Slot::SignFinal(hSession,pSignature,pulSignatureLen);
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_SignFinal" );
+
+         Log::logCK_RV( "C_SignFinal", rv );
+         Log::out( "C_SignFinal" );
+         Log::logCK_UTF8CHAR_PTR( "C_SignFinal - pSignature", pSignature, (NULL_PTR == pulSignatureLen) ? 0 : *pulSignatureLen );
+         Log::end( "C_SignFinal\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_SignFinal", rv );
-      Log::out( "C_SignFinal" );
-      Log::logCK_UTF8CHAR_PTR( "C_SignFinal - pSignature", pSignature, (NULL_PTR == pulSignatureLen) ? 0 : *pulSignatureLen );
-      Log::end( "C_SignFinal" );
       return rv;
    }
 
@@ -1609,7 +2079,7 @@
       }
 
       Log::logCK_RV( "C_SignRecoverInit", rv );
-      Log::end( "C_SignRecoverInit" );
+      Log::end( "C_SignRecoverInit\n" );
       return rv;
    }
 
@@ -1626,7 +2096,7 @@
       }
 
       Log::logCK_RV( "C_SignRecover", rv );
-      Log::end( "C_SignRecover" );
+      Log::end( "C_SignRecover\n" );
       return rv;
    }
 
@@ -1643,21 +2113,34 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_VerifyInit )( CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hKey )
    {
-      Log::begin( "C_VerifyInit" );
-      Log::in( "C_VerifyInit" );
-      Log::log( "C_VerifyInit - hSession <%#02x>", hSession );
-      Log::logCK_MECHANISM_PTR( "C_VerifyInit", pMechanism );
-      Log::log( "C_VerifyInit - hKey <%#02x>", hKey );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::VerifyInit( hSession, pMechanism, hKey );
+         Log::begin( "C_VerifyInit" );
+         Log::in( "C_VerifyInit" );
+         Log::log( "C_VerifyInit - hSession <%#02x>", hSession );
+         Log::logCK_MECHANISM_PTR( "C_VerifyInit", pMechanism );
+         Log::log( "C_VerifyInit - hKey <%#02x>", hKey );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv = Slot::VerifyInit( hSession, pMechanism, hKey );
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_VerifyInit" );
+
+         Log::logCK_RV( "C_VerifyInit", rv );
+         Log::end( "C_VerifyInit\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_VerifyInit", rv );
-      Log::end( "C_VerifyInit" );
       return rv;
    }
 
@@ -1675,23 +2158,36 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_Verify )( CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData, CK_ULONG ulDataLen, CK_BYTE_PTR pSignature, CK_ULONG ulSignatureLen )
    {
-      Log::begin( "C_Verify" );
-      Log::in( "C_Verify" );
-      Log::log( "C_Verify - hSession <%#02x>", hSession );
-      Log::logCK_UTF8CHAR_PTR( "C_Verify - pData", pData, ulDataLen );
-      Log::logCK_UTF8CHAR_PTR( "C_Verify - pSignature", pSignature, ulSignatureLen );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::Verify(hSession,pData,ulDataLen,pSignature,ulSignatureLen);
+         Log::begin( "C_Verify" );
+         Log::in( "C_Verify" );
+         Log::log( "C_Verify - hSession <%#02x>", hSession );
+         Log::logCK_UTF8CHAR_PTR( "C_Verify - pData", pData, ulDataLen );
+         Log::logCK_UTF8CHAR_PTR( "C_Verify - pSignature", pSignature, ulSignatureLen );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv = Slot::Verify(hSession,pData,ulDataLen,pSignature,ulSignatureLen);
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_Verify" );
+         
+         Log::logCK_RV( "C_Verify", rv );
+         Log::out( "C_Verify" );
+         Log::logCK_UTF8CHAR_PTR( "C_Verify - pSignature", pSignature, ulSignatureLen );
+         Log::end( "C_Verify\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_Verify", rv );
-      Log::out( "C_Verify" );
-      Log::logCK_UTF8CHAR_PTR( "C_Verify - pSignature", pSignature, ulSignatureLen );
-      Log::end( "C_Verify" );
       return rv;
    }
 
@@ -1701,20 +2197,33 @@
    * and plaintext cannot be recovered from the signature. */
    CK_DEFINE_FUNCTION( CK_RV, C_VerifyUpdate )( CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart, CK_ULONG ulPartLen )
    {
-      Log::begin( "C_VerifyUpdate" );
-      Log::in( "C_VerifyUpdate" );
-      Log::log( "C_VerifyUpdate - hSession <%#02x>", hSession );
-      Log::logCK_UTF8CHAR_PTR( "C_VerifyUpdate - pPart", pPart, ulPartLen );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::VerifyUpdate(hSession,pPart,ulPartLen);
+         Log::begin( "C_VerifyUpdate" );
+         Log::in( "C_VerifyUpdate" );
+         Log::log( "C_VerifyUpdate - hSession <%#02x>", hSession );
+         Log::logCK_UTF8CHAR_PTR( "C_VerifyUpdate - pPart", pPart, ulPartLen );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv = Slot::VerifyUpdate(hSession,pPart,ulPartLen);
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_VerifyUpdate" );
+
+         Log::logCK_RV( "C_VerifyUpdate", rv );
+         Log::end( "C_VerifyUpdate\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_VerifyUpdate", rv );
-      Log::end( "C_VerifyUpdate" );
       return rv;
    }
 
@@ -1723,20 +2232,33 @@
    * operation, checking the signature. */
    CK_DEFINE_FUNCTION( CK_RV, C_VerifyFinal )( CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSignature, CK_ULONG ulSignatureLen )
    {
-      Log::begin( "C_VerifyFinal" );
-      Log::in( "C_VerifyFinal" );
-      Log::log( "C_VerifyFinal - hSession <%#02x>", hSession );
-      Log::logCK_UTF8CHAR_PTR( "C_VerifyFinal - pSignature", pSignature, ulSignatureLen );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::VerifyFinal(hSession,pSignature,ulSignatureLen);
+         Log::begin( "C_VerifyFinal" );
+         Log::in( "C_VerifyFinal" );
+         Log::log( "C_VerifyFinal - hSession <%#02x>", hSession );
+         Log::logCK_UTF8CHAR_PTR( "C_VerifyFinal - pSignature", pSignature, ulSignatureLen );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv = Slot::VerifyFinal(hSession,pSignature,ulSignatureLen);
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_VerifyFinal" );
+         
+         Log::logCK_RV( "C_VerifyFinal", rv );
+         Log::end( "C_VerifyFinal\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_VerifyFinal", rv );
-      Log::end( "C_VerifyFinal" );
       return rv;
    }
 
@@ -1754,7 +2276,7 @@
       }
 
       Log::logCK_RV( "C_VerifyRecoverInit", rv );
-      Log::end( "C_VerifyRecoverInit" );
+      Log::end( "C_VerifyRecoverInit\n" );
       return rv;
    }
 
@@ -1772,7 +2294,7 @@
       }
 
       Log::logCK_RV( "C_VerifyRecover", rv );
-      Log::end( "C_VerifyRecover" );
+      Log::end( "C_VerifyRecover\n" );
       return rv;
    }
 
@@ -1789,7 +2311,7 @@
       }
 
       Log::logCK_RV( "C_DigestEncryptUpdate", rv );
-      Log::end( "C_DigestEncryptUpdate" );
+      Log::end( "C_DigestEncryptUpdate\n" );
       return rv;
    }
 
@@ -1806,7 +2328,7 @@
       }
 
       Log::logCK_RV( "C_DecryptDigestUpdate", rv );
-      Log::end( "C_DecryptDigestUpdate" );
+      Log::end( "C_DecryptDigestUpdate\n" );
       return rv;
    }
 
@@ -1823,7 +2345,7 @@
       }
 
       Log::logCK_RV( "C_SignEncryptUpdate", rv );
-      Log::end( "C_SignEncryptUpdate" );
+      Log::end( "C_SignEncryptUpdate\n" );
       return rv;
    }
 
@@ -1841,7 +2363,7 @@
       }
 
       Log::logCK_RV( "C_DecryptVerifyUpdate", rv );
-      Log::end( "C_DecryptVerifyUpdate" );
+      Log::end( "C_DecryptVerifyUpdate\n" );
       return rv;
    }
 
@@ -1866,7 +2388,7 @@
       }
 
       Log::logCK_RV( "C_GenerateKey", rv );
-      Log::end( "C_GenerateKey" );
+      Log::end( "C_GenerateKey\n" );
       return rv;
    }
 
@@ -1887,27 +2409,40 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_GenerateKeyPair )(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, CK_ATTRIBUTE_PTR pPublicKeyTemplate, CK_ULONG ulPublicKeyAttributeCount, CK_ATTRIBUTE_PTR pPrivateKeyTemplate, CK_ULONG ulPrivateKeyAttributeCount, CK_OBJECT_HANDLE_PTR phPublicKey, CK_OBJECT_HANDLE_PTR phPrivateKey )
    {
-      Log::begin( "C_GenerateKeyPair" );
-      Log::in( "C_GenerateKeyPair" );
-      Log::log( "C_GenerateKeyPair - hSession <%#02x>", hSession );
-      Log::logCK_MECHANISM_PTR( "C_GenerateKeyPair", pMechanism );
-      Log::logCK_ATTRIBUTE_PTR( "C_GenerateKeyPair", pPublicKeyTemplate, ulPublicKeyAttributeCount );
-      Log::logCK_ATTRIBUTE_PTR( "C_GenerateKeyPair", pPrivateKeyTemplate, ulPrivateKeyAttributeCount );
-      Log::log( "C_GenerateKeyPair - phPublicKey <%#02x>", (phPublicKey == NULL_PTR) ? 0 : *phPublicKey );
-      Log::log( "C_GenerateKeyPair - phPrivateKey <%#02x>", (phPrivateKey == NULL_PTR) ? 0 : *phPrivateKey );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::GenerateKeyPair( hSession, pMechanism, pPublicKeyTemplate, ulPublicKeyAttributeCount, pPrivateKeyTemplate, ulPrivateKeyAttributeCount, phPublicKey, phPrivateKey );
+         Log::begin( "C_GenerateKeyPair" );
+         Log::in( "C_GenerateKeyPair" );
+         Log::log( "C_GenerateKeyPair - hSession <%#02x>", hSession );
+         Log::logCK_MECHANISM_PTR( "C_GenerateKeyPair", pMechanism );
+         Log::logCK_ATTRIBUTE_PTR( "C_GenerateKeyPair", pPublicKeyTemplate, ulPublicKeyAttributeCount );
+         Log::logCK_ATTRIBUTE_PTR( "C_GenerateKeyPair", pPrivateKeyTemplate, ulPrivateKeyAttributeCount );
+         Log::log( "C_GenerateKeyPair - phPublicKey <%#02x>", (phPublicKey == NULL_PTR) ? 0 : *phPublicKey );
+         Log::log( "C_GenerateKeyPair - phPrivateKey <%#02x>", (phPrivateKey == NULL_PTR) ? 0 : *phPrivateKey );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv = Slot::GenerateKeyPair( hSession, pMechanism, pPublicKeyTemplate, ulPublicKeyAttributeCount, pPrivateKeyTemplate, ulPrivateKeyAttributeCount, phPublicKey, phPrivateKey );
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_GenerateKeyPair" );
+
+         Log::logCK_RV( "C_GenerateKeyPair", rv );
+         Log::out( "C_GenerateKeyPair" );
+         Log::log( "C_GenerateKeyPair - phPublicKey <%#02x>", (phPublicKey == NULL_PTR) ? 0 : *phPublicKey );
+         Log::log( "C_GenerateKeyPair - phPrivateKey <%#02x>", (phPrivateKey == NULL_PTR) ? 0 : *phPrivateKey );
+         Log::end( "C_GenerateKeyPair\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_GenerateKeyPair", rv );
-      Log::out( "C_GenerateKeyPair" );
-      Log::log( "C_GenerateKeyPair - phPublicKey <%#02x>", (phPublicKey == NULL_PTR) ? 0 : *phPublicKey );
-      Log::log( "C_GenerateKeyPair - phPrivateKey <%#02x>", (phPrivateKey == NULL_PTR) ? 0 : *phPrivateKey );
-      Log::end( "C_GenerateKeyPair" );
       return rv;
    }
 
@@ -1933,7 +2468,7 @@
       }
 
       Log::logCK_RV( "C_WrapKey", rv );
-      Log::end( "C_WrapKey" );
+      Log::end( "C_WrapKey\n" );
       return rv;
    }
 
@@ -1963,7 +2498,7 @@
       }
 
       Log::logCK_RV( "C_UnwrapKey", rv );
-      Log::end( "C_UnwrapKey" );
+      Log::end( "C_UnwrapKey\n" );
       return rv;
    }
 
@@ -1991,7 +2526,7 @@
       }
 
       Log::logCK_RV( "C_DeriveKey", rv );
-      Log::end( "C_DeriveKey" );
+      Log::end( "C_DeriveKey\n" );
       return rv;
    }
 
@@ -2015,7 +2550,7 @@
       }
 
       Log::logCK_RV( "C_SeedRandom", rv );
-      Log::end( "C_SeedRandom" );
+      Log::end( "C_SeedRandom\n" );
       return rv;
    }
 
@@ -2029,21 +2564,34 @@
    */
    CK_DEFINE_FUNCTION( CK_RV, C_GenerateRandom )( CK_SESSION_HANDLE hSession, CK_BYTE_PTR pRandomData, CK_ULONG ulRandomLen )
    {
-      Log::begin( "C_GenerateRandom" );
-      Log::in( "C_GenerateRandom" );
-      Log::logCK_UTF8CHAR_PTR( "C_GenerateRandom", pRandomData, ulRandomLen );
-
+      CCriticalSectionLocker cslock( _critSectAPI );
+      
       CK_RV rv = CKR_OK;
-      PKCS11_TRY
+      
+      try
       {
-         rv = Slot::GenerateRandom( hSession, pRandomData, ulRandomLen );
+         Log::begin( "C_GenerateRandom" );
+         Log::in( "C_GenerateRandom" );
+         Log::logCK_UTF8CHAR_PTR( "C_GenerateRandom", pRandomData, ulRandomLen );
+
+         Log::start( );
+         PKCS11_TRY
+         {
+            rv = Slot::GenerateRandom( hSession, pRandomData, ulRandomLen );
+         }
+         PKCS11_CATCH(rv)
+         Log::stop( "C_GenerateRandom" );
+         
+         Log::logCK_RV( "C_GenerateRandom", rv );
+         Log::out( "C_GenerateRandom" );
+         Log::logCK_UTF8CHAR_PTR( "C_GenerateRandom", pRandomData, ulRandomLen );
+         Log::end( "C_GenerateRandom\n" );
       }
-      PKCS11_CATCH(rv)
+      catch( ... )
+      {
+         rv = CKR_GENERAL_ERROR;
+      }
 
-      Log::logCK_RV( "C_GenerateRandom", rv );
-      Log::out( "C_GenerateRandom" );
-      Log::logCK_UTF8CHAR_PTR( "C_GenerateRandom", pRandomData, ulRandomLen );
-      Log::end( "C_GenerateRandom" );
       return rv;
    }
 
@@ -2066,7 +2614,7 @@
       }
 
       Log::logCK_RV( "C_GetFunctionStatus", rv );
-      Log::end( "C_GetFunctionStatus" );
+      Log::end( "C_GetFunctionStatus\n" );
       return rv;
    }
 
@@ -2088,7 +2636,7 @@
       }
 
       Log::logCK_RV( "C_CancelFunction", rv );
-      Log::end( "C_CancelFunction" );
+      Log::end( "C_CancelFunction\n" );
       return rv;
    }
 

Modified: trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/pkcs11.h
===================================================================
--- trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/pkcs11.h	2010-02-04 14:54:20 UTC (rev 112)
+++ trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/pkcs11.h	2010-02-08 09:41:15 UTC (rev 113)
@@ -1,5 +1,5 @@
 /* pkcs11.h include file for PKCS #11. */
-/* $Revision: 1.4 $ */
+/* $Revision: 1.5 $ */
 
 /* License to copy and use this software is granted provided that it is
  * identified as "RSA Security Inc. PKCS #11 Cryptographic Token Interface

Modified: trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/pkcs11f.h
===================================================================
--- trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/pkcs11f.h	2010-02-04 14:54:20 UTC (rev 112)
+++ trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/pkcs11f.h	2010-02-08 09:41:15 UTC (rev 113)
@@ -1,5 +1,5 @@
 /* pkcs11f.h include file for PKCS #11. */
-/* $Revision: 1.4 $ */
+/* $Revision: 1.5 $ */
 
 /* License to copy and use this software is granted provided that it is
  * identified as "RSA Security Inc. PKCS #11 Cryptographic Token Interface

Modified: trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/pkcs11t.h
===================================================================
--- trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/pkcs11t.h	2010-02-04 14:54:20 UTC (rev 112)
+++ trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/pkcs11t.h	2010-02-08 09:41:15 UTC (rev 113)
@@ -1,5 +1,5 @@
 /* pkcs11t.h include file for PKCS #11. */
-/* $Revision: 1.4 $ */
+/* $Revision: 1.5 $ */
 
 /* License to copy and use this software is granted provided that it is
  * identified as "RSA Security Inc. PKCS #11 Cryptographic Token Interface

Modified: trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/platconfig.h
===================================================================
--- trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/platconfig.h	2010-02-04 14:54:20 UTC (rev 112)
+++ trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/platconfig.h	2010-02-08 09:41:15 UTC (rev 113)
@@ -1,5 +1,5 @@
 /* cryptoki.h include file for PKCS #11. */
-/* $Revision: 1.4 $ */
+/* $Revision: 1.5 $ */
 
 /* License to copy and use this software is granted provided that it is
  * identified as "RSA Security Inc. PKCS #11 Cryptographic Token Interface

Modified: trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/sctoken.cpp
===================================================================
--- trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/sctoken.cpp	2010-02-04 14:54:20 UTC (rev 112)
+++ trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/sctoken.cpp	2010-02-08 09:41:15 UTC (rev 113)
@@ -64,7 +64,10 @@
 #define CARD_PROPERTY_PIN_INFO_EX 0x87
 #define CARD_PROPERTY_PIN_INFO 0x07
 #define CARD_PROPERTY_EXTERNAL_PIN 0x01
+#define CARD_PROPERTY_NO_PIN 0x03
+#define CARD_PROPERTY_PIN_POLICY 0x80
 #define CARD_ROLE_USER 0x01
+#define CARD_SERIAL_NUMBER 0x06
 
 #define CM_IOCTL_GET_FEATURE_REQUEST SCARD_CTL_CODE(3400)
 //#define FEATURE_VERIFY_PIN_START 0x01
@@ -92,6 +95,7 @@
 #define AUTHENTICATE_PINPAD 2
 #define AUTHENTICATE_BIO 3
 
+#define LOW_FREE_MEMORY_ALLOWED 25000
 
 #pragma pack(push, mdnet, 1)
 
@@ -156,7 +160,7 @@
    };
 }
 
-Token :: Token(std::string* reader) : _mscm(0),
+Token::Token(std::string* reader) : _mscm(0),
 _supportGarbageCollection(true),
 _cardCache(0),
 _fPinChanged(false),
@@ -174,31 +178,22 @@
       m_sReaderName = (*reader).c_str( );
    }
 
-   //Log::log( "Token::Token - new CardModuleService..." );
    std::string svcname("MSCM");
    _mscm = new CardModuleService( reader, 5, &svcname );
-   //Log::log( "Token::Token - new CardModuleService ok" );
 
    _mscm->DoSCardTransact(false);  // Turn off transaction handling since it is performed at application level
 
    // Transact card
-   //Log::log( "Token::Token - CardTransaction..." );
    CardTransaction ct(this);
-   //Log::log( "Token::Token - CardTransaction ok" );
 
-   //Log::log( "Token::Token - new CardCache..." );
    _cardCache = new CardCache(_mscm);
-   //Log::log( "Token::Token - new CardCache ok" );
 
    // Get seed for RNG from card. This is the first command to
    // card. If it fails, assume the card is not a .NET card.
    try
    {
-      //Log::log( "Token::Token - GetChallenge ..." );
-      auto_ptr<u1Array> challange(_mscm->GetChallenge());
-      //Log::log( "Token::Token - GetChallenge ok" );
-
-      Util::SeedRandom(*challange);
+      auto_ptr<u1Array> challenge(_mscm->GetChallenge( ));
+      Util::SeedRandom(*challenge);
    }
    catch(...)
    {
@@ -235,25 +230,41 @@
    this->_tokenInfo.flags  = CKF_RNG | CKF_LOGIN_REQUIRED | CKF_TOKEN_INITIALIZED | CKF_USER_PIN_INITIALIZED;
 
    // Check if the smart card is in SSO mode
-   if( ( true == this->isSSO( ) ) && ( true == this->isAuthenticated( ) ) )
+   m_bIsSSO = isSSO( );
+
+   // Check if PinPad device is supported
+   m_bIsPinPadSupported = isPinPadSupported( );
+
+   // Get the card configuration (mode, PIN type)
+   m_bCardMode = UVM_PIN_ONLY;
+   m_bTypePIN = PIN_TYPE_REGULAR;
+   getCardConfiguration( m_bCardMode, m_bTypePIN );
+   
+   m_bIsNoPinSupported = false;
+   if( m_bTypePIN == 0x03 )
    {
+      m_bIsNoPinSupported = true;
+   }
+
+   bool bIsAuthenticated = this->isAuthenticated( );
+
+   Log::log( "Token::Token - PIN type <%ld> (0 = regular ; 1 = external ; 2 = challenge/response ; 3 = no pin)", m_bTypePIN );
+   Log::log( "Token::Token - Card mode <%ld> (1 = pin only ; 2 = fp only ; 3 = fp or pin ; 4 = fp and pin)", m_bCardMode );
+   Log::log( "Token::Token - IsNoPinSupported <%d>", m_bIsNoPinSupported );
+   Log::log( "Token::Token - IsSSO <%d>", m_bIsSSO );
+   Log::log( "Token::Token - IsAuthenticated <%d>", bIsAuthenticated );
+
+   // Is login required ?
+   if(   ( true == m_bIsNoPinSupported ) 
+      || ( ( true == m_bIsSSO ) && ( true == bIsAuthenticated ) )
+      )
+   {
       this->_tokenInfo.flags &= ~CKF_LOGIN_REQUIRED;
+      Log::log( "Token::Token - No login required" );
    }
-   /*else
-   {
-   this->_tokenInfo.flags |= CKF_LOGIN_REQUIRED;
-   }*/
 
-
    // Check if the CKF_PROTECTED_AUTHENTICATION_PATH flag must be raised
-   m_isPinPadSupported = isPinPadSupported( );
-   //m_isPinExternal = isPinExternalSupported( );
-   BYTE bCardMode = UVM_PIN_ONLY;
-   BYTE bTypePIN = PIN_TYPE_REGULAR;
-   getCardConfiguration( bCardMode, bTypePIN );
-   Log::log( "Token::Token - PIN type <%ld> (0 = regular ; 1 = external)", bTypePIN );
-   Log::log( "Token::Token - Card mode <%ld> (1 = pin only ; 2 = fp only ; 3 = fp or pin ; 4 = fp and pin)", bCardMode );
-   if( ( bTypePIN == PIN_TYPE_EXTERNAL ) && ( ( ( bCardMode == UVM_PIN_ONLY ) && m_isPinPadSupported ) || ( bCardMode != UVM_PIN_ONLY ) ) )
+   if( ( m_bTypePIN == PIN_TYPE_EXTERNAL ) && ( ( ( m_bCardMode == UVM_PIN_ONLY ) && m_bIsPinPadSupported ) || ( m_bCardMode != UVM_PIN_ONLY ) ) )
    {
       Log::log( "Token::Token - Enable CKF_PROTECTED_AUTHENTICATION_PATH" );
       this->_tokenInfo.flags  |= CKF_PROTECTED_AUTHENTICATION_PATH;
@@ -277,6 +288,9 @@
    }
    CK_ULONG cardCf = LittleEndianToInt<CK_ULONG>(fileData->GetBuffer()+2);
 
+   //Log::log( "Token::Token - get serial number" );
+   //m_u1aSerialNumber = _mscm->GetCardProperty( CARD_SERIAL_NUMBER, 0 );
+
    this->_initialized  = this->IsInitialized();
 
    if(_initialized)
@@ -300,31 +314,58 @@
    _privCardCf = ~cardCf;
    _cacheCardCf = ~cardCf;
 
+   //printf( "\nToken::Token - ManageGC( true )\n" );
+   //ManageGC( true );
+
    //Log::end( "Token::Token" );
 }
 
-Token :: ~Token()
+Token::~Token()
 {
+   Log::begin( "Token::~Token" );
+
+   ManageGC( true );
+
    delete _cardCache;
+   
    delete this->_mscm;
+   
+   //if( NULL != m_u1aSerialNumber )
+   //{
+   //   delete m_u1aSerialNumber;
+   //}
 
    Clear();
+
+   Log::end( "Token::~Token" );
 }
 
 
 
-void Token::ManageGC()
+void Token::ManageGC( bool bForceGarbage )
 {
    if(!_supportGarbageCollection)
       return;
    try
    {
-      s4 freeMemory = _mscm->GetMemory();
-      if (freeMemory < 6000)
+      if( true == bForceGarbage )
       {
+         //printf( "\nToken::ManageGC - ForceGarbageCollector (true)\n" );
+
          Log::log( "Token::ManageGC - ForceGarbageCollector" );
          _mscm->ForceGarbageCollector( );
       }
+      else
+      {
+         s4 freeMemory = _mscm->GetMemory( );
+         if( freeMemory < LOW_FREE_MEMORY_ALLOWED )
+         {
+            //printf( "\nToken::ManageGC - ForceGarbageCollector\n" );
+
+            Log::log( "Token::ManageGC - ForceGarbageCollector (low)" );
+            _mscm->ForceGarbageCollector( );
+         }
+      }
    }
    catch(...)
    {
@@ -337,7 +378,7 @@
 {
    for(size_t i=0;i<_objects.size();i++)
       delete _objects[i];
-   _objects.clear();
+   _objects.clear( );
 }
 
 
@@ -363,16 +404,24 @@
       {
          // Read cache file.
          std::string sCardcf("cardcf");
-         ManageGC( );
          auto_ptr<u1Array> fileData(_mscm->ReadFile(&sCardcf,0));
+         //ManageGC( );
          if(fileData->GetLength() < 6)
             throw CkError(CKR_TOKEN_NOT_RECOGNIZED);
 
          _cardCf = LittleEndianToInt<CK_ULONG>(fileData->GetBuffer()+2);
       }
 
-      if((_publCardCf != _cardCf) ||
-         ((_privCardCf != _cardCf) && (_roleLogged == CKU_USER)))
+      if(   ( _publCardCf != _cardCf ) 
+         || (    ( _privCardCf != _cardCf ) 
+              && (    ( CKU_USER == _roleLogged )
+                   || ( true == m_bIsNoPinSupported ) 
+                   || ( ( true == m_bIsSSO ) && ( true == this->isAuthenticated( ) ) )
+                  )
+             )
+         )
+      //if((_publCardCf != _cardCf) ||
+      //   ((_privCardCf != _cardCf) && (_roleLogged == CKU_USER)))
       {
          // Card changed, so re-synchronize
          Resynchronize();
@@ -420,11 +469,12 @@
          IntToLittleEndian<WORD>(wContainersFreshness, fileData->GetBuffer(),2);
          IntToLittleEndian<WORD>(wFilesFreshness, fileData->GetBuffer(),4);
 
-         ManageGC( );
 
          // Write cache file back
          _mscm->WriteFile(&sCardCf, fileData.get());
 
+         ManageGC( );
+
          // As a result of own update, our own cache is still valid
          // as long as it was valid before.
          CK_ULONG newCardCf = LittleEndianToInt<CK_ULONG>(fileData->GetBuffer()+2);
@@ -456,6 +506,8 @@
 
 void Token::Resynchronize()
 {
+   //printf( "\nToken::Resynchronize\n" );
+
    // To be called at initial creation and also whenever
    // it is detected that card has been changed.
    // When re-sync, one have to maintain the object handles
@@ -479,7 +531,10 @@
 
    _publCardCf = _cardCf;
 
-   if(_roleLogged == CKU_USER)
+   if(   ( CKU_USER == _roleLogged )
+      || ( true == m_bIsNoPinSupported ) 
+      || ( ( true == m_bIsSSO ) && ( true == this->isAuthenticated( ) ) )
+      )
    {
       CK_RV rv = CKR_OK;
       TOKEN_TRY
@@ -529,9 +584,14 @@
    // Store the list of files to delete, then delete these if logged in.
    _toDelete = toDelete;
 
-   if(_roleLogged == CKU_USER)
+   if(   ( CKU_USER == _roleLogged )
+      || ( true == m_bIsNoPinSupported ) 
+      || ( ( true == m_bIsSSO ) && ( true == this->isAuthenticated( ) ) )
+      )
+   //if(   ( CKU_USER == _roleLogged )
+   {
       PerformDeferredDelete();
-
+   }
 }
 
 u1Array* Token::ComputeCryptogram(u1Array* challenge,u1Array* pin)
@@ -1521,18 +1581,18 @@
 
    // Get the card mode (1=PIN, 2=FingerPrint, 3=PIN or FP, 4=PIN and FP)
    // The default mode is PIN
-   BYTE bCardMode = UVM_PIN_ONLY;
-   BYTE bTypePIN = PIN_TYPE_REGULAR;
-   getCardConfiguration( bCardMode, bTypePIN );
-   Log::log( "Token::AuthenticateUser - PIN type <%ld> (0 = regular ; 1 = external)", bTypePIN );
-   Log::log( "Token::AuthenticateUser - Card mode <%ld> (1 = pin only ; 2 = fp only ; 3 = fp or pin ; 4 = fp and pin)", bCardMode );
+   //BYTE bCardMode = UVM_PIN_ONLY;
+   //BYTE bTypePIN = PIN_TYPE_REGULAR;
+   //getCardConfiguration( bCardMode, bTypePIN );
+   Log::log( "Token::AuthenticateUser - PIN type <%ld> (0 = regular ; 1 = external)", m_bTypePIN );
+   Log::log( "Token::AuthenticateUser - Card mode <%ld> (1 = pin only ; 2 = fp only ; 3 = fp or pin ; 4 = fp and pin)", m_bCardMode );
    Log::log( "Token::AuthenticateUser - PIN len <%ld>", bPinLen );
 
-   if( PIN_TYPE_EXTERNAL == bTypePIN )
+   if( PIN_TYPE_EXTERNAL == m_bTypePIN )
    {
-      if( UVM_PIN_ONLY == bCardMode )
+      if( UVM_PIN_ONLY == m_bCardMode )
       {
-         if( true == m_isPinPadSupported )
+         if( true == m_bIsPinPadSupported )
          {
             if( 0 == bPinLen )
             {
@@ -1559,7 +1619,7 @@
    }
    else
    {
-      if( ( 0 != bPinLen ) && ( ( UVM_PIN_ONLY == bCardMode ) || ( UVM_PIN_OR_FP == bCardMode ) ) )
+      if( ( 0 != bPinLen ) && ( ( UVM_PIN_ONLY == m_bCardMode ) || ( UVM_PIN_OR_FP == m_bCardMode ) ) )
       {
          Log::log( "Token::AuthenticateUser - Regular PIN && (UVM1 || UVM3)  && valid len -> PIN normal" );
          bRet = AUTHENTICATE_REGULAR;
@@ -1651,14 +1711,24 @@
 CK_RV Token::Logout()
 {
    CK_RV rv = CKR_OK;
+   
+   if(   ( true == m_bIsNoPinSupported ) 
+      || ( ( true == m_bIsSSO ) && ( true == this->isAuthenticated( ) ) )
+      )
+   {
+      this->_roleLogged = CKU_NONE;
+      return rv;
+   }
+
    TOKEN_TRY
    {
-
       if(this->_roleLogged == CKU_NONE)
       {
          throw CkError(CKR_USER_NOT_LOGGED_IN);
       }
 
+      this->_roleLogged = CKU_NONE;
+
       u1 role = (this->_roleLogged == CKU_USER) ? CARD_ROLE_USER : CARD_ROLE_ADMIN;
 
       try
@@ -1667,7 +1737,7 @@
          if( CARD_ROLE_USER == role )
          {
             // We log out if the SSO mode is not activated
-            if( false == isSSO( ) )
+            if( false == m_bIsSSO )
             {
                this->_mscm->LogOut( role );
             }
@@ -1679,7 +1749,7 @@
             this->_mscm->LogOut( role );
          }
 
-         this->_roleLogged = CKU_NONE;
+         //this->_roleLogged = CKU_NONE;
       }
       catch(Marshaller::RemotingException&)
       {
@@ -1831,21 +1901,33 @@
    // serial number
    u1Array* serialNum = Util::ReadByteArrayFromVector(from,&idx);
    memcpy(this->_tokenInfo.serialNumber,serialNum->GetBuffer(),serialNum->GetLength());
-   delete serialNum;
 
    // Check MSCM's serial number. If this is larger than 8 bytes, do not
    // use stored value since serial number may already have been truncated
    // if the card was P11 enabled prior to this fix in revision 548361.
-   auto_ptr<u1Array> serialNumber(_mscm->get_SerialNumber());
-   if(serialNumber->GetLength() > 8)
+
+   //Log::log( "Token::DeserializeTokenInfo - get serial numner" );
+   //u1Array* serialNumber = NULL;
+   //serialNumber = _mscm->GetCardProperty( CARD_SERIAL_NUMBER, 0 );
+   ////auto_ptr<u1Array> serialNumber(_mscm->get_SerialNumber());
+
+   //if(m_u1aSerialNumber->GetLength() > 8)
+   if(serialNum->GetLength() > 8)
    {
       CMD5 md5;
       CK_BYTE hash[16];
-      md5.HashCore(serialNumber->GetBuffer(), 0, serialNumber->GetLength());
+      md5.HashCore(serialNum->GetBuffer(), 0, serialNum->GetLength());
       md5.HashFinal(hash);
       Util::ConvAscii(hash, 8, _tokenInfo.serialNumber);
    }
 
+   delete serialNum;
+   
+   //if( NULL != serialNumber )
+   //{
+   //   delete serialNumber;
+   //}
+
    // flags
    CK_FLAGS flags;
 
@@ -1911,18 +1993,39 @@
 
    // If serial number length is too big to fit in 16 (hex) digit field,
    // then use the 8 first bytes of MD5 hash of the original serial number.
-   auto_ptr<u1Array> serialNumber(_mscm->get_SerialNumber());
-   if(serialNumber->GetLength() > 8)
+   Log::log( "Token::PopulateDefaultTokenInfo - get serial numner" );
+   u1Array* u1aSerialNumber = 0;
+   // Try first to load the serial number in a V2+ way
+   try
    {
+      u1aSerialNumber = _mscm->GetCardProperty( CARD_SERIAL_NUMBER, 0 );
+   }
+   catch( ... )
+   {
+      u1aSerialNumber = 0;
+   }
+   // Try at last to get the serial number in a old V2 way
+   if( 0 == u1aSerialNumber )
+   {
+      u1aSerialNumber = _mscm->get_SerialNumber( );
+   }
+
+   //auto_ptr<u1Array> serialNumber(_mscm->get_SerialNumber());
+   if(u1aSerialNumber->GetLength() > 8)
+   {
       CMD5 md5;
       CK_BYTE hash[16];
-      md5.HashCore(serialNumber->GetBuffer(), 0, serialNumber->GetLength());
+      md5.HashCore(u1aSerialNumber->GetBuffer(), 0, u1aSerialNumber->GetLength());
       md5.HashFinal(hash);
       Util::ConvAscii(hash, 8, _tokenInfo.serialNumber);
    }
    else
-      Util::ConvAscii(serialNumber->GetBuffer(),serialNumber->GetLength(),this->_tokenInfo.serialNumber);
+      Util::ConvAscii(u1aSerialNumber->GetBuffer(),u1aSerialNumber->GetLength(),this->_tokenInfo.serialNumber);
 
+   if( NULL != u1aSerialNumber )
+   {
+      delete u1aSerialNumber;
+   }
 }
 
 CK_RV Token::GenerateRandom(CK_BYTE_PTR randomData,CK_ULONG len)
@@ -1978,11 +2081,23 @@
             continue;
          }
 
-         if((this->_objects[i]->_private == CK_TRUE) &&
-            (this->_roleLogged != CKU_USER))
+         if( this->_objects[ i ]->_private == CK_TRUE )
          {
-            continue;
+            if( false == m_bIsNoPinSupported )
+            {
+               if(   ( CKU_USER != _roleLogged )
+                  && ( ( true == m_bIsSSO ) && ( false == isAuthenticated( ) ) )
+                  )
+               {
+                  continue;
+               }
+            }
          }
+         //if((this->_objects[i]->_private == CK_TRUE) &&
+         //   (this->_roleLogged != CKU_USER))
+         //{
+         //   continue;
+         //}
 
          if(session->_searchTempl == NULL_PTR){
             phObject[idx++] = CO_TOKEN_OBJECT | (i+1);
@@ -2165,10 +2280,6 @@
    CK_RV rv = CKR_OK;
    TOKEN_TRY
    {
-      // from the class field we will be able to determine proper type
-      // and hence the corresponding file
-      //CheckAvailableSpace( );
-
       CK_RV rv = WriteObject(stobj.get());
       if(rv == CKR_OK)
       {
@@ -2177,6 +2288,7 @@
       }
    }
    TOKEN_CATCH(rv)
+   //ManageGC( true );
       return rv;
 }
 
@@ -2276,24 +2388,6 @@
 
       auto_ptr<u1Array> keyValue;
 
-      //
-      /*
-      if( object->_modulus->GetLength( ) != object->_d->GetLength( ) )
-      {
-      }
-      if( ( object->_modulus->GetLength( ) / 2 ) != object->_p->GetLength( ) )
-      {
-      }
-      if( ( object->_modulus->GetLength( ) / 2 ) != object->_q->GetLength( ) )
-      {
-      }
-      if( ( object->_modulus->GetLength( ) / 2 ) != object->_dp->GetLength( ) )
-      {
-      }
-      if( ( object->_modulus->GetLength( ) / 2 ) != object->_dq->GetLength( ) )
-      {
-      }
-      */
       if( ( object->_modulus->GetLength( ) / 2 ) != object->_inverseQ->GetLength( ) )
       {
          // Pad with zeros in the front since big endian
@@ -2302,27 +2396,6 @@
          size_t i = val.GetLength( )- object->_inverseQ->GetLength( );
          memcpy( val.GetBuffer( ) + i, object->_inverseQ->GetBuffer(), object->_inverseQ->GetLength( ) );
          *(object->_inverseQ) = val;
-         /*
-         // Create a new buffer with the a correct size
-         u1Array val( (s4)( object->_modulus->GetLength( ) / 2 ) );
-         //auto_ptr<u1Array> val = auto_ptr<u1Array>(new u1Array(keyLength));
-
-         // Fill the buffer with zero
-         for( size_t i = 0; i < val.GetLength( ) ; i++ )
-         {
-         val.SetU1At( i, 0 );
-         }
-
-         // Fill the buffer with the old value
-         u4 j = 0;
-         for( size_t i = ( val.GetLength( )- object->_inverseQ->GetLength( ) ) ; i < object->_inverseQ->GetLength( ) ; i++ )
-         {
-         val.SetU1At( i, object->_inverseQ->ReadU1At( j ) );
-         j++;
-         }
-
-         object->_inverseQ = &val;
-         */
       }
 
       // compute the total length;
@@ -2413,7 +2486,7 @@
       {
          try
          {
-            ManageGC( );
+            //ManageGC( );
             ntry++;
             this->_mscm->CreateCAPIContainer(ctrIdx,CK_TRUE,object->_keySpec,(modulusLen*8),keyValue.get());
             break;
@@ -2476,6 +2549,7 @@
       }
    }
    TOKEN_CATCH( rv )
+   //ManageGC( true );
 
       return rv;
 }
@@ -2769,6 +2843,8 @@
       }
    }
    TOKEN_CATCH(rv)
+   
+      //ManageGC( true );
       return rv;
 }
 
@@ -2780,9 +2856,21 @@
       StorageObject * obj = GetObject(hObject);
 
       // some more checks
-      if((this->_roleLogged != CKU_USER) && (obj->_private == CK_TRUE)){
-         throw CkError(CKR_USER_NOT_LOGGED_IN);
+      if( CK_TRUE == obj->_private )
+      {
+         if( false == m_bIsNoPinSupported )
+         {
+            if(   ( CKU_USER != _roleLogged )
+               && ( ( true == m_bIsSSO ) && ( false == isAuthenticated( ) ) )
+               )
+            {
+               throw CkError(CKR_USER_NOT_LOGGED_IN);
+            }
+         }
       }
+      //if((this->_roleLogged != CKU_USER) && (obj->_private == CK_TRUE)){
+      //   throw CkError(CKR_USER_NOT_LOGGED_IN);
+      //}
 
       if(obj->_class == CKO_CERTIFICATE){
 
@@ -2909,12 +2997,29 @@
 
       StorageObject * obj = GetObject(hObject);
 
-      if((this->_roleLogged != CKU_USER) && (obj->_private == CK_TRUE)){
-         for(u4 i=0;i<ulCount;i++){
-            pTemplate[i].ulValueLen = CK_UNAVAILABLE_INFORMATION; //(CK_LONG)-1;
+      if( CK_TRUE == obj->_private )
+      {
+         if( false == m_bIsNoPinSupported )
+         {
+            if(   ( CKU_USER != _roleLogged )
+               && ( ( true == m_bIsSSO ) && ( false == isAuthenticated( ) ) )
+               )
+            {
+               for(u4 i=0;i<ulCount;i++)
+               {
+                  pTemplate[i].ulValueLen = CK_UNAVAILABLE_INFORMATION; //(CK_LONG)-1;
+               }
+               throw CkError(CKR_USER_NOT_LOGGED_IN);
+            }
          }
-         throw CkError(CKR_USER_NOT_LOGGED_IN);
       }
+      //if((this->_roleLogged != CKU_USER) && (obj->_private == CK_TRUE))
+      //{
+      //   for(u4 i=0;i<ulCount;i++){
+      //      pTemplate[i].ulValueLen = CK_UNAVAILABLE_INFORMATION; //(CK_LONG)-1;
+      //   }
+      //   throw CkError(CKR_USER_NOT_LOGGED_IN);
+      //}
 
       for(u4 i=0;i<ulCount;i++){
          rv = obj->GetAttribute(&pTemplate[i]);
@@ -2938,10 +3043,22 @@
       // ??? pObj == NULL_PTR
 
       // Check if we have a proper session
-      if( ( this->_roleLogged != CKU_USER ) && ( pObj->_private == CK_TRUE ) )
+      if( CK_TRUE == pObj->_private )
       {
-         throw CkError( CKR_USER_NOT_LOGGED_IN );
+         if( false == m_bIsNoPinSupported )
+         {
+            if(   ( CKU_USER != _roleLogged )
+               && ( ( true == m_bIsSSO ) && ( false == isAuthenticated( ) ) )
+               )
+            {
+               throw CkError(CKR_USER_NOT_LOGGED_IN);
+            }
+         }
       }
+      // if( ( this->_roleLogged != CKU_USER ) && ( pObj->_private == CK_TRUE ) )
+      //{
+      //   throw CkError( CKR_USER_NOT_LOGGED_IN );
+      //}
 
       if( pObj->_modifiable == CK_FALSE )
       {
@@ -3014,14 +3131,6 @@
 
          if( CKR_OK != arv )
          {
-            /*try
-            {
-            _mscm->DeleteFile(&obj->_fileName);
-            }
-            catch( ... )
-            {
-            }*/
-
             if(fCreate)   // Restore state of object prior to update attempt.
             {
                pObj->_fileName.clear();
@@ -3279,9 +3388,9 @@
       {
          try
          {
-            ManageGC( );
             ntry++;
             this->_mscm->CreateCAPIContainer(ctrIdx,CK_FALSE,KEYSPEC_KEYEXCHANGE,rsaPubObject->_modulusLen,NULL_PTR);
+            //ManageGC( );
             break;
          }
          catch( Marshaller::Exception & x )
@@ -3382,7 +3491,8 @@
       }
    }
    TOKEN_CATCH(rv)
-
+   //printf( "\nToken::GenerateKeyPair - ManageGC( true )\n" );
+      ManageGC( true );
       return rv;
 }
 
@@ -3501,9 +3611,9 @@
       {
          try
          {
-            ManageGC( );
             ntry++;
             data = this->_mscm->PrivateKeyDecrypt( rsaKey->_ctrIndex, rsaKey->_keySpec, dataToDecrypt );
+            //ManageGC( );
             break;
          }
          catch( Marshaller::Exception & x )
@@ -3804,9 +3914,9 @@
       {
          try
          {
-            ManageGC( );
             ntry++;
             signatureData = this->_mscm->PrivateKeyDecrypt(rsaKey->_ctrIndex, rsaKey->_keySpec, messageToSign);
+            //ManageGC( );
             break;
          }
          catch( Marshaller::Exception & x )
@@ -3925,7 +4035,7 @@
 bool Token::PerformDeferredDelete()
 {
    bool fSync = true;
-   PKCS11_ASSERT(this->_roleLogged != CKU_NONE);
+   //PKCS11_ASSERT(this->_roleLogged != CKU_NONE);
 
    if(_toDelete.empty())
       return fSync;
@@ -4048,7 +4158,10 @@
    bool bRet = false;
    try
    {
-      bRet = (bool)(_mscm->IsAuthenticated( CARD_ROLE_USER ));
+      if( NULL != _mscm )
+      {
+         bRet = (bool)(_mscm->IsAuthenticated( CARD_ROLE_USER ));
+      }
    }
    catch( ... )
    {
@@ -4061,18 +4174,45 @@
 
 /*
 */
+bool Token::isNoPinSupported( void )
+{
+   return m_bIsNoPinSupported;
+/*
+bool bIsNoPinSupported = false;
+
+   u1Array* pinProperties = new u1Array( 0 );
+   try
+   {
+      pinProperties = _mscm->GetCardProperty( CARD_PROPERTY_PIN_INFO, CARD_ROLE_USER );
+
+      if( CARD_PROPERTY_NO_PIN == pinProperties->GetBuffer( )[ 0 ] )
+      {
+         bIsNoPinSupported = true;
+      }
+   }
+   catch( ... )
+   {
+   }
+
+   delete pinProperties;
+
+   return bIsNoPinSupported;
+*/
+}
+
+
+/*
+*/
 bool Token::isSSO( void )
 {
    bool bRet = false;
    u1Array* ba = 0;
    try
    {
-      ba = _mscm->GetCardProperty( 0x80, 0 );
+      ba = _mscm->GetCardProperty( CARD_PROPERTY_PIN_POLICY, 0 );
    }
    catch( ... )
    {
-      //Log::error( "Token::isSSO",  "GetCardProperty" );
-      Log::log( "Token::isSSO - GetCardProperty failed !" );
       bRet = false;
    }
    if( 0 != ba )
@@ -4123,6 +4263,8 @@
 */
 void Token::CardBeginTransaction( )
 {
+#ifndef _XCL_
+
    //Log::begin( "Token::CardBeginTransaction" );
 
    //Log::log( "Token::CardBeginTransaction - _mscm->GetPcscCardHandle..." );
@@ -4167,11 +4309,14 @@
    }
 
    //Log::end( "Token::CardBeginTransaction" );
+#endif
 }
 
 
 void Token::CardEndTransaction()
 {
+#ifndef _XCL_
+
    //Log::begin( "Token::CardEndTransaction" );
 
    SCARDHANDLE hCard = _mscm->GetPcscCardHandle( );//_mscm->GetSCardHandle();
@@ -4197,6 +4342,7 @@
       throw PcscError(hResult);
 
    //Log::end( "Token::CardEndTransaction" );
+#endif
 }
 
 StorageObject * Token::GetObject(CK_OBJECT_HANDLE hObject)
@@ -4305,31 +4451,31 @@
 }
 
 
-/*
-*/
-bool Token::isPinExternalSupported( void )
-{
-   bool bIsPinExternalSupported = false;
+///*
+//*/
+//bool Token::isPinExternalSupported( void )
+//{
+//   bool bIsPinExternalSupported = false;
+//
+//   u1Array* pinProperties = new u1Array( 0 );
+//   try
+//   {
+//      pinProperties = _mscm->GetardProperty( CARD_PROPERTY_PIN_INFO, CARD_ROLE_USER );
+//
+//      if( CARD_PROPERTY_EXTERNAL_PIN == pinProperties->GetBuffer( )[ 0 ] )
+//      {
+//         bIsPinExternalSupported = true;
+//      }
+//   }
+//   catch( ... )
+//   {
+//   }
+//
+//   delete pinProperties;
+//
+//   return bIsPinExternalSupported;
+//}
 
-   u1Array* pinProperties = new u1Array( 0 );
-   try
-   {
-      pinProperties = _mscm->GetCardProperty( CARD_PROPERTY_PIN_INFO, CARD_ROLE_USER );
-
-      if( CARD_PROPERTY_EXTERNAL_PIN == pinProperties->GetBuffer( )[ 0 ] )
-      {
-         bIsPinExternalSupported = true;
-      }
-   }
-   catch( ... )
-   {
-   }
-
-   delete pinProperties;
-
-   return bIsPinExternalSupported;
-}
-
 /*
 */
 CK_RV Token::verifyPinWithPinPad( void )
@@ -4421,10 +4567,6 @@
    CK_RV rv = CKR_FUNCTION_FAILED;
    if( ( 0x90 == outBuffer[ 0 ] ) && ( 0x00 == outBuffer[ 1 ] ) )
    {
-      //this->_tokenInfo.flags &= ~CKF_USER_PIN_LOCKED;
-      //this->_tokenInfo.flags &= ~CKF_USER_PIN_FINAL_TRY;
-      //this->_tokenInfo.flags &= ~CKF_USER_PIN_COUNT_LOW;
-      //this->_roleLogged = CKU_USER;
       rv = CKR_OK;
    }
    else if( ( 0x63 == outBuffer[ 0 ] ) && ( 0x00 == outBuffer[ 1 ] ) )
@@ -4651,10 +4793,10 @@
          ( ( ba->GetBuffer( )[ 14 ] ) << 16 ) +
          ( ( ba->GetBuffer( )[ 15 ] ) << 24 )
          );
-      Log::log( "Token::getCardMode - dwFlagsEx <%#08x>", dwFlagsEx );
+      //Log::log( "Token::getCardMode - dwFlagsEx <%#08x>", dwFlagsEx );
 
       WORD wActiveMode = (WORD)( ba->GetBuffer( )[ 12 ] + ( ( ba->GetBuffer( )[ 13 ] ) << 8 ) );
-      Log::log( "Token::getCardMode - Active mode <%ld>", wActiveMode );
+      //Log::log( "Token::getCardMode - Active mode <%ld>", wActiveMode );
 
       a_bMode = (BYTE)wActiveMode;
 

Modified: trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/sctoken.h
===================================================================
--- trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/sctoken.h	2010-02-04 14:54:20 UTC (rev 112)
+++ trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/sctoken.h	2010-02-08 09:41:15 UTC (rev 113)
@@ -125,13 +125,19 @@
     bool                    _fPinChanged;
     bool                    _fContainerChanged;
     bool                    _fFileChanged;
+   
+    BYTE m_bCardMode;
+    BYTE m_bTypePIN;
+    //u1Array* m_u1aSerialNumber;
 
 public:
     CK_BBOOL                _version;
     CK_TOKEN_INFO           _tokenInfo;
     CK_ULONG                _roleLogged;
     //bool m_isPinExternal;
-    bool m_isPinPadSupported;
+    bool m_bIsPinPadSupported;
+    bool m_bIsSSO;
+    bool m_bIsNoPinSupported;
 
 public:
     Token(std::string* reader);
@@ -144,7 +150,7 @@
     void EndTransaction();
     void CardBeginTransaction();
     void CardEndTransaction();
-    void ManageGC();
+    void ManageGC( bool bForceGarbage = false );
 
     CK_RV Login(CK_ULONG userType,u1Array* pin);
     CK_RV Logout();
@@ -175,13 +181,14 @@
 
     bool isAuthenticated( void );
     bool isSSO( void );
+    bool isNoPinSupported( void );
 
 private:
 
    void getCardConfiguration( BYTE& a_bMode, BYTE &a_bTypePIN );
    BYTE howToAuthenticate( BYTE bPinLen );
    bool isPinPadSupported( void );
-   bool isPinExternalSupported( void );
+   //bool isPinExternalSupported( void );
    CK_RV verifyPinWithPinPad( void );
    CK_RV verifyPinWithBio( void /*Marshaller::u1Array *pin*/ );
    DWORD m_dwIoctlVerifyPIN;

Modified: trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/secretkeyobject.h
===================================================================
--- trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/secretkeyobject.h	2010-02-04 14:54:20 UTC (rev 112)
+++ trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/secretkeyobject.h	2010-02-08 09:41:15 UTC (rev 113)
@@ -46,7 +46,7 @@
 
 public:
     SecretKeyObject();
-    ~SecretKeyObject();
+    virtual ~SecretKeyObject();
 
     CK_BBOOL Compare(CK_ATTRIBUTE attribute);
     CK_RV SetAttribute(CK_ATTRIBUTE attribute,CK_BBOOL objCreation);

Modified: trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/session.cpp
===================================================================
--- trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/session.cpp	2010-02-04 14:54:20 UTC (rev 112)
+++ trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/session.cpp	2010-02-08 09:41:15 UTC (rev 113)
@@ -58,14 +58,27 @@
     _objects.clear();
     _sessionObjectsReturnedInSearch.clear();
     _tokenObjectsReturnedInSearch.clear();
+
+    if( TRUE == this->_isReadWrite )
+    {
+      this->_state = CKS_RW_PUBLIC_SESSION;
+    }
+    else
+    {
+      this->_state = CKS_RO_PUBLIC_SESSION;
+    }
 }
 
 Session::~Session(){
 
-    for(size_t i = 0; i < _objects.size(); i++){
-        delete _objects[i];
-        _objects[i] = NULL_PTR;
-    }
+   for(size_t i = 0; i < _objects.size(); i++)
+   {
+      if( NULL_PTR != _objects[i] )
+      {
+         delete _objects[i];
+      }
+      _objects[i] = NULL_PTR;
+   }
 
     if(this->_digest != NULL_PTR){
         delete this->_digest;
@@ -202,11 +215,23 @@
             continue;
         }
 
-        if((this->_objects[i]->_private == CK_TRUE) &&
-            (this->_slot->_token->_roleLogged != CKU_USER))
-        {
-            continue;
-        }
+         if( CK_TRUE == this->_objects[i]->_private )
+         {
+            if( false == _slot->_token->m_bIsNoPinSupported )
+            {
+               if(   ( CKU_USER != _slot->_token->_roleLogged )
+                  && ( ( true == _slot->_token->m_bIsSSO ) && ( false == _slot->_token->isAuthenticated( ) ) )
+                  )
+               {
+                  continue;
+               }
+            }
+         }
+        //if((this->_objects[i]->_private == CK_TRUE) &&
+        //    (this->_slot->_token->_roleLogged != CKU_USER))
+        //{
+        //    continue;
+        //}
 
         if(this->_searchTempl == NULL_PTR){
             phObject[idx++] = MakeObjectHandle(i+1);
@@ -292,9 +317,21 @@
             return CKR_SESSION_READ_ONLY;
     }
 
-    if ((this->_slot->_token->_roleLogged != CKU_USER) && (obj->_private == CK_TRUE)){
-        return CKR_USER_NOT_LOGGED_IN;
-    }
+   if( CK_TRUE == obj->_private )
+   {
+      if( false == _slot->_token->m_bIsNoPinSupported )
+      {
+         if(   ( CKU_USER != _slot->_token->_roleLogged )
+            && ( ( true == _slot->_token->m_bIsSSO ) && ( false == _slot->_token->isAuthenticated( ) ) )
+            )
+         {
+            return CKR_USER_NOT_LOGGED_IN;
+         }
+      }
+   }
+    //if ((this->_slot->_token->_roleLogged != CKU_USER) && (obj->_private == CK_TRUE)){
+    //    return CKR_USER_NOT_LOGGED_IN;
+    //}
 
     delete obj;
 
@@ -319,12 +356,29 @@
 
     StorageObject* obj = this->_objects[idx-1];
 
-    if((this->_slot->_token->_roleLogged != CKU_USER) && (obj->_private == CK_TRUE)){
-        for(u4 i=0;i<ulCount;i++){
-            pTemplate[i].ulValueLen = (CK_ULONG)-1;
-        }
-        return CKR_USER_NOT_LOGGED_IN;
-    }
+   if( CK_TRUE == obj->_private )
+   {
+      if( false == _slot->_token->m_bIsNoPinSupported )
+      {
+         if(   ( CKU_USER != _slot->_token->_roleLogged )
+            && ( ( true == _slot->_token->m_bIsSSO ) && ( false == _slot->_token->isAuthenticated( ) ) )
+            )
+         {
+            for(u4 i=0;i<ulCount;i++)
+            {
+               pTemplate[i].ulValueLen = (CK_ULONG)-1;
+            }
+            return CKR_USER_NOT_LOGGED_IN;
+         }
+      }
+   }
+   //if((this->_slot->_token->_roleLogged != CKU_USER) && (obj->_private == CK_TRUE))
+   // {
+   //     for(u4 i=0;i<ulCount;i++){
+   //         pTemplate[i].ulValueLen = (CK_ULONG)-1;
+   //     }
+   //     return CKR_USER_NOT_LOGGED_IN;
+   // }
 
     for(u4 i=0;i<ulCount;i++){
         rv = obj->GetAttribute(&pTemplate[i]);
@@ -352,9 +406,21 @@
 
     StorageObject* obj = this->_objects[idx-1];
 
-    if ((this->_slot->_token->_roleLogged != CKU_USER) && (obj->_private == CK_TRUE)){
-        return CKR_USER_NOT_LOGGED_IN;
-    }
+   if( CK_TRUE == obj->_private )
+   {
+      if( false == _slot->_token->m_bIsNoPinSupported )
+      {
+         if(   ( CKU_USER != _slot->_token->_roleLogged )
+            && ( ( true == _slot->_token->m_bIsSSO ) && ( false == _slot->_token->isAuthenticated( ) ) )
+            )
+         {
+            return CKR_USER_NOT_LOGGED_IN;
+         }
+      }
+   }
+    //if ((this->_slot->_token->_roleLogged != CKU_USER) && (obj->_private == CK_TRUE)){
+    //    return CKR_USER_NOT_LOGGED_IN;
+    //}
 
     for(u4 i=0;i<ulCount;i++){
         rv = obj->SetAttribute(pTemplate[i],CK_FALSE);

Modified: trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/slot.cpp
===================================================================
--- trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/slot.cpp	2010-02-04 14:54:20 UTC (rev 112)
+++ trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/slot.cpp	2010-02-08 09:41:15 UTC (rev 113)
@@ -175,7 +175,9 @@
 
 }
 
-Slot::~Slot(){
+Slot::~Slot( )
+{
+   Log::begin( "Slot::~Slot" );
 
    if(this->_token != NULL_PTR)
    {
@@ -206,6 +208,8 @@
          this->_sessions[i] = NULL_PTR;
       }
    }
+
+   Log::end( "Slot::~Slot" );
 }
 
 
@@ -322,43 +326,51 @@
    }
 
    //Log::log( "Slot::GetTokenInfo - BuildToken..." );
+   //printf( "\n Slot::GetTokenInfo - BuildToken \n" );
    CK_RV rv = this->BuildToken( );
    //Log::log( "Slot::GetTokenInfo - BuildToken <%#02x>", rv );
    if( CKR_OK == rv )
    {
-      Transaction trans(this);
+      //Transaction trans( this );
 
+      Log::log( "Slot::GetTokenInfo - 1" );
+
       CK_BYTE idx;
 
       pInfo->firmwareVersion.major = this->_token->_tokenInfo.firmwareVersion.major;
       pInfo->firmwareVersion.minor = this->_token->_tokenInfo.firmwareVersion.minor;
-      pInfo->flags                 = this->_token->_tokenInfo.flags;
       pInfo->hardwareVersion.major = this->_token->_tokenInfo.hardwareVersion.major;
       pInfo->hardwareVersion.minor = this->_token->_tokenInfo.hardwareVersion.minor;
 
+      Log::log( "Slot::GetTokenInfo - 2" );
+
       // label
       for(idx=0;idx<32;idx++)
       {
          pInfo->label[idx] = this->_token->_tokenInfo.label[idx];
       }
+      Log::log( "Slot::GetTokenInfo - 3" );
 
       // manufacturerID
       for(idx=0;idx<32;idx++)
       {
          pInfo->manufacturerID[idx]  = this->_token->_tokenInfo.manufacturerID[idx];
       }
+      Log::log( "Slot::GetTokenInfo - 4" );
 
       // model
       for(idx=0;idx<16;idx++)
       {
          pInfo->model[idx]  = this->_token->_tokenInfo.model[idx];
       }
+      Log::log( "Slot::GetTokenInfo - 5" );
 
       // serial number
       for(idx=0;idx<16;idx++)
       {
          pInfo->serialNumber[idx]  = this->_token->_tokenInfo.serialNumber[idx];
       }
+      Log::log( "Slot::GetTokenInfo - 6" );
 
       pInfo->ulFreePrivateMemory  = this->_token->_tokenInfo.ulFreePrivateMemory;
       pInfo->ulFreePublicMemory   = this->_token->_tokenInfo.ulFreePublicMemory;
@@ -371,36 +383,49 @@
       pInfo->ulTotalPrivateMemory = this->_token->_tokenInfo.ulTotalPrivateMemory;
       pInfo->ulTotalPublicMemory  = this->_token->_tokenInfo.ulTotalPublicMemory;
 
+      Log::log( "Slot::GetTokenInfo - 7" );
+
       for(size_t i=1;i<_sessions.size();i++)
       {
-         if(_sessions[i])
+         if( NULL_PTR != _sessions[ i ] )
          {
             ++pInfo->ulSessionCount;
             if(_sessions[i]->_isReadWrite)
                ++pInfo->ulRwSessionCount;
          }
       }
+      Log::log( "Slot::GetTokenInfo - 8" );
 
       // utcTime
       for(idx=0;idx<16;idx++)
       {
          pInfo->utcTime[idx]  = this->_token->_tokenInfo.utcTime[idx];
       }
+      Log::log( "Slot::GetTokenInfo - 9" );
 
+      bool bIsAuthenticated = this->_token->isAuthenticated( );
+      Log::log( "Slot::GetTokenInfo - IsNoPinSupported <%d>", this->_token->m_bIsNoPinSupported );
+      Log::log( "Slot::GetTokenInfo - IsSSO <%d>", this->_token->m_bIsSSO );
+      Log::log( "Slot::GetTokenInfo - IsAuthenticated <%d>", bIsAuthenticated );
+
       // Check if the smart card is in SSO mode
-      if( ( true == this->_token->isSSO( ) ) && ( true == this->_token->isAuthenticated( ) ) )
+      if(   ( true == this->_token->m_bIsNoPinSupported ) 
+         || ( ( true == this->_token->m_bIsSSO ) && ( true == bIsAuthenticated ) )
+         )
       {
          this->_token->_tokenInfo.flags &= ~CKF_LOGIN_REQUIRED;
+         Log::log( "Slot::GetTokenInfo - No login required" );
       }
       else
       {
          this->_token->_tokenInfo.flags |= CKF_LOGIN_REQUIRED;
+         Log::log( "Slot::GetTokenInfo - Login required" );
       }
-
-      Log::log( "Slot::GetTokenInfo - tokenInfo formated ok" );
+      pInfo->flags = this->_token->_tokenInfo.flags;
+      //Log::log( "Slot::GetTokenInfo - tokenInfo formated ok" );
    }
 
-   Log::logCK_RV( "Slot::GetTokenInfo", rv );
+   //Log::logCK_RV( "Slot::GetTokenInfo", rv );
    Log::end( "Slot::GetTokenInfo" );
 
    return rv;
@@ -489,6 +514,7 @@
       }
    }
 
+   //printf( "\n Slot::InitToken - BuildToken \n" );
    rv = this->BuildToken();
 
    if(rv != CKR_OK){
@@ -528,6 +554,7 @@
       return CKR_SESSION_PARALLEL_NOT_SUPPORTED;
    }
 
+   //printf( "\n Slot::OpenSession - BuildToken \n" );
    CK_RV rv = this->BuildToken( );
    if( rv != CKR_OK )
    {
@@ -557,12 +584,23 @@
    session->SetId(sessionId);
    session->SetSlot(this);
 
-   // Refresh the state of the session if the SSO mode is enabled
-   UpdateAuthenticationState( );
-
-   // prepare a unique session id
+    // prepare a unique session id
    *phSession = MAKE_SESSIONHANDLE(sessionId,this->_slotId);
 
+   // Refresh the state of the session if the SSO mode is enabled or No pin is required
+   //UpdateAuthenticationState( );
+   if(   ( CKU_USER == this->_token->_roleLogged )
+      || ( true == this->_token->m_bIsNoPinSupported ) 
+      || ( ( true == this->_token->m_bIsSSO ) && ( true == this->_token->isAuthenticated( ) ) )
+      )
+   {
+      UpdateSessionState( CKU_USER );
+   }
+   else if( CKU_SO == this->_token->_roleLogged )
+   {
+      UpdateSessionState( CKU_SO );
+   }
+
    return rv;
 }
 
@@ -576,15 +614,6 @@
    CK_RV rv = GetSlotAndSessionIdFromSessionHandle( hSession, &pSlot, &hSessionId );
    checkConnection( pSlot );
 
-   //CK_SESSION_HANDLE hSessionId = CK_INVALID_HANDLE;
-   //Slot* pSlot = NULL_PTR;
-   //GetSlotAndSessionIdFromSessionHandle( hSession, &pSlot, &hSessionId );
-   //checkConnection( pSlot );
-
-   //hSessionId = CK_INVALID_HANDLE;
-   //pSlot = NULL_PTR;
-   //CK_RV rv = GetSlotAndSessionIdFromSessionHandle( hSession, &pSlot, &hSessionId );
-
    if( CKR_OK == rv )
    {
       CHECK_IF_NULL_SESSION( pSlot, hSessionId );
@@ -593,47 +622,46 @@
       pSlot->RemoveSession( hSessionId );
 
       // Refresh the state of the session if the SSO mode is enabled
-      pSlot->UpdateAuthenticationState( );
+      //pSlot->UpdateAuthenticationState( );
    }
 
    return rv;
 }
 
 
-/*
-Check first if the card is in SSO mode then update the state of all sessions
-*/
-void Slot::UpdateAuthenticationState( void )
-{
-   // Check if the smart card is in SSO mode
-   if( true == _token->isSSO( ) )
-   {
-      // Affect the role to the token if the user is authenticated
-      _token->_roleLogged = CKU_NONE;
-      if( true == _token->isAuthenticated( ) )
-      {
-         _token->_roleLogged = CKU_USER;
-      }
+///*
+//Check first if the card is in SSO mode then update the state of all sessions
+//*/
+//void Slot::UpdateAuthenticationState( void )
+//{
+//   if(   ( true == this->_token->_roleLogged )
+//      || ( true == this->_token->m_bIsNoPinSupported ) 
+//      || ( ( true == this->_token->m_bIsSSO ) && ( true == this->_token->isAuthenticated( ) ) )
+//      )
+//   {
+//      UpdateSessionState( CKU_USER );
+//   }
+//}
 
-      // Update the state of all sessions
-      UpdateSessionState( );
-   }
-}
 
-
 /*
 */
 CK_RV Slot::CloseAllSessions(void)
 {
+   //if( NULL != this->_token )
+   //{
+   //   this->_token->ManageGC( true );
+   //}
+
    // remove all sessions
    for( size_t i = 1 ; i < _sessions.size( ) ; i++ )
    {
       if( NULL_PTR != this->_sessions[ i ] )
       {
          delete this->_sessions[ i ];
+         this->_sessions[ i ] = NULL_PTR;
       }
-
-      this->_sessions[ i ] = NULL_PTR;
+      //this->_sessions[ i ] = NULL_PTR;
    }
 
    _sessions.resize( 1 );
@@ -642,8 +670,10 @@
 
    this->_token->_roleLogged = CKU_NONE;
 
-   // Refresh the state of the session if the SSO mode is enabled
-   UpdateAuthenticationState( );
+   //// Refresh the state of the session if the SSO mode is enabled
+   //UpdateAuthenticationState( );
+   //// Update the state of all sessions
+   //UpdateSessionState( );
 
    return CKR_OK;
 }
@@ -670,13 +700,15 @@
 
    CHECK_IF_NULL_SESSION( pSlot, hSessionId);
 
-   Transaction trans( pSlot );
+   // JCD
+   //Transaction trans( pSlot );
 
    pInfo->slotID = pSlot->_slotId;
    pInfo->ulDeviceError = CKR_OK;
 
+   // JCD
    // Check if the smart card is in SSO mode
-   pSlot->UpdateAuthenticationState( );
+   //pSlot->UpdateAuthenticationState( );
 
    pInfo->flags = ( ( pSlot->_sessions[ hSessionId ]->_isReadWrite ) ? CKF_RW_SESSION : 0 ) | (CKF_SERIAL_SESSION);
    pInfo->state = pSlot->_sessions[ hSessionId ]->_state;
@@ -704,6 +736,16 @@
 
    CHECK_IF_TOKEN_IS_PRESENT( pSlot );
    CHECK_IF_NULL_SESSION( pSlot, hSessionId );
+
+   if( true == pSlot->_token->m_bIsNoPinSupported )
+   {
+      return CKR_OK; //CKR_USER_ALREADY_LOGGED_IN;
+   }
+   if( ( true == pSlot->_token->m_bIsSSO ) && ( true == pSlot->_token->isAuthenticated( ) ) )
+   {
+      return CKR_USER_ALREADY_LOGGED_IN;
+   }
+
    Transaction trans( pSlot );
 
    if(userType == CKU_SO)
@@ -876,6 +918,7 @@
 
    CHECK_IF_TOKEN_IS_PRESENT( pSlot );
    CHECK_IF_NULL_SESSION( pSlot, hSessionId );
+   
    Transaction trans( pSlot );
 
    if((pTemplate == NULL_PTR) && (ulCount != 0))
@@ -907,8 +950,6 @@
 CK_RV  Slot::FindObjects(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE_PTR phObject,
                          CK_ULONG ulMaxObjectCount,CK_ULONG_PTR  pulObjectCount)
 {
-   Log::begin( "Slot::FindObjects" );
-
    CK_SESSION_HANDLE hSessionId = CK_INVALID_HANDLE;
    Slot* pSlot = NULL_PTR;
    CK_RV rv = GetSlotAndSessionIdFromSessionHandle( hSession, &pSlot, &hSessionId );
@@ -920,54 +961,36 @@
 
    if((phObject == NULL_PTR) || (pulObjectCount == NULL_PTR))
    {
-      Log::error( "Slot::FindObjects", "CKR_ARGUMENTS_BAD" );
       return CKR_ARGUMENTS_BAD;
    }
 
-   Log::log( "Slot::FindObjects - CHECK_IF_TOKEN_IS_PRESENT" );
    CHECK_IF_TOKEN_IS_PRESENT( pSlot );
-   Log::log( "Slot::FindObjects - CHECK_IF_TOKEN_IS_PRESENT" );
-
-   Log::log( "Slot::FindObjects - CHECK_IF_NULL_SESSION" );
    CHECK_IF_NULL_SESSION( pSlot, hSessionId );
-   Log::log( "Slot::FindObjects - CHECK_IF_NULL_SESSION" );
 
    // Not needed here...
-   Log::log( "Slot::FindObjects - Transaction" );
-   Transaction trans( pSlot );
-   Log::log( "Slot::FindObjects - Transaction" );
+   // JCD 1
+   //Transaction trans( pSlot );
 
-   Log::log( "Slot::FindObjects - session" );
    Session* session = pSlot->_sessions[ hSessionId ];
-   Log::log( "Slot::FindObjects - session" );
 
    // check if search is active for this session or not
-   Log::log( "Slot::FindObjects - IsSearchActive" );
    if(session->IsSearchActive() == CK_FALSE)
    {
       return CKR_OPERATION_NOT_INITIALIZED;
    }
-   Log::log( "Slot::FindObjects - IsSearchActive" );
 
    *pulObjectCount = 0;
 
    // find the token objects matching the template
    // count will tell how much of the phObject buffer was written
-   Log::log( "Slot::FindObjects - FindObjects" );
    CK_ULONG count = pSlot->_token->FindObjects( session, phObject, ulMaxObjectCount, pulObjectCount );
-   Log::log( "Slot::FindObjects - FindObjects" );
 
    if(count < ulMaxObjectCount)
    {
       // find the session objects matching the template
-      Log::log( "Slot::FindObjects - (count < ulMaxObjectCount)" );
       count = session->FindObjects(count,phObject,ulMaxObjectCount,pulObjectCount);
-      Log::log( "Slot::FindObjects - (count < ulMaxObjectCount)" );
    }
 
-   Log::logCK_RV( "Slot::FindObjects", rv );
-   Log::end( "Slot::FindObjects" );
-
    return rv;
 }
 
@@ -1134,10 +1157,23 @@
       }
    }
 
-   if ((pSlot->_token->_roleLogged != CKU_USER) && (object->_private == CK_TRUE))
+   if( CK_TRUE == object->_private )
    {
+      if( false == pSlot->_token->m_bIsNoPinSupported )
+      {
+         if(   ( CKU_USER != pSlot->_token->_roleLogged )
+            && ( ( true == pSlot->_token->m_bIsSSO ) && ( false == pSlot->_token->isAuthenticated( ) ) )
+            )
+         {
+            return CKR_USER_NOT_LOGGED_IN;
+         }
+      }
+   }
+   /*if ((pSlot->_token->_roleLogged != CKU_USER) && (object->_private == CK_TRUE))
+   {
       return CKR_USER_NOT_LOGGED_IN;
    }
+   */
 
    if(object->_tokenObject)
    {
@@ -1149,9 +1185,14 @@
       // CardModule service does not allow 'deletion' of any file unless user is logged in. We can create a file
       // when nobody is logged in but we can not delete. In order to be symmetrical we do not also allow
       // the creation.
-      if(pSlot->_token->_roleLogged != CKU_USER)
+      if( false == pSlot->_token->m_bIsNoPinSupported )
       {
-         return CKR_USER_NOT_LOGGED_IN;
+         if(   ( CKU_USER != pSlot->_token->_roleLogged )
+            && ( ( true == pSlot->_token->m_bIsSSO ) && ( false == pSlot->_token->isAuthenticated( ) ) )
+            )
+         {
+            return CKR_USER_NOT_LOGGED_IN;
+         }
       }
 
       // some sanity checks
@@ -1175,6 +1216,9 @@
          object.release();
    }
 
+   //printf( "\nSlot::CreateObject - ManageGC( true )\n" );
+    pSlot->_token->ManageGC( true );
+
    return rv;
 }
 
@@ -1618,9 +1662,19 @@
       return rv;
    }
 
-   if(pSlot->_token->_roleLogged != CKU_USER){
-      return CKR_USER_NOT_LOGGED_IN;
+   if( false == pSlot->_token->m_bIsNoPinSupported )
+   {
+      if(   ( CKU_USER != pSlot->_token->_roleLogged )
+         && ( ( true == pSlot->_token->m_bIsSSO ) && ( false == pSlot->_token->isAuthenticated( ) ) )
+         )
+      {
+         return CKR_USER_NOT_LOGGED_IN;
+      }
    }
+   //if(pSlot->_token->_roleLogged != CKU_USER)
+   //{
+   //   return CKR_USER_NOT_LOGGED_IN;
+   //}
 
    // get the corresponding object
    StorageObject* object = NULL_PTR;
@@ -1948,9 +2002,19 @@
       return rv;
    }
 
-   if(pSlot->_token->_roleLogged != CKU_USER){
-      return CKR_USER_NOT_LOGGED_IN;
+   if( false == pSlot->_token->m_bIsNoPinSupported )
+   {
+      if(   ( CKU_USER != pSlot->_token->_roleLogged )
+         && ( ( true == pSlot->_token->m_bIsSSO ) && ( false == pSlot->_token->isAuthenticated( ) ) )
+         )
+      {
+         return CKR_USER_NOT_LOGGED_IN;
+      }
    }
+   //if(pSlot->_token->_roleLogged != CKU_USER)
+   //{
+   //   return CKR_USER_NOT_LOGGED_IN;
+   //}
 
    // get the corresponding object
    StorageObject* object = NULL_PTR;
@@ -2084,9 +2148,19 @@
       return rv;
    }
 
-   if(pSlot->_token->_roleLogged != CKU_USER){
-      return CKR_USER_NOT_LOGGED_IN;
+   if( false == pSlot->_token->m_bIsNoPinSupported )
+   {
+      if(   ( CKU_USER != pSlot->_token->_roleLogged )
+         && ( ( true == pSlot->_token->m_bIsSSO ) && ( false == pSlot->_token->isAuthenticated( ) ) )
+         )
+      {
+         return CKR_USER_NOT_LOGGED_IN;
+      }
    }
+   //if(pSlot->_token->_roleLogged != CKU_USER)
+   //{
+   //   return CKR_USER_NOT_LOGGED_IN;
+   //}
 
    // get the corresponding object
    StorageObject* object = NULL_PTR;
@@ -2237,9 +2311,19 @@
       return rv;
    }
 
-   if(pSlot->_token->_roleLogged != CKU_USER){
-      return CKR_USER_NOT_LOGGED_IN;
+   if( false == pSlot->_token->m_bIsNoPinSupported )
+   {
+      if(   ( CKU_USER != pSlot->_token->_roleLogged )
+         && ( ( true == pSlot->_token->m_bIsSSO ) && ( false == pSlot->_token->isAuthenticated( ) ) )
+         )
+      {
+         return CKR_USER_NOT_LOGGED_IN;
+      }
    }
+   //if(pSlot->_token->_roleLogged != CKU_USER)
+   //{
+   //   return CKR_USER_NOT_LOGGED_IN;
+   //}
 
    // get the corresponding object
    StorageObject* object = NULL_PTR;
@@ -2519,7 +2603,7 @@
 */
 /*bool*/ void Slot::checkConnection( Slot* a_pSlot )
 {
-   Log::begin( "Slot::checkConnection" );
+   //Log::begin( "Slot::checkConnection" );
 
    //bool bRet = false;
 
@@ -2541,10 +2625,12 @@
          {
             SCARDHANDLE hCard = pMSCM->GetPcscCardHandle( );
             DWORD hResult = SCardStatus( hCard, readers, &dwLen, &dwState, &dwProtocol, &Atr[0], &dwLenAtr );
-            Log::log( "Slot::checkConnection - SCardStatus <%#02x>", hResult );
+            //Log::log( "Slot::checkConnection - SCardStatus <%#02x>", hResult );
+            //printf( "\n Slot::checkConnection - SCardStatus <%#02x> \n", hResult );
             if( ( SCARD_W_RESET_CARD == hResult ) || ( SCARD_W_REMOVED_CARD == hResult ) )
             {
                Log::error( "Slot::checkConnection", "Connection is broken" );
+               //printf( "\n Slot::checkConnection - Connection is broken \n" );
 
                // Close all session
                a_pSlot->CloseAllSessions( );
@@ -2552,6 +2638,8 @@
                // Rebuild the token to restablish the CardModule communication
                delete a_pSlot->_token;
                a_pSlot->_token = NULL_PTR;
+
+               //printf( "\n Slot::checkConnection - BuildToken \n" );
                a_pSlot->BuildToken( );
 
               // bRet = false;
@@ -2560,7 +2648,7 @@
       }
    }
 
-   Log::end( "Slot::checkConnection" );
+   //Log::end( "Slot::checkConnection" );
 
    //return bRet;
 }
@@ -2587,6 +2675,8 @@
 */
 void Slot::RemoveSession( CK_LONG sessionId )
 {
+   //this->_token->ManageGC( true );
+
    delete this->_sessions[ sessionId ];
    this->_sessions[sessionId] = NULL_PTR;
 
@@ -2620,16 +2710,33 @@
    }
 }
 
-void Slot::UpdateSessionState()
+
+/*
+*/
+void Slot::UpdateSessionState( CK_ULONG ulRole )
 {
    // update the state of all sessions
    for(size_t i=1;i<_sessions.size();i++){
       if(this->_sessions[i] != NULL_PTR){
+         this->_sessions[i]->UpdateState( ulRole );
+      }
+   }
+}
+
+
+/*
+*/
+void Slot::UpdateSessionState( )
+{
+   // update the state of all sessions
+   for(size_t i=1;i<_sessions.size();i++){
+      if(this->_sessions[i] != NULL_PTR){
          this->_sessions[i]->UpdateState(this->_token->_roleLogged);
       }
    }
 }
 
+
 CK_BBOOL Slot::HasReadOnlySession()
 {
    for(size_t i=1;i<_sessions.size();i++){
@@ -2689,7 +2796,7 @@
          {
             // we not found a card in this reader
             this->_slotInfo.flags &= ~CKF_TOKEN_PRESENT;
-            Log::log( "Slot::BuildToken - ((readerStates.dwEventState & SCARD_STATE_PRESENT) != SCARD_STATE_PRESENT)" );
+            //Log::log( "Slot::BuildToken - ((readerStates.dwEventState & SCARD_STATE_PRESENT) != SCARD_STATE_PRESENT)" );
             Log::logCK_RV( "Slot::BuildToken", CKR_TOKEN_NOT_PRESENT );
             return CKR_TOKEN_NOT_PRESENT;
          }
@@ -2719,14 +2826,16 @@
       // TBD: Check if token is a .net smart card
 
       // token is present in the slot
-      Log::log( "Slot::BuildToken - new Token..." );
+      //Log::log( "Slot::BuildToken - new Token..." );
       this->_token = new Token( this->_readerName );
-      Log::log( "Slot::BuildToken - new Token ok"  );
+      //Log::log( "Slot::BuildToken - new Token ok"  );
 
-      Log::logCK_RV( "Slot::BuildToken", CKR_OK );
-      Log::end( "Slot::BuildToken" );
+      //Log::logCK_RV( "Slot::BuildToken", CKR_OK );
+      //Log::end( "Slot::BuildToken" );
    }
 
+   Log::end( "Slot::BuildToken" );
+
    return CKR_OK;
 }
 

Modified: trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/slot.h
===================================================================
--- trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/slot.h	2010-02-04 14:54:20 UTC (rev 112)
+++ trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/slot.h	2010-02-08 09:41:15 UTC (rev 113)
@@ -53,8 +53,10 @@
    virtual ~Slot();
 
    void UpdateSessionState();
-   void UpdateAuthenticationState( void );
+   //void UpdateAuthenticationState( void );
+   void UpdateSessionState( CK_ULONG ulRole );
 
+
    static void ClearCache(void);
    static CK_RV GetSlotAndSessionIdFromSessionHandle(CK_SESSION_HANDLE hSession,
       Slot** slot,CK_ULONG_PTR sessionId);
@@ -166,12 +168,10 @@
          SCardCancel(m_hMonitoringContext);
          //printf( "%s - %d - %s - SCardCancel\n", __FILE__, __LINE__, __FUNCTION__);
 
-         /*
-         printf( "%s - %d - %s - SCardReleaseContext -->\n", __FILE__, __LINE__, __FUNCTION__);
-         SCardReleaseContext(m_hMonitoringContext);
-         printf( "%s - %d - %s - SCardReleaseContext <--\n", __FILE__, __LINE__, __FUNCTION__);
-         m_hMonitoringContext = 0;
-         */
+         //printf( "%s - %d - %s - SCardReleaseContext -->\n", __FILE__, __LINE__, __FUNCTION__);
+         //SCardReleaseContext(m_hMonitoringContext);
+         //printf( "%s - %d - %s - SCardReleaseContext <--\n", __FILE__, __LINE__, __FUNCTION__);
+         //m_hMonitoringContext = 0;
       }
 
 #endif // _XCL_

Modified: trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/x509pubkeycertobject.h
===================================================================
--- trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/x509pubkeycertobject.h	2010-02-04 14:54:20 UTC (rev 112)
+++ trunk/SmartCardServices/src/PKCS11dotNetV2/PKCS11Module2/x509pubkeycertobject.h	2010-02-08 09:41:15 UTC (rev 113)
@@ -1,22 +1,22 @@
 /*
- *  PKCS#11 library for .Net smart cards
- *  Copyright (C) 2007-2009 Gemalto <support at gemalto.com>
- *
- *  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
- *
- */
+*  PKCS#11 library for .Net smart cards
+*  Copyright (C) 2007-2009 Gemalto <support at gemalto.com>
+*
+*  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 _include_x509pubkeycertobject_h
 #define _include_x509pubkeycertobject_h
@@ -27,25 +27,25 @@
 {
 
 public:
-    u1Array*    _subject;
-    u1Array*    _id;
-    u1Array*    _issuer;
-    u1Array*    _serialNumber;
-    u1Array*    _value;
-    u1Array*    _url;
-    u1Array*    _hashOfSubjectPubKey;
-    u1Array*    _hashOfIssuerPubKey;
+   u1Array*    _subject;
+   u1Array*    _id;
+   u1Array*    _issuer;
+   u1Array*    _serialNumber;
+   u1Array*    _value;
+   u1Array*    _url;
+   u1Array*    _hashOfSubjectPubKey;
+   u1Array*    _hashOfIssuerPubKey;
 
 public:
-     X509PubKeyCertObject();
-    ~X509PubKeyCertObject();
+   X509PubKeyCertObject();
+   virtual ~X509PubKeyCertObject();
 
-    CK_BBOOL Compare(CK_ATTRIBUTE attribute);
-    CK_RV SetAttribute(CK_ATTRIBUTE attribute,CK_BBOOL objCreation);
-    CK_RV GetAttribute(CK_ATTRIBUTE_PTR attribute);
+   CK_BBOOL Compare(CK_ATTRIBUTE attribute);
+   CK_RV SetAttribute(CK_ATTRIBUTE attribute,CK_BBOOL objCreation);
+   CK_RV GetAttribute(CK_ATTRIBUTE_PTR attribute);
 
-    void Serialize(vector<u1>* to);
-    void Deserialize(vector<u1> from,CK_ULONG_PTR idx);
+   void Serialize(vector<u1>* to);
+   void Deserialize(vector<u1> from,CK_ULONG_PTR idx);
 
 };
 

Modified: trunk/SmartCardServices/src/PKCS11dotNetV2/configure.in
===================================================================
--- trunk/SmartCardServices/src/PKCS11dotNetV2/configure.in	2010-02-04 14:54:20 UTC (rev 112)
+++ trunk/SmartCardServices/src/PKCS11dotNetV2/configure.in	2010-02-08 09:41:15 UTC (rev 113)
@@ -2,7 +2,7 @@
 # Process this file with autoconf to produce a configure script.
 
 AC_PREREQ(2.59)
-AC_INIT(libgtop11dotnet, 2.1.2, hotline at gemalto.com)
+AC_INIT(libgtop11dotnet, 2.1.3, hotline at gemalto.com)
 AM_INIT_AUTOMAKE
 AC_CONFIG_SRCDIR([PKCS11Module2/pkcs11.cpp])
 AC_CHECK_PROG([PKGCONFIG], [pkg-config], [yes])

Modified: trunk/SmartCardServices/src/PKCS11dotNetV2/cppMarshaller/Marshaller.cpp
===================================================================
--- trunk/SmartCardServices/src/PKCS11dotNetV2/cppMarshaller/Marshaller.cpp	2010-02-04 14:54:20 UTC (rev 112)
+++ trunk/SmartCardServices/src/PKCS11dotNetV2/cppMarshaller/Marshaller.cpp	2010-02-08 09:41:15 UTC (rev 113)
@@ -30,17 +30,18 @@
 #include <vld.h>
 #endif
 
+#ifdef __APPLE__
+#include <PCSC/winscard.h>
+#else
+#include <winscard.h>
+#endif
+
 #ifndef WIN32
 #include <strings.h>
 #endif
 #include <stdio.h>
 #include <stdarg.h>
 #include <stdexcept>
-#ifdef __APPLE__
-#include <PCSC/winscard.h>
-#else
-#include <winscard.h>
-#endif
 #include "MarshallerCfg.h"
 #include "Array.h"
 #ifndef _XCL_
@@ -456,7 +457,7 @@
 
 SmartCardMarshaller::SmartCardMarshaller(M_SAL_IN std::string* readerName, u2 portNumber, M_SAL_IN std::string* uri, u4 nameSpaceHivecode, u2 typeHivecode, u4 index)
 {
-   Log::begin( "SmartCardMarshaller::SmartCardMarshaller" );
+   //Log::begin( "SmartCardMarshaller::SmartCardMarshaller" );
 
    this->uri = NULL;
    this->pcsc = NULL;
@@ -473,39 +474,39 @@
    if ((readerName == NULL) || (strncasecmp("selfdiscover", readerName->c_str(),readerName->length()) == 0))
    {
 #endif
-      Log::log( "SmartCardMarshaller::SmartCardMarshaller -  new PCSC( readerName, &portNumber, uri, nameSpaceHivecode, typeHivecode, index) ..." );
+      //Log::log( "SmartCardMarshaller::SmartCardMarshaller -  new PCSC( readerName, &portNumber, uri, nameSpaceHivecode, typeHivecode, index) ..." );
 #ifndef _XCL_
       this->pcsc = new PCSC( readerName, &portNumber, uri, nameSpaceHivecode, typeHivecode, index);
 #else // _XCL
         this->pcsc = new XCLBroker(readerName, &portNumber, uri, nameSpaceHivecode, typeHivecode, index);
 #endif // _XCL_
-      Log::log( "SmartCardMarshaller::SmartCardMarshaller -  new PCSC( readerName, &portNumber, uri, nameSpaceHivecode, typeHivecode, index) ok" );
+      //Log::log( "SmartCardMarshaller::SmartCardMarshaller -  new PCSC( readerName, &portNumber, uri, nameSpaceHivecode, typeHivecode, index) ok" );
    }
    else
    {
-      Log::log( "SmartCardMarshaller::SmartCardMarshaller -  new PCSC( readerName ) ..." );
+      //Log::log( "SmartCardMarshaller::SmartCardMarshaller -  new PCSC( readerName ) ..." );
 #ifndef _XCL_
       this->pcsc = new PCSC( readerName );
 #else // _XCL_
         this->pcsc = new XCLBroker(readerName);
 #endif // _XCL_
-      Log::log( "SmartCardMarshaller::SmartCardMarshaller -  new PCSC( readerName ) ok" );
+      //Log::log( "SmartCardMarshaller::SmartCardMarshaller -  new PCSC( readerName ) ok" );
    }
 
    try
    {
-      Log::log( "SmartCardMarshaller::SmartCardMarshaller -  new std::string(uri->c_str()) ..." );
+      //Log::log( "SmartCardMarshaller::SmartCardMarshaller -  new std::string(uri->c_str()) ..." );
       this->uri = new std::string(uri->c_str());
-      Log::log( "SmartCardMarshaller::SmartCardMarshaller -  new std::string(uri->c_str()) ok" );
+      //Log::log( "SmartCardMarshaller::SmartCardMarshaller -  new std::string(uri->c_str()) ok" );
    }
    catch (...)
    {
-      Log::error( "SmartCardMarshaller::SmartCardMarshaller", "(...)" );
+      //Log::error( "SmartCardMarshaller::SmartCardMarshaller", "(...)" );
       delete this->pcsc;
       throw;
    }
 
-   Log::end( "SmartCardMarshaller::SmartCardMarshaller" );
+   //Log::end( "SmartCardMarshaller::SmartCardMarshaller" );
 }
 
 std::string* SmartCardMarshaller::GetReaderName(void)

Modified: trunk/SmartCardServices/src/PKCS11dotNetV2/cppMarshaller/PCSC.cpp
===================================================================
--- trunk/SmartCardServices/src/PKCS11dotNetV2/cppMarshaller/PCSC.cpp	2010-02-04 14:54:20 UTC (rev 112)
+++ trunk/SmartCardServices/src/PKCS11dotNetV2/cppMarshaller/PCSC.cpp	2010-02-08 09:41:15 UTC (rev 113)
@@ -26,16 +26,17 @@
 #define DBG_UNREFERENCED_LOCAL_VARIABLE(a)
 #endif
 
-#ifndef WIN32
-#include <strings.h>
-#endif
-#include <string.h>
 #ifdef __APPLE__
+#include <PCSC/wintypes.h>
 #include <PCSC/winscard.h>
-#include <PCSC/wintypes.h>
 #else
 #include <winscard.h>
 #endif
+
+#ifndef WIN32
+#include <strings.h>
+#endif
+#include <string.h>
 #include <stdexcept>
 #include "MarshallerCfg.h"
 #include "Array.h"
@@ -417,7 +418,8 @@
    }
 
 #ifdef __DEBUG_APDU__
-   FILE *pFile = fopen("C:\\AxaltoProtocolAnalyzer.txt","a");
+   //FILE *pFile = fopen("C:\\AxaltoProtocolAnalyzer.txt","a");
+   FILE *pFile = fopen("C:\\Gemalto.NET.PKCS11.log","a");
 #endif
 
    try {
@@ -427,11 +429,12 @@
       DWORD answerLen = sizeof(answerData);
 
 #ifdef __DEBUG_APDU__
-      fprintf(pFile, "APDU DataIn Buffer\n");
+      fprintf(pFile, "\nCmd DataIn\n");
       for(int i=0; i < (s4)dataIn.GetLength(); i++) {
          fprintf(pFile, "%02x",dataIn.GetBuffer()[i]);
       }
       fprintf(pFile, "\n");
+      unsigned long ulStart = GetTickCount( );
 #endif
 
       s4 lReturn = SCardTransmit(hCard, SCARD_PCI_T0, dataIn.GetBuffer(), dataIn.GetLength(), NULL, (lpByte)answerData, &answerLen);
@@ -448,7 +451,7 @@
          temp.SetBuffer(answerData);
          dataout += temp;
 #ifdef __DEBUG_APDU__
-         fprintf(pFile, "APDU DataOut Buffer\n");
+         fprintf(pFile, "Cmd DataOut\n");
          for(int i=0; i< (s4)temp.GetLength(); i++) {
             fprintf(pFile, "%02x",temp.GetBuffer()[i]);
          }
@@ -460,9 +463,8 @@
       u1 sw2 = answerData[answerLen - 1];
 
 #ifdef __DEBUG_APDU__
-      fprintf(pFile, "APDU Status Buffer\n");
-      fprintf(pFile, "%02x%02x",sw1,sw2);
-      fprintf(pFile, "\n");
+      fprintf( pFile, "Cmd Status => %02x%02x\n", sw1, sw2 );
+      fprintf( pFile, "Cmd Time   => %ld ms\n", GetTickCount( ) - ulStart );
 #endif
 
       while ((sw1 == 0x61) || (sw1 == 0x9F))
@@ -480,11 +482,12 @@
          answerLen = 258;
 
 #ifdef __DEBUG_APDU__
-         fprintf(pFile, "APDU DataIn Buffer\n");
+         fprintf(pFile, "GetResponse DataIn\n");
          for(int i=0; i<5; i++) {
             fprintf(pFile, "%02x",GetResponse[i]);
          }
          fprintf(pFile, "\n");
+         ulStart = GetTickCount( );
 #endif
 
          lReturn = SCardTransmit(hCard, SCARD_PCI_T0, (lpCByte)GetResponse, 5, NULL, (lpByte)answerData, &answerLen);
@@ -501,20 +504,20 @@
             temp.SetBuffer(answerData);
             dataout += temp;
 #ifdef __DEBUG_APDU__
-            fprintf(pFile, "APDU DataOut Buffer\n");
+            fprintf(pFile, "GetResponse DataOut\n");
             for(int i=0; i< (s4)temp.GetLength(); i++) {
-               fprintf(pFile, "%02x",temp.GetBuffer()[i]);
+               fprintf(pFile, "%02x ",temp.GetBuffer()[i]);
             }
             fprintf(pFile, "\n");
+
 #endif
          }
          sw1 = answerData[answerLen - 2];
          sw2 = answerData[answerLen - 1];
 
 #ifdef __DEBUG_APDU__
-         fprintf(pFile, "APDU Status Buffer\n");
-         fprintf(pFile, "%02x%02x",sw1,sw2);
-         fprintf(pFile, "\n");
+         fprintf( pFile, "GetResponse Status => %02x%02x\n ", sw1, sw2 );
+         fprintf( pFile, "GetResponse Time   => %ld ms\n", GetTickCount( ) - ulStart );
 #endif
       }
    } catch (...) {
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/smartcardservices-changes/attachments/20100208/2aa86fbc/attachment-0001.html>


More information about the SmartcardServices-Changes mailing list