#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <windows.h>
#include <winsvc.h>
#define SLEEP_TIME 5000
#define LOG_FILE "c:\\MemoryWatch.txt"
#define SERVICE_NAME "内存查看器2"
#define SERVICE_DESC "云守护的系统服务进程2"
#define SERVICE_DISPLAY_NAME "云守护的系统服务2"
SERVICE_STATUS ServicesStatus;
SERVICE_STATUS_HANDLE hStatus;
SC_HANDLE scm;
SC_HANDLE scv;
void ServiceMain(int argc,char ** argv);
void ControlHander(DWORD request);
void Log(char *str);
int startFunc();
void Onstart();
void OnCreate();
void OnDelete();
void OnStop();
int main(int argc,char * argv[]){
SERVICE_TABLE_ENTRY ServiceTable[2]={
{SERVICE_NAME,(LPSERVICE_MAIN_FUNCTION)ServiceMain},
{ NULL,NULL}
};
if(argc==2)
{
if(!stricmp(argv[1],"-create"))
{
OnCreate();
return 0;
}else if(!stricmp(argv[1],"-delete")){
OnDelete();
return 0;
}else if(!stricmp(argv[1],"-start")){
Onstart();
return 0;
}else if(!stricmp(argv[1],"-stop")){
OnStop();
return 0;
}else{
printf("invailid parameter\n");
return 0;
}
}
printf("Usage:...\n");
StartServiceCtrlDispatcher(ServiceTable);
return 0;
}
void Log(char *str)
{
FILE* fp=fopen(LOG_FILE,"a+");
if(fp==NULL){
printf("error to open file %d\n",GetLastError());
return ;
}
fprintf(fp,"%s\n",str);
fclose(fp);
}
void ServiceMain(int argc,char ** argv)
{
BOOL bRet;
int result;
bRet=TRUE;
ServicesStatus.dwWin32ExitCode=0;
ServicesStatus.dwCheckPoint=0;
ServicesStatus.dwWaitHint=0;
ServicesStatus.dwServiceType=SERVICE_WIN32;
ServicesStatus.dwCurrentState=SERVICE_START_PENDING;
ServicesStatus.dwControlsAccepted=SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SHUTDOWN;
ServicesStatus.dwServiceSpecificExitCode=0;
hStatus=RegisterServiceCtrlHandler(SERVICE_NAME,(LPHANDLER_FUNCTION)ControlHander);
if(hStatus==(SERVICE_STATUS_HANDLE)0){
return ;
}
ServicesStatus.dwCurrentState=SERVICE_RUNNING;
SetServiceStatus(hStatus,&ServicesStatus);
while(ServicesStatus.dwCurrentState==SERVICE_RUNNING){
result=startFunc();
if(result){
ServicesStatus.dwCurrentState=SERVICE_STOPPED;
ServicesStatus.dwWin32ExitCode=-1;
SetServiceStatus(hStatus,&ServicesStatus);
return ;
}
}
}
int startFunc(){
MessageBox(NULL,"service running",SERVICE_NAME,MB_OK);
return 0;
}
void ControlHander(DWORD request){
switch(request){
case SERVICE_CONTROL_STOP:
Log("Monitoring stoped.");
ServicesStatus.dwWin32ExitCode=0;
ServicesStatus.dwCurrentState=SERVICE_STOPPED;
SetServiceStatus(hStatus,&ServicesStatus);
return ;
case SERVICE_CONTROL_SHUTDOWN:
Log("Monitoring stoped.");
ServicesStatus.dwWin32ExitCode=0;
ServicesStatus.dwCurrentState=SERVICE_STOPPED;
SetServiceStatus(hStatus,&ServicesStatus);
return ;
default:
break;
}
SetServiceStatus(hStatus,&ServicesStatus);
}
void OnCreate(){
char filename[MAX_PATH];
DWORD dwErrorCode;
GetModuleFileName(NULL,filename,MAX_PATH);
printf("Creating Service ...");
scm=OpenSCManager(0,NULL,SC_MANAGER_ALL_ACCESS);
if(scm==NULL){
printf("OpenSCManger error:%d\n",GetLastError());
return ;
}
scv=CreateService(scm,SERVICE_NAME,SERVICE_DISPLAY_NAME,SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,SERVICE_AUTO_START,SERVICE_ERROR_IGNORE,
filename,NULL,NULL,NULL,NULL,NULL);
if(scv==NULL){
dwErrorCode=GetLastError();
if(dwErrorCode!=ERROR_SERVICE_EXISTS){
printf("failure !\n");
CloseServiceHandle(scm);
return;
}else{
printf("already exists!\n");
}
}else{
printf("Success !\n");
CloseServiceHandle(scv);
}
CloseServiceHandle(scm);
scm=scv=NULL;
}
void OnDelete(){
scm=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if(scm!=NULL)
{
scv=OpenService(scm,SERVICE_NAME,SERVICE_ALL_ACCESS);
if(scv!=NULL)
{
QueryServiceStatus(scv,&ServicesStatus);
if(ServicesStatus.dwCurrentState==SERVICE_RUNNING)
{
ControlService(scv,SERVICE_CONTROL_STOP,&ServicesStatus);
printf("stop success!\n");
}
DeleteService(scv);
CloseServiceHandle(scv);
printf("delete success!\n");
}else{
printf("OpenService error!\n");
}
CloseServiceHandle(scm);
}else{
printf("OpenSCManager error!\n");
}
scm=scv=NULL;
}
void Onstart(){
DWORD dwErrorCode;
printf("starting Service...\n");
scm=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if(scm!=NULL){
scv=OpenService(scm,SERVICE_NAME,SERVICE_ALL_ACCESS);
if(scv!=NULL){
if(StartService(scv,0,NULL)==0){
dwErrorCode=GetLastError();
if(dwErrorCode==ERROR_SERVICE_ALREADY_RUNNING){
printf("already running !\n");
CloseServiceHandle(scv);
CloseServiceHandle(scm);
return ;
}
}else{
printf("service start success! ...\n");
}
while(QueryServiceStatus(scv,&ServicesStatus)!=0){
if(ServicesStatus.dwCurrentState==SERVICE_START_PENDING){
Sleep(100);
}else{
break;
}
}
CloseServiceHandle(scv);
}else{
printf("error to open service.,please create the service.\n");
}
CloseServiceHandle(scm);
}
else{
printf("faile to openscmanger!\n");
}
scm=scv=NULL;
}
void OnStop(){
scm=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if(scm!=NULL){
scv=OpenService(scm,SERVICE_NAME,SERVICE_STOP|SERVICE_QUERY_STATUS);
if(scv!=NULL){
QueryServiceStatus(scv,&ServicesStatus);
if(ServicesStatus.dwCurrentState==SERVICE_RUNNING){
ControlService(scv,SERVICE_CONTROL_STOP,&ServicesStatus);
}
CloseServiceHandle(scv);
printf("success close service !\n");
}else{
printf("OpenService error!\n");
}
CloseServiceHandle(scm);
}else{
printf("OpenSCManager error!\n");
}
scm=scv=NULL;
}
win系统服务编程c++实现
最新推荐文章于 2019-07-26 19:47:00 发布