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.
 
 
 
 
 
 

401 lines
7.7 KiB

/*++
Copyright (c) 1995 Microsoft Corporation
Module Name:
srclist.cpp
Abstract:
Certificate source list object implementation.
Author:
Jeff Parham (jeffparh) 15-Dec-1995
Revision History:
--*/
#include "stdafx.h"
#include "srclist.h"
#include <strsafe.h> //include last
// key name under which the individual source key names may be found
#define KEY_CERT_SOURCE_LIST "Software\\LSAPI\\Microsoft\\CertificateSources"
// value name for the path to the certificate source DLL (REG_EXPAND_SZ)
#define VALUE_CERT_SOURCE_PATH "ImagePath"
// value name for the display name of the certificate source
#define VALUE_CERT_DISPLAY_NAME "DisplayName"
CCertSourceList::CCertSourceList()
/*++
Routine Description:
Constructor for object.
Arguments:
None.
Return Values:
None.
--*/
{
m_dwNumSources = 0;
m_ppcsiSourceList = NULL;
RefreshSources();
}
CCertSourceList::~CCertSourceList()
/*++
Routine Description:
Destructor for dialog.
Arguments:
None.
Return Values:
None.
--*/
{
RemoveSources();
}
BOOL CCertSourceList::RefreshSources()
/*++
Routine Description:
Refresh source list from configuration stored in the registry.
Arguments:
None.
Return Values:
BOOL.
--*/
{
LONG lError;
LONG lEnumError;
HKEY hKeyCertSourceList;
int iSubKey;
HKEY hKeyCertSource;
DWORD cb;
BOOL ok;
PCERT_SOURCE_INFO pcsiSourceInfo;
DWORD cch;
TCHAR szExpImagePath[ _MAX_PATH ];
HRESULT hr;
RemoveSources();
lError = RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT( KEY_CERT_SOURCE_LIST ), 0, KEY_READ, &hKeyCertSourceList );
if ( ERROR_SUCCESS == lError )
{
iSubKey = 0;
do
{
ok = FALSE;
pcsiSourceInfo = (PCERT_SOURCE_INFO) LocalAlloc( LPTR, sizeof( *pcsiSourceInfo ) );
if ( NULL != pcsiSourceInfo )
{
// determine next certificate source
cch = sizeof( pcsiSourceInfo->szName ) / sizeof( pcsiSourceInfo->szName[0] );
lEnumError = RegEnumKeyEx( hKeyCertSourceList, iSubKey, pcsiSourceInfo->szName, &cch, NULL, NULL, NULL, NULL );
iSubKey++;
if ( ERROR_SUCCESS == lError )
{
// open certificate source's key
lError = RegOpenKeyEx( hKeyCertSourceList, pcsiSourceInfo->szName, 0, KEY_READ, &hKeyCertSource );
if ( ERROR_SUCCESS == lError )
{
// certificate source key opened; get its REG_EXPAND_SZ image path
cb = sizeof( szExpImagePath );
lError = RegQueryValueEx( hKeyCertSource, TEXT( VALUE_CERT_SOURCE_PATH ), NULL, NULL, (LPBYTE) szExpImagePath, &cb );
if ( ERROR_SUCCESS == lError )
{
// translate environment variables in path
cch = ExpandEnvironmentStrings( szExpImagePath, pcsiSourceInfo->szImagePath, sizeof( pcsiSourceInfo->szImagePath ) / sizeof( pcsiSourceInfo->szImagePath[0] ) );
if ( ( 0 != cch ) && ( cch < sizeof( pcsiSourceInfo->szImagePath ) / sizeof( pcsiSourceInfo->szImagePath[0] ) ) )
{
// get display name
cb = sizeof( pcsiSourceInfo->szDisplayName );
lError = RegQueryValueEx( hKeyCertSource, TEXT( VALUE_CERT_DISPLAY_NAME ), NULL, NULL, (LPBYTE) pcsiSourceInfo->szDisplayName, &cb );
if ( ERROR_SUCCESS != lError )
{
// default display name is the key name
hr = StringCbCopy( pcsiSourceInfo->szDisplayName, sizeof(pcsiSourceInfo->szDisplayName), pcsiSourceInfo->szName );
ASSERT(SUCCEEDED(hr));
}
// add the certificate source to our list
AddSource( pcsiSourceInfo );
ok = TRUE;
}
}
RegCloseKey( hKeyCertSource );
}
}
if ( !ok )
{
// an error occurred before saving our pointer; don't leak!
LocalFree( pcsiSourceInfo );
}
}
} while ( ( NULL != pcsiSourceInfo ) && ( ERROR_SUCCESS == lEnumError ) );
RegCloseKey( hKeyCertSourceList );
}
// 'salright
return TRUE;
}
BOOL CCertSourceList::RemoveSources()
/*++
Routine Description:
Free internal certificate source list.
Arguments:
None.
Return Values:
BOOL.
--*/
{
if ( NULL != m_ppcsiSourceList )
{
for ( DWORD i=0; i < m_dwNumSources; i++ )
{
LocalFree( m_ppcsiSourceList[i] );
}
LocalFree( m_ppcsiSourceList );
}
m_ppcsiSourceList = NULL;
m_dwNumSources = 0;
return TRUE;
}
LPCTSTR CCertSourceList::GetSourceName( int nIndex )
/*++
Routine Description:
Get the name (e.g., "Paper") of the source at the given index.
Arguments:
nIndex (int)
Return Values:
LPCTSTR.
--*/
{
LPTSTR pszName;
if ( ( nIndex < 0 ) || ( nIndex >= (int) m_dwNumSources ) )
{
pszName = NULL;
}
else
{
pszName = m_ppcsiSourceList[ nIndex ]->szName;
}
return pszName;
}
LPCTSTR CCertSourceList::GetSourceDisplayName( int nIndex )
/*++
Routine Description:
Get the display name (e.g., "Paper Certificate") of the source
at the given index.
Arguments:
nIndex (int)
Return Values:
LPCTSTR.
--*/
{
LPTSTR pszDisplayName;
if ( ( nIndex < 0 ) || ( nIndex >= (int) m_dwNumSources ) )
{
pszDisplayName = NULL;
}
else
{
pszDisplayName = m_ppcsiSourceList[ nIndex ]->szDisplayName;
}
return pszDisplayName;
}
LPCTSTR CCertSourceList::GetSourceImagePath( int nIndex )
/*++
Routine Description:
Get the image path name (e.g., "C:\WINNT35\SYSTEM32\CCFAPI32.DLL") of
the source at the given index.
Arguments:
nIndex (int)
Return Values:
LPCTSTR.
--*/
{
LPTSTR pszImagePath;
if ( ( nIndex < 0 ) || ( nIndex >= (int) m_dwNumSources ) )
{
pszImagePath = NULL;
}
else
{
pszImagePath = m_ppcsiSourceList[ nIndex ]->szImagePath;
}
return pszImagePath;
}
int CCertSourceList::GetNumSources()
/*++
Routine Description:
Get the number of certificate sources available.
Arguments:
None.
Return Values:
int.
--*/
{
return m_dwNumSources;
}
BOOL CCertSourceList::AddSource( PCERT_SOURCE_INFO pcsiNewSource )
/*++
Routine Description:
Add a source to the internal list.
Arguments:
pcsiNewSource (PCERT_SOURCE_INFO)
Return Values:
BOOL.
--*/
{
PCERT_SOURCE_INFO *l_ppcsiSourceList;
if ( 0 == m_dwNumSources )
{
l_ppcsiSourceList = (PCERT_SOURCE_INFO *) LocalAlloc( LMEM_FIXED, sizeof( pcsiNewSource ) );
}
else
{
l_ppcsiSourceList = (PCERT_SOURCE_INFO *) LocalReAlloc( m_ppcsiSourceList, ( 1 + m_dwNumSources ) * sizeof( pcsiNewSource ), 0 );
}
if ( NULL != l_ppcsiSourceList )
{
m_ppcsiSourceList = l_ppcsiSourceList;
m_ppcsiSourceList[ m_dwNumSources ] = pcsiNewSource;
m_dwNumSources++;
}
else
{
// if any allocation failure, free all sources and reset
RemoveSources();
}
return ( NULL != m_ppcsiSourceList );
}