#include <stdio.h>
#include <windows.h>
#include <winbase.h>
#include <winsvc.h>
const int nBufferSize = 500;
char pServiceName[nBufferSize+1];
char pExeFile[nBufferSize+1];
SERVICE_STATUS serviceStatus;
SERVICE_STATUS_HANDLE hServiceStatusHandle;
void ReportError(LPCTSTR s)
{
long e = GetLastError();
char buf[1024];
wsprintf(buf, "%s failed, error code = %d/n",s, e);
OutputDebugString(buf);
}
void ShowDebugMsg(LPCTSTR s1,LPCTSTR s2)
{
char b[1024];
wsprintf(b,s1,s2);
OutputDebugString(b);
}
VOID WINAPI MyServiceHandler(DWORD fdwControl)
{
switch(fdwControl)
{
case SERVICE_CONTROL_STOP:
serviceStatus.dwWin32ExitCode = 0;
serviceStatus.dwCurrentState = SERVICE_STOPPED;
serviceStatus.dwCheckPoint = 0;
serviceStatus.dwWaitHint = 0;
if (!SetServiceStatus(hServiceStatusHandle, &serviceStatus))
ReportError("SetServiceStatus");
else
OutputDebugString("Service_stop");
return;
case SERVICE_CONTROL_PAUSE:
serviceStatus.dwCurrentState = SERVICE_PAUSED;
OutputDebugString("SERVICE_PAUSED");
break;
case SERVICE_CONTROL_CONTINUE:
serviceStatus.dwCurrentState = SERVICE_RUNNING;
OutputDebugString("SERVICE_RUNNING");
break;
case SERVICE_CONTROL_INTERROGATE:
break;
default:
break;
};
if (!SetServiceStatus(hServiceStatusHandle, &serviceStatus))
ReportError("SetServiceStatus");
}
VOID WINAPI MyServiceMain( DWORD dwArgc, LPTSTR *lpszArgv )
{
DWORD status = 0;
DWORD specificError = 0xfffffff;
serviceStatus.dwServiceType = SERVICE_WIN32;
serviceStatus.dwCurrentState = SERVICE_START_PENDING;
serviceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE;
serviceStatus.dwWin32ExitCode = 0;
serviceStatus.dwServiceSpecificExitCode = 0;
serviceStatus.dwCheckPoint = 0;
serviceStatus.dwWaitHint = 0;
hServiceStatusHandle = RegisterServiceCtrlHandler(pServiceName, MyServiceHandler);
if (hServiceStatusHandle==0)
{
ReportError("RegisterServiceCtrlHandler");
return;
}
// Handle error condition
status = GetLastError();
if (status!=NO_ERROR)
{
serviceStatus.dwCurrentState = SERVICE_STOPPED;
serviceStatus.dwCheckPoint = 0;
serviceStatus.dwWaitHint = 0;
serviceStatus.dwWin32ExitCode = status;
serviceStatus.dwServiceSpecificExitCode = specificError;
SetServiceStatus(hServiceStatusHandle, &serviceStatus);
return;
}
// Initialization complete - report running status
serviceStatus.dwCurrentState = SERVICE_RUNNING;
serviceStatus.dwCheckPoint = 0;
serviceStatus.dwWaitHint = 0;
if(!SetServiceStatus(hServiceStatusHandle, &serviceStatus))
{
ReportError("SetServiceStatus");
}
}
SERVICE_TABLE_ENTRY DispatchTable[] =
{
{pServiceName, MyServiceMain},
{NULL, NULL}
};
BOOL KillService(char* pName)
{
SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (schSCManager==0)
ReportError("OpenSCManager");
else
{
SC_HANDLE schService = OpenService( schSCManager, pName, SERVICE_ALL_ACCESS);
if (schService==0)
ReportError("OpenService");
else
{
SERVICE_STATUS status;
if(ControlService(schService,SERVICE_CONTROL_STOP,&status))
{
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
return TRUE;
}
else
ReportError("ControlService");
CloseServiceHandle(schService);
}
CloseServiceHandle(schSCManager);
}
return FALSE;
}
BOOL RunService(char* pName, int nArg, char** pArg)
{
SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (schSCManager==0)
ReportError("OpenSCManager");
else
{
SC_HANDLE schService = OpenService( schSCManager, pName, SERVICE_ALL_ACCESS);
if (schService==0)
ReportError("OpenService");
else
{
if(StartService(schService,nArg,(const char**)pArg))
{
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
return TRUE;
}
else
ReportError("StartService");
CloseServiceHandle(schService);
}
CloseServiceHandle(schSCManager);
}
return FALSE;
}
VOID UnInstall(char* pName)
{
SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (schSCManager==0)
ReportError("OpenSCManager");
else
{
SC_HANDLE schService = OpenService( schSCManager, pName, SERVICE_ALL_ACCESS);
if (schService==0)
ReportError("OpenService");
else
{
char pLog2[1024];
if(!DeleteService(schService))
wsprintf(pLog2, "Failed to delete service %s/n", pName);
else
wsprintf(pLog2, "Service %s removed/n",pName);
OutputDebugString(pLog2);
CloseServiceHandle(schService);
}
CloseServiceHandle(schSCManager);
}
}
VOID Install(char* pPath, char* pName)
{
SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
if (schSCManager==0)
ReportError("OpenSCManager");
else
{
SC_HANDLE schService = CreateService
(
schSCManager, /* SCManager database */
pName, /* name of service */
pName, /* service name to display */
SERVICE_ALL_ACCESS, /* desired access */
SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS , /* service type */
SERVICE_AUTO_START, /* start type */
SERVICE_ERROR_NORMAL, /* error control type */
pPath, /* service's binary */
NULL, /* no load ordering group */
NULL, /* no tag identifier */
NULL, /* no dependencies */
NULL, /* LocalSystem account */
NULL
); /* no password */
if (schService==0)
{
char buf[1024];
wsprintf(buf, "Failed to create service %s/n", pName);
OutputDebugString(buf);
}
else
{
ShowDebugMsg("Service %s installed/n", pName);
CloseServiceHandle(schService);
}
CloseServiceHandle(schSCManager);
}
}
Top
2 楼masterz(www.fruitfruit.com)回复于 2003-04-19 19:35:01 得分 30
//continue...
void main(int argc, char *argv[] )
{
char pModuleFile[nBufferSize+1];
DWORD dwSize = GetModuleFileName(NULL,pModuleFile,nBufferSize);
pModuleFile[dwSize] = 0;
if(dwSize>4&&pModuleFile[dwSize-4]=='.')
{
sprintf(pExeFile,"%s",pModuleFile);
pModuleFile[dwSize-4] = 0;
}
else
sprintf(pExeFile,"%s",argv[0]);
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char ext[_MAX_EXT];
_splitpath(pExeFile,drive,dir,pServiceName,ext) ;
if(argc==2&&_stricmp("-u",argv[1])==0)
UnInstall(pServiceName);
else if(argc==2&&_stricmp("-i",argv[1])==0)
Install(pExeFile, pServiceName);
else if(argc==2&&_stricmp("-b",argv[1])==0)
{
KillService(pServiceName);
RunService(pServiceName,0,NULL);
}
else if(argc==3&&_stricmp("-k",argv[1])==0)
{
if(KillService(argv[2]))
ShowDebugMsg("Killed service %s./n", argv[2]);
else
ShowDebugMsg("Failed to kill service %s./n", argv[2]);
}
else if(argc>=3&&_stricmp("-r",argv[1])==0)
{
if(RunService(argv[2], argc>3?(argc-3):0,argc>3?(&(argv[3])):NULL))
ShowDebugMsg("Ran service %s./n", argv[2]);
else
OutputDebugString("failed to run myservice");
}
else
if(!StartServiceCtrlDispatcher(DispatchTable))
ReportError("StartServiceCtrlDispatcher");
}