9、服务安装与删除

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <string.h>

#define SLEEP_TIME 5000
#define FILE_PATH "c:\\log.txt"

SERVICE_STATUS m_ServiceStatus;
SERVICE_STATUS_HANDLE m_ServiceStatusHandle;
void WINAPI ServiceMain(int argc, char** argv);
void WINAPI ServiceCtrlHandler(DWORD Opcode);
int WriteTolog(char* str);

BOOL InstallCmdService();//安装服务
void  DelServices();//删除服务

BOOL bRunning = TRUE;


int main(int argc, char *argv[])//使用命令行参数
{
	SERVICE_TABLE_ENTRY DispatchTable[2];
	if(argc == 2)
	{
	   if(!stricmp(argv[1],"-i"))//-i是安装
	   {
	       InstallCmdService();
	   }
	   else if(!stricmp(argv[1],"-r"))//-r是卸载
	   {
	       DelServices();
	   }
	   return 0;
	}
	
	DispatchTable[0].lpServiceName = "demo";
	DispatchTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
	DispatchTable[1].lpServiceName = NULL;
	DispatchTable[1].lpServiceProc = NULL;
	
	StartServiceCtrlDispatcher(DispatchTable);
	return 0;

}

int WriteTolog(char* str)
{
    FILE* pfile;
	fopen_s(&pfile,FILE_PATH,"a+");
	if(pfile==NULL)
	{
	    return -1;
	}
	fprintf_s(pfile,"%s\n",str);
	fclose(pfile);
	return 0;
}
	
void WINAPI ServiceMain(int argc, char** argv)
{ 
	MEMORYSTATUS memstatus;
	char str[100];
	int availmb;
	m_ServiceStatus.dwServiceType = SERVICE_WIN32;
	m_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
	m_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN|SERVICE_ACCEPT_STOP;
	m_ServiceStatus.dwWin32ExitCode = 0;
	m_ServiceStatus.dwServiceSpecificExitCode = 0;
	m_ServiceStatus.dwCheckPoint = 0;
	m_ServiceStatus.dwWaitHint = 0;
	//注册服务控制函数

	m_ServiceStatusHandle = RegisterServiceCtrlHandler("demo",ServiceCtrlHandler);
	if(m_ServiceStatusHandle == 0)
	{
		WriteTolog("RegisterServiceCtrlHandler failed");
		return;
	}
	WriteTolog("RegisterServiceCtrlHandler success");
	m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
	SetServiceStatus(m_ServiceStatusHandle,&m_ServiceStatus);
	bRunning = TRUE;
		
		memset(str,'\0',100);
	while(bRunning)
	{
		GlobalMemoryStatus(&memstatus);
		availmb = memstatus.dwAvailPhys/1024/1024;
		sprintf_s(str,100,"available memory is %dMB",availmb);
		WriteTolog(str);
		Sleep(SLEEP_TIME);
	}
	WriteTolog("service stopped");

}

void WINAPI ServiceCtrlHandler(DWORD Opcode)
{
	switch(Opcode)
	{
	case SERVICE_CONTROL_STOP:
		bRunning = FALSE;
		m_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
		break;

	case SERVICE_CONTROL_SHUTDOWN:
		bRunning = FALSE;
		m_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
		break;
	default:

		break;
	}
	SetServiceStatus(m_ServiceStatusHandle,&m_ServiceStatus);
}

BOOL InstallCmdService()
{
	char strDir[1024];//保存服务程序路径
	SC_HANDLE schSCManager, schService;//声明服务控制管理器的句柄,声明病毒服务的句柄
	LPCTSTR lpszBinaryPathName;//路径指针
	GetCurrentDirectory(1024,strDir);//获得当前文件夹
	GetModuleFileName(NULL,strDir,sizeof(strDir));//获得当前exe文件名
	lpszBinaryPathName = strDir;

	schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);//打开服务控制管理器
	if(schSCManager==NULL)//检查打开是否成功
	{
	    printf("maybe do not have the privilage\n");
		return FALSE;
	}
	schService = CreateService(schSCManager,"demo","冒充合法进程",
		SERVICE_ALL_ACCESS,//服务拥有所有访问权限
		SERVICE_WIN32_OWN_PROCESS,//Windows32类型的服务
		SERVICE_AUTO_START,//Windows32类型的服务
		SERVICE_ERROR_NORMAL,//采用默认方式进行错误处理,默认方式就是啥都不处理
		lpszBinaryPathName,//传入指针参数
		NULL,//不属于任何用户组
		NULL,//使用已存在的标签
		NULL,//独立的服务
		NULL,//本地系统账号密码为空
		NULL);
	if(schService == NULL)//判断安装是否成功
	{
	    printf("fail\n");
		return FALSE;
	}
	CloseServiceHandle(schService);
	return TRUE;
}

void DelServices()
{
	char name[100];//字符串保存服务名字
	SC_HANDLE scm;//打开服务控制管理器
	SC_HANDLE service;//判断服务状态
	SERVICE_STATUS status;//存放服务状态
	BOOL isSuccess;
	strcpy(name,"demo");
	if((scm=OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE))=NULL)
	{
	    printf("OpenSCManager Error");
		return;
	}
	service = OpenService(scm,name,SERVICE_ALL_ACCESS|DELETE);//删除所有权限
	if(!service)
	{
	    printf("OpenService error!");
		return;
	}
	isSuccess = QueryServiceStatus(service,&status);//查询服务状态
	if(!isSuccess)
	{
	    printf("OpenServiceStatus error!");
		return;
	}
	if(status.dwCurrentState != SERVICE_STOPPED)
	{
	    isSuccess = ControlService(service,SERVICE_CONTROL_STOP, &status);
		if(!isSuccess)
		{
		    printf("Stop Service error!");
			return;
		}
	}
	isSuccess = DeleteService(service);
	if(!isSuccess)
	{
	     printf("Delete Service Fail!");
	}
	else
	{
		printf("Delete Service Success!");
	}
	CloseServiceHandle(service);
	CloseServiceHandle(scm);
}

在这里插入图片描述

发布了18 篇原创文章 · 获赞 32 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/qq_42250189/article/details/104995376