CString GetCurrentDir(void) { CString result; result.SetLength(MAX_PATH_LENGTH); if (0!=getcwd(result.GetCString(),MAX_PATH_LENGTH)) { result.SetLength(); return result; } return ""; }
CString RemoveTrailingPathDelimiter(const CString& FilePathName) { CString result = FilePathName; if (!FilePathName.IsEmpty()) { if ((FilePathName.GetLastChar()=='/')||(FilePathName.GetLastChar()=='\\')) { result.SetLength(result.GetLength()-1); } } return result; }
bool CNTService::Install(void) { SC_HANDLE ServiceHandle; SC_HANDLE ServiceManager; CString ModuleFilename; DWORD dwLen = MAX_PATH; ModuleFilename.SetLength(dwLen); if (!(dwLen = GetModuleFileNameA(GetModuleHandle(NULL), (char *) ModuleFilename.GetBuffer(), dwLen))) { cout << "Error getting module path." << endl; CObject::ShowLastError(); return false; } else { ModuleFilename.SetLength(dwLen); } cout << "Attempting to install " << m_ServiceName << " (" << ModuleFilename << ") ..." << endl; ServiceManager = OpenSCManagerA( NULL, // machine (NULL == local) NULL, // database (NULL == default) SC_MANAGER_ALL_ACCESS // access required ); if ( !ServiceManager ) { cout << "OpenSCManager failed." << endl; CObject::ShowLastError(); return false; } CString ServiceDependencies; for (register int i=0; i < (int) m_Dependencies.GetSize(); i++) { ServiceDependencies += m_Dependencies[i]; ServiceDependencies += (char) 0; } ServiceDependencies += (char) 0; ModuleFilename += " service dispatch"; ModuleFilename += (" --servicename=" + m_ServiceName); ModuleFilename += (" --servicedisplayname=" + m_ServiceDisplayName); ServiceHandle = CreateServiceA( ServiceManager, // SCManager database m_ServiceName.GetBuffer(), // name of service m_ServiceDisplayName.GetBuffer(), // name to display SERVICE_ALL_ACCESS, // desired access SERVICE_WIN32_OWN_PROCESS, // service type SERVICE_AUTO_START, // start type SERVICE_ERROR_NORMAL, // error control type ModuleFilename.GetBuffer(), // service's binary NULL, // no load ordering group NULL, // no tag identifier ServiceDependencies.GetBuffer(), // dependencies m_RunasUsername.GetLength() ? m_RunasUsername.GetBuffer() : NULL, // account m_RunasPassword.GetLength() ? m_RunasPassword.GetBuffer() : NULL); // password /* not supported on NT4 // set service description if any DWORD dwSystemVersion = GetVersion(); if (ServiceHandle && m_ServiceDescription.GetLength() && (dwSystemVersion < 0x80000000) && // Windows 2000, XP, NT (LOBYTE(LOWORD(dwSystemVersion)) >= 5) // Windows 2000, XP ) { SERVICE_DESCRIPTIONA ServiceDescription; ServiceDescription.lpDescription = (char *) m_ServiceDescription.GetBuffer(); if (! ChangeServiceConfig2(ServiceHandle, SERVICE_CONFIG_DESCRIPTION, & ServiceDescription)) { cout << "ChangeServiceConfig2 failed." << endl; CObject::ShowLastError(); CloseServiceHandle( ServiceHandle ); if (ServiceManager) CloseServiceHandle( ServiceManager ); return false; } } */ if (! ServiceHandle) { cout << "CreateService failed." << endl; CObject::ShowLastError(); if (ServiceManager) CloseServiceHandle( ServiceManager ); return false; } else { CloseServiceHandle( ServiceHandle ); } if (ServiceManager) { CloseServiceHandle( ServiceManager ); } cout << m_ServiceDisplayName << " successfuly installed." << endl; return true; }