Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

261 lines
5.6 KiB

#ifndef _CERTSTORE_HXX_
#define _CERTSTORE_HXX_
/*++
Copyright (c) 1998 Microsoft Corporation
Module Name :
certstore.cxx
Abstract:
Wrapper of a certificate store
Author:
Bilal Alam (BAlam) 29-March-2000
Environment:
Win32 - User Mode
Project:
Stream Filter Worker Process
--*/
#define CERT_STORE_SIGNATURE (DWORD)'TSRC'
#define CERT_STORE_SIGNATURE_FREE (DWORD)'tsrc'
class CERT_STORE_HASH;
class CERT_STORE
{
public:
CERT_STORE();
VOID
ReferenceStore(
VOID
)
{
InterlockedIncrement( &_cRefs );
}
VOID
DereferenceStore(
VOID
)
{
if ( !InterlockedDecrement( &_cRefs ) )
{
//
// Deletion of the CERT_STORE object cannot happen
// on the callers thead because of the implementation
// limitations. Each instance of CERT_STORE handles
// it's own CAPI store change notifications and there is
// a problem of deadlock waiting for the change notification
// thread to complete in the destructor
//
EnterCriticalSection( &sm_csToBeDeletedList );
InsertHeadList( &sm_ToBeDeletedListHead,
&_ToBeDeletedListEntry );
LeaveCriticalSection( &sm_csToBeDeletedList );
//
// signal the deletion thread that there is a work to be done
//
SetEvent( sm_hWakeupEvent );
}
}
BOOL
CheckSignature(
VOID
) const
{
return _dwSignature == CERT_STORE_SIGNATURE;
}
HCERTSTORE
QueryStore(
VOID
) const
{
return _hStore;
}
WCHAR *
QueryStoreName(
VOID
) const
{
return (WCHAR*) _strStoreName.QueryStr();
}
static
HRESULT
Initialize(
VOID
);
static
VOID
Terminate(
VOID
);
static
VOID
WaitForAllWorkerThreadsCompletion(
VOID
);
static
DWORD
WINAPI
DeletionWorkerThread(
VOID * pvContext
);
static
VOID
DeleteAllPendingInstances(
VOID
);
static
HRESULT
OpenStore(
STRU & strStoreName,
CERT_STORE ** ppCertStore
);
static
VOID
WINAPI
CertStoreChangeRoutine(
VOID * pvContext,
BOOLEAN fTimedOut
);
static
VOID
Cleanup(
VOID
);
private:
virtual ~CERT_STORE();
// private methods
//
HRESULT
Open(
STRU & strStoreName
);
private:
DWORD _dwSignature;
LONG _cRefs;
LIST_ENTRY _ToBeDeletedListEntry;
HCERTSTORE _hStore;
STRU _strStoreName;
// event signalled by CAPI if certificate store has changed
HANDLE _hStoreChangeEvent;
// handle for RegisterWaitForSingleObject
HANDLE _hWaitHandle;
// list of CERT_STORE entries to be deleted
static LIST_ENTRY sm_ToBeDeletedListHead;
// CS to maintain the list above
static CRITICAL_SECTION sm_csToBeDeletedList;
// flag that CS above was initialized
static BOOL sm_fInitcsToBeDeletedList;
// Hash table of CERT_STORE instances
static CERT_STORE_HASH* sm_pCertStoreHash;
// handle to the thread that takes care of the deletion
// of CERT_STORE instances that are on the ToBeDeleted List
static HANDLE sm_hDeletionThread;
// indication for the "deletion thread" that it is
// time to shutdown
static BOOL sm_fDeletionThreadShutdown;
// event to signal to deletion thread that there is a work to be done
// of that there is a time for shutdown
static HANDLE sm_hWakeupEvent;
};
class CERT_STORE_HASH
: public CTypedHashTable<
CERT_STORE_HASH,
CERT_STORE,
WCHAR *
>
{
public:
CERT_STORE_HASH()
: CTypedHashTable< CERT_STORE_HASH,
CERT_STORE,
WCHAR * > ( "CERT_STORE_HASH" )
{
}
static
WCHAR *
ExtractKey(
const CERT_STORE * pCertStore
)
{
return pCertStore->QueryStoreName();
}
static
DWORD
CalcKeyHash(
WCHAR * pszStoreName
)
{
return Hash( pszStoreName );
}
static
bool
EqualKeys(
WCHAR * pszStore1,
WCHAR * pszStore2
)
{
return wcscmp( pszStore1, pszStore2 ) == 0;
}
static
void
AddRefRecord(
CERT_STORE * pCertStore,
int nIncr
)
{
DBG_ASSERT( pCertStore != NULL );
if ( nIncr == +1 )
{
pCertStore->ReferenceStore();
}
else if ( nIncr == -1 )
{
pCertStore->DereferenceStore();
}
}
private:
//
// Not implemented methods
// Declarations present to prevent compiler
// to generate default ones.
//
CERT_STORE_HASH( const CERT_STORE_HASH& );
CERT_STORE_HASH& operator=( const CERT_STORE_HASH& );
};
#endif