|
|
/*++
� 1998 Seagate Software, Inc. All rights reserved.
Module Name:
HsmAdmin.cpp
Abstract:
Main module file - defines the overall COM server.
Author:
Rohde Wakefield [rohde] 04-Mar-1997
Revision History:
--*/
#include "stdafx.h"
// Include typedefs for all classes declared in DLL
#include "CSakSnap.h"
#include "CSakData.h"
#include "About.h"
#include "Ca.h"
#include "HsmCom.h"
#include "ManVol.h"
#include "ManVolLs.h"
#include "MeSe.h"
#ifdef _MERGE_PROXYSTUB
#include "dlldatax.h"
extern "C" HINSTANCE hProxyDll; #endif
CComModule _Module; CHsmAdminApp g_App; CComPtr<IWsbTrace> g_pTrace;
//
// Marks the beginning of the map of ATL objects in this DLL for which
// class factories will be supplied. When CComModule::RegisterServer is
// called, it updates the system registry for each object in the object map.
//
BEGIN_OBJECT_MAP(ObjectMap) OBJECT_ENTRY(CLSID_CAbout, CAbout) OBJECT_ENTRY(CLSID_CUiCar, CUiCar) OBJECT_ENTRY(CLSID_CUiHsmCom, CUiHsmCom) OBJECT_ENTRY(CLSID_CUiManVol, CUiManVol) OBJECT_ENTRY(CLSID_CUiManVolLst, CUiManVolLst) OBJECT_ENTRY(CLSID_CUiMedSet, CUiMedSet) OBJECT_ENTRY(CLSID_HsmAdminDataSnapin, CSakDataPrimaryImpl) OBJECT_ENTRY(CLSID_HsmAdminDataExtension, CSakDataExtensionImpl) OBJECT_ENTRY(CLSID_HsmAdmin, CSakSnap) END_OBJECT_MAP()
BOOL CHsmAdminApp::InitInstance() { _Module.Init(ObjectMap, m_hInstance); AfxEnableControlContainer( );
try {
#ifdef _MERGE_PROXYSTUB
hProxyDll = m_hInstance; #endif
CString keyName; keyName.Format( L"ClsID\\%ls", WsbGuidAsString( CLSID_CWsbTrace ) );
CRegKey key; if( key.Open( HKEY_CLASSES_ROOT, keyName, KEY_READ ) != ERROR_SUCCESS ) {
throw( GetLastError( ) );
}
if( SUCCEEDED( g_pTrace.CoCreateInstance( CLSID_CWsbTrace ) ) ) { CString tracePath, regPath; CWsbStringPtr outString; outString.Alloc( 256 ); regPath = L"SOFTWARE\\Microsoft\\RemoteStorage\\RsAdmin"; //
// We want to put the path where the trace file should go.
//
if( WsbGetRegistryValueString( 0, regPath, L"WsbTraceFileName", outString, 256, 0 ) != S_OK ) { WCHAR * systemPath; systemPath = _wgetenv( L"SystemRoot" ); tracePath.Format( L"%ls\\System32\\RemoteStorage\\Trace\\RsAdmin.Trc", systemPath );
WsbSetRegistryValueString( 0, regPath, L"WsbTraceFileName", tracePath );
//
// Try a little to make sure the trace directory exists.
//
tracePath.Format( L"%ls\\System32\\RemoteStorage", systemPath ); CreateDirectory( tracePath, 0 ); tracePath += L"\\Trace"; CreateDirectory( tracePath, 0 );
} g_pTrace->SetRegistryEntry( (LPWSTR)(LPCWSTR)regPath ); g_pTrace->LoadFromRegistry(); } } catch( ... ) { }
WsbTraceIn( L"CHsmAdminApp::InitInstance", L"" ); HRESULT hr = S_OK;
try {
//
// Need to give complete path to POPUP help file
//
CWsbStringPtr helpFile; WsbAffirmHr( helpFile.LoadFromRsc( _Module.m_hInst, IDS_HELPFILEPOPUP ) );
CWsbStringPtr winDir; WsbAffirmHr( winDir.Alloc( RS_WINDIR_SIZE ) ); WsbAffirmStatus( ::GetWindowsDirectory( (WCHAR*)winDir, RS_WINDIR_SIZE ) != 0 );
CString helpFilePath = CString( winDir ) + L"\\help\\" + CString( helpFile ); m_pszHelpFilePath = _tcsdup( helpFilePath );
} WsbCatch( hr );
BOOL retval = CWinApp::InitInstance( ); WsbTraceOut( L"CHsmAdminApp::InitInstance", L"BOOL = <%ls>", WsbBoolAsString( retval ) ); return( retval ); }
int CHsmAdminApp::ExitInstance() { WsbTraceIn( L"CHsmAdminApp::ExitInstance", L"" );
_Module.Term(); int retval = CWinApp::ExitInstance();
WsbTraceOut( L"CHsmAdminApp::ExitInstance", L"int = <%ls>", WsbLongAsString( retval ) ); return( retval ); }
void CHsmAdminApp::ParseCommandLine(CCommandLineInfo& rCmdInfo) { int argc = 0; WCHAR **argv;
WsbTraceIn( L"CHsmAdminApp::ParseCommandLine", L"" );
argv = CommandLineToArgvW( GetCommandLineW(), &argc ); if (argc > 0) { WsbAffirmPointer(argv); } for (int i = 1; i < argc; i++) { CString pszParam = argv[i]; BOOL bFlag = FALSE; BOOL bLast = ((i + 1) == argc); WsbTrace( L"CHsmAdminApp::ParseCommandLine: arg[%d] = \"%s\"\n", i, (LPCTSTR)pszParam); if( pszParam[0] == '-' || pszParam[0] == '/' ) { // remove flag specifier
bFlag = TRUE; pszParam = pszParam.Mid( 1 ); } rCmdInfo.ParseParam( pszParam, bFlag, bLast ); } WsbTraceOut( L"CHsmAdminApp::ParseCommandLine", L"" ); }
/////////////////////////////////////////////////////////////////////////////
// Used to determine whether the DLL can be unloaded by OLE
STDAPI DllCanUnloadNow(void) { WsbTraceIn( L"DllCanUnloadNow", L"" ); AFX_MANAGE_STATE(AfxGetStaticModuleState());
HRESULT hr = S_OK; #ifdef _MERGE_PROXYSTUB
hr = ( S_OK == PrxDllCanUnloadNow() ) ? S_OK : S_FALSE; #endif
if( S_OK == hr ) { hr = (AfxDllCanUnloadNow()==S_OK && _Module.GetLockCount()==0) ? S_OK : S_FALSE;
} WsbTraceOut( L"DllCanUnloadNow", L"hr = <%ls>", WsbHrAsString( hr ) ); return( hr ); }
/////////////////////////////////////////////////////////////////////////////
// Returns a class factory to create an object of the requested type
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) { WsbTraceIn( L"DllGetClassObject", L"" );
HRESULT hr = CLASS_E_CLASSNOTAVAILABLE;
#ifdef _MERGE_PROXYSTUB
hr = PrxDllGetClassObject( rclsid, riid, ppv ); #endif
if( CLASS_E_CLASSNOTAVAILABLE == hr ) {
hr = _Module.GetClassObject(rclsid, riid, ppv);
}
WsbTraceOut( L"DllGetClassObject", L"hr = <%ls>", WsbHrAsString( hr ) ); return( hr ); }
/////////////////////////////////////////////////////////////////////////////
// DllRegisterServer - Adds entries to the system registry
STDAPI DllRegisterServer(void) { WsbTraceIn( L"DllRegisterServer", L"" );
// registers object, typelib and all interfaces in typelib
HRESULT hr = S_OK;
#ifdef _MERGE_PROXYSTUB
hr = PrxDllRegisterServer(); #endif
if( SUCCEEDED( hr ) ) {
hr = CoInitialize( 0 );
if (SUCCEEDED(hr)) { hr = _Module.RegisterServer( TRUE ); CoUninitialize( ); }
//
// Need to over-ride the rgs name description for multi language support
//
CWsbStringPtr name, nameIndirect, regPath; HRESULT hrMUI = S_OK; UINT uLen = 0; if( SUCCEEDED( name.LoadFromRsc( _Module.m_hInst, IDS_HSMCOM_DESCRIPTION ) ) ) {
const OLECHAR* mmcPath = L"SOFTWARE\\Microsoft\\MMC\\SnapIns\\";
// Create indirect string
hrMUI = nameIndirect.Alloc(MAX_PATH); if (S_OK == hrMUI) { uLen = GetSystemDirectory(nameIndirect, MAX_PATH); if (uLen > MAX_PATH) { // Try again with larger buffer
hrMUI = nameIndirect.Realloc(uLen); if (S_OK == hrMUI) { uLen = GetSystemDirectory(nameIndirect, uLen); if (0 == uLen) { hrMUI = S_FALSE; } } } }
if (S_OK == hrMUI) { hrMUI = nameIndirect.Prepend(OLESTR("@")); } if (S_OK == hrMUI) { WCHAR resId[64]; wsprintf(resId, OLESTR("\\rsadmin.dll,-%d"), IDS_HSMCOM_DESCRIPTION); hrMUI = nameIndirect.Append(resId); }
// Sanpin
regPath = mmcPath; regPath.Append( WsbGuidAsString( CLSID_HsmAdminDataSnapin ) );
// Set the MUI support value
if (S_OK == hrMUI) { WsbSetRegistryValueString( 0, regPath, L"NameStringIndirect", nameIndirect ); }
// Set the fallback value
WsbSetRegistryValueString( 0, regPath, L"NameString", name );
// Extension
regPath = mmcPath; regPath.Append( WsbGuidAsString( CLSID_HsmAdminDataExtension ) );
// Set the MUI support value
if (S_OK == hrMUI) { WsbSetRegistryValueString( 0, regPath, L"NameStringIndirect", nameIndirect ); }
// Set the fallback value
WsbSetRegistryValueString( 0, regPath, L"NameString", name );
}
}
WsbTraceOut( L"DllRegisterServer", L"hr = <%ls>", WsbHrAsString( hr ) ); return( hr ); }
/////////////////////////////////////////////////////////////////////////////
// DllUnregisterServer - Removes entries from the system registry
STDAPI DllUnregisterServer(void) { HRESULT hr; WsbTraceIn( L"DllUnregisterServer", L"" );
#ifdef _MERGE_PROXYSTUB
PrxDllUnregisterServer(); #endif
hr = CoInitialize( 0 );
if (SUCCEEDED(hr)) { _Module.UnregisterServer(); CoUninitialize( ); hr = S_OK; }
WsbTraceOut( L"DllUnregisterServer", L"hr = <%ls>", WsbHrAsString( hr ) ); return( hr ); }
|