/** * Executes the various commands that are useful for a NT service. Right * now these include 'install' and 'remove'. Others, such as 'start' and * 'stop' can be added, but the 'net' program in Windows already handles * these commands. */ static int run_service_command (Options& opts) { if (opts.service_command () == Options::SC_NONE) return 0; #if defined (ACE_WIN32) && !defined (ACE_LACKS_WIN32_SERVICES) SERVICE::instance()->name (IMR_LOCATOR_SERVICE_NAME, IMR_LOCATOR_DISPLAY_NAME); if (opts.service_command () == Options::SC_INSTALL) { const DWORD MAX_PATH_LENGTH = 4096; ACE_TCHAR pathname[MAX_PATH_LENGTH]; DWORD length = ACE_TEXT_GetModuleFileName (0, pathname, MAX_PATH_LENGTH); if (length == 0 || length >= MAX_PATH_LENGTH - sizeof(" -s")) { ORBSVCS_ERROR ((LM_ERROR, "Error: Could not get module file name\n")); return -1; } // Append the command used for running the implrepo as a service ACE_OS::strcat (pathname, ACE_TEXT (" -s")); int ret = SERVICE::instance ()->insert (SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, pathname); if (ret != -1) { ORBSVCS_DEBUG ((LM_DEBUG, "ImR: Service installed.\n")); opts.save_registry_options (); } else { ORBSVCS_ERROR ((LM_ERROR, "Error: Failed to install service. error:%d\n", errno)); } if (ret == 0) return 1; } else if (opts.service_command () == Options::SC_REMOVE) { int ret = SERVICE::instance ()->remove (); ORBSVCS_DEBUG ((LM_DEBUG, "ImR: Service removed.\n")); if (ret == 0) return 1; // If successful, then we don't want to continue. } else { ORBSVCS_ERROR ((LM_ERROR, "Error: Unknown service command :%d\n", opts.service_command ())); return -1; } return -1; #else /* ACE_WIN32 */ ORBSVCS_ERROR ((LM_ERROR, "NT Service not supported on this platform")); return -1; #endif /* ACE_WIN32 && !ACE_LACKS_WIN32_SERVICES */ }
int ACE_Log_Msg_NT_Event_Log::open (const ACE_TCHAR *logger_key) { // ACE's "resource module" contains the message resource required // for event logging. ACE_TCHAR msg_file [MAXPATHLEN]; if (!ACE_TEXT_GetModuleFileName (ACE_OS::get_win32_resource_module (), msg_file, MAXPATHLEN)) return -1; DWORD msg_file_length = static_cast<DWORD> ((ACE_OS::strlen (msg_file) + 1) * sizeof (ACE_TCHAR)); // If a logger_key has been supplied then we use that as the event // source name, otherwise we default to the program name. const ACE_TCHAR *event_source_name = logger_key ? logger_key : ACE_Log_Msg::program_name (); // Information is stored in the registry at a location based on the // program name. ACE_TCHAR reg_key [MAXPATHLEN]; ACE_OS::strcpy (reg_key, ACE_TEXT ("SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\")); size_t reg_key_length = ACE_OS::strlen(reg_key); ACE_OS::strncat (reg_key, event_source_name, MAXPATHLEN - reg_key_length); // Add the event source to the registry. Note that if this fails it // is not fatal. The application will still be able to write entries // to the event log, they just won't be formatted correctly. HKEY hkey; ACE_TEXT_RegCreateKey (HKEY_LOCAL_MACHINE, reg_key, &hkey); DWORD flags = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | EVENTLOG_INFORMATION_TYPE; ACE_TEXT_RegSetValueEx (hkey, ACE_TEXT ("TypesSupported"), 0, REG_DWORD, (LPBYTE) &flags, sizeof (DWORD)); ACE_TEXT_RegSetValueEx (hkey, ACE_TEXT ("EventMessageFile"), 0, REG_SZ, (LPBYTE) msg_file, msg_file_length); RegCloseKey (hkey); // Obtain a handle to the event source. this->evlog_handle_ = ACE_TEXT_RegisterEventSource (0, event_source_name); return this->evlog_handle_ ? 0 : -1; }
int ACE_NT_Service::insert (DWORD start_type, DWORD error_control, const ACE_TCHAR *exe_path, const ACE_TCHAR *group_name, LPDWORD tag_id, const ACE_TCHAR *dependencies, const ACE_TCHAR *account_name, const ACE_TCHAR *password, DWORD desired_access) { ACE_TCHAR this_exe[MAXPATHLEN + 2]; // Insure ACE_OS::last_error finds GetLastError unless we set errno. errno = 0; if (exe_path == 0) { if (ACE_TEXT_GetModuleFileName (0, this_exe + 1, MAXPATHLEN) == 0) return -1; // Make sure that this_exe is quoted this_exe[0] = ACE_TEXT ('\"'); ACE_OS::strcat (this_exe, ACE_TEXT ("\"")); exe_path = this_exe; } SC_HANDLE sc_mgr = ACE_TEXT_OpenSCManager (this->host (), 0, SC_MANAGER_ALL_ACCESS); if (sc_mgr == 0) return -1; SC_HANDLE sh = ACE_TEXT_CreateService (sc_mgr, this->name (), this->desc (), desired_access, this->svc_status_.dwServiceType, start_type, error_control, exe_path, group_name, tag_id, dependencies, account_name, password); // If there was an error, stash GetLastError before CloseServiceHandle // smashes it. ACE_OS::last_error will find the saved error value. if (sh == 0) ACE_OS::set_errno_to_last_error (); CloseServiceHandle (sc_mgr); if (sh == 0) return -1; if (this->svc_sc_handle_ != 0) CloseServiceHandle (this->svc_sc_handle_); this->svc_sc_handle_ = sh; return 0; }