//--------------------------------------------------------------- // // File: SASetupCA.cpp // // Synopsis: This is the implementation of the custom actions in Server Appliance // setup. // // // History: 03/29/2001 AlpOn Created // // Copyright (C) 2000-2001 Microsoft Corporation // All rights reserved. // // SASetupCA.cpp : Defines the entry point for the DLL application. // #include "stdafx.h" #include const char REG_APPEND[]="append"; // //private methods declared here // HRESULT StartNTService ( /*[in]*/ PSTR pwszServiceName ); HRESULT StopNTService ( /*[in]*/ PSTR pwszServiceName ); //++--------------------------------------------------------------------------- // // Function: ChangeRegistry // // Synopsis: Function that gets called by SAkit setup to do custom operations // on registry // Arguments: szRegKeyName, - name of the regkey to be opened // szRegValueName - name of the value to be operated on // szRegAction - desired action on the registry (e.g. append) // szKeyValue - new value to be used for the reg key value during the operation // Returns: HRESULT - success/failure // // History: AlpOn Created 03/29/01 // // Called By; Server Appliance Kit setup // //----------------------------------------------------------------------------- STDAPI ChangeRegistry(char *szRegKeyName, char *szRegValueName, char *szRegAction, char *szKeyValue) { HRESULT hReturn=S_OK; DWORD dwSize=0; CRegKey hKey; LONG lRes=0; char *szKeyValueRead=NULL; char *szRegKeyNewValue=NULL; SATracePrintf("ChangeRegistry called with: szRegKeyName:%s,szRegValueName:%s,szRegAction:%s,szKeyValue:%s", szRegKeyName,szRegValueName,szRegAction,szKeyValue); do{ lRes=hKey.Open(HKEY_LOCAL_MACHINE, szRegKeyName, KEY_ALL_ACCESS ); if(lRes!=ERROR_SUCCESS) { SATracePrintf("Regkey open - hKey.Open failed , lRes= %x Key=%s", lRes, szRegKeyName); hReturn=E_FAIL; break; } //open registry key, get size and read the value lRes=hKey.QueryValue(NULL,szRegValueName,&dwSize); szKeyValueRead=new char[dwSize]; lRes=hKey.QueryValue(szKeyValueRead,szRegValueName,&dwSize); if(lRes!=ERROR_SUCCESS) { SATracePrintf("Unable to query regkey hKey.QueryValue failed lRes= %x valuename= %s",lRes, szKeyValueRead); hReturn=E_FAIL; break; } if(0==strcmpi(szRegAction,REG_APPEND)) { SATracePrintf("ChangeRegistry called with append param"); int size=(strlen(szKeyValueRead) + strlen(szKeyValue))+2; szRegKeyNewValue=new char[size]; szRegKeyNewValue[0]='\0'; strcat(szRegKeyNewValue,szKeyValueRead); strcat(szRegKeyNewValue," "); strcat(szRegKeyNewValue,szKeyValue); lRes=hKey.SetValue(szRegKeyNewValue, szRegValueName); if(lRes!=ERROR_SUCCESS) { SATracePrintf("Unable set regkey hKey.SetValue failed lRes= %x",lRes); hReturn=E_FAIL; break; } } }while(false); if(hKey.m_hKey) { hKey.Close(); } delete []szKeyValueRead; delete []szRegKeyNewValue; return hReturn; } BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } //++--------------------------------------------------------------------------- // // Function: ConfigureService // // Synopsis: API that gets called by SAkit setup to configure an // NT Service // Arguments: // [in] PSTR - Service Name (preferably short name) // [in] DWORD - Config Type (start or stop supported) // // Returns: HRESULT - success/failure // // History: MKarki Created 04/05/2001 // // Called By; Server Appliance Kit setup // //----------------------------------------------------------------------------- STDAPI ConfigureService ( /*[in]*/ PSTR pszServiceName, /*[in]*/ DWORD dwControlCode ) { HRESULT hr = S_OK; CSATraceFunc objTraceFunc ("ConfigureService"); try { if (NULL == pszServiceName) { SATraceString ("SASetup-ConfigureService passed in invalid argument"); hr = E_INVALIDARG; return (hr); } // // carry out the required action // switch (dwControlCode) { case 0: // // stop NT Service // hr = StopNTService (pszServiceName); break; case 1: // // start NT Service // hr = StartNTService (pszServiceName); break; default: // // unknown control code passed in // SATracePrintf ( "SASetup-ConfigureService passed in incorrect control code:%d", dwControlCode ); hr = E_FAIL; break; } } catch (...) { SATraceString ("SASetup-ConfigureService caught unhandled exception"); hr = E_FAIL; } return (hr); } // end of ConfigureService API //++--------------------------------------------------------------------------- // // Function: StartNTService // // Synopsis: Method that Starts an NT Service // Arguments: // [in] PSTR - Service Name (preferably short name) // // Returns: HRESULT - success/failure // // History: MKarki Created 04/05/2001 // // Called By; ConfigureService () API // //----------------------------------------------------------------------------- HRESULT StartNTService ( /*[in]*/ PSTR pszServiceName ) { CSATraceFunc objTraceFunc ("StartNTService"); HRESULT hr = S_OK; SC_HANDLE hServiceManager = NULL; SC_HANDLE hService = NULL; do { if (NULL == pszServiceName) { SATraceString ("SASetup-StartNTService passed in invalid argument"); hr = E_INVALIDARG; break; } // // open the Service Control Manager // hServiceManager = OpenSCManager ( NULL, NULL, SC_MANAGER_ALL_ACCESS ); if (NULL == hServiceManager) { SATraceFailure ("SASetup-StartNTService::OpenSCManager", GetLastError ()); hr = E_FAIL; break; } // // open the NT Service // hService = OpenService ( hServiceManager, pszServiceName, SERVICE_ALL_ACCESS ); if (NULL == hService) { SATraceFailure ("SASetup-StartNTService::OpenService", GetLastError ()); hr = E_FAIL; break; } // // start the service now // BOOL bRetVal = StartService ( hService, 0, NULL ); if (FALSE == bRetVal) { DWORD dwError = GetLastError (); // // its OK if the service is already running // if (ERROR_SERVICE_ALREADY_RUNNING != dwError) { SATraceFailure ("SASetup-StartNTService::StartService", dwError); hr = E_FAIL; break; } } } while (false); // // cleanup now // if (hService) { CloseServiceHandle(hService); } if (hServiceManager) { CloseServiceHandle(hServiceManager); } return (hr); } // end of StartNTService method //++--------------------------------------------------------------------------- // // Function: StopNTService // // Synopsis: Method that stops an NT Service // Arguments: // [in] PWCHAR - Service Name (preferably short name) // // Returns: HRESULT - success/failure // // History: MKarki Created 04/05/2001 // // Called By; ConfigureService () API // //----------------------------------------------------------------------------- HRESULT StopNTService ( /*[in]*/ PSTR pszServiceName ) { CSATraceFunc objTraceFunc ("StopNTService"); HRESULT hr = S_OK; SC_HANDLE hServiceManager = NULL; SC_HANDLE hService = NULL; do { if (NULL == pszServiceName) { SATraceString ("SASetup-StopNTService passed in invalid argument"); hr = E_INVALIDARG; break; } // // open the Service Control Manager // hServiceManager = OpenSCManager ( NULL, NULL, SC_MANAGER_ALL_ACCESS ); if (NULL == hServiceManager) { SATraceFailure ("SASetup-StopNTService::OpenSCManager", GetLastError ()); hr = E_FAIL; break; } // // open the NT Service // hService = OpenService ( hServiceManager, pszServiceName, SERVICE_ALL_ACCESS ); if (NULL == hService) { SATraceFailure ("SASetup-StopNTService::OpenService", GetLastError ()); hr = E_FAIL; break; } SERVICE_STATUS ServiceStatus; // // stop the service now // BOOL bRetVal = ControlService ( hService, SERVICE_CONTROL_STOP, &ServiceStatus ); if (FALSE == bRetVal) { DWORD dwError = GetLastError (); // // its OK if the service is already stopped // if (ERROR_SERVICE_NOT_ACTIVE != dwError) { SATraceFailure ("SASetup-StopNTService::ControlService", dwError); hr = E_FAIL; break; } } } while (false); // // cleanup now // if (hService) { CloseServiceHandle(hService); } if (hServiceManager) { CloseServiceHandle(hServiceManager); } return (hr); } // end of StopNTService method