#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);
}
9、服务安装与删除
猜你喜欢
转载自blog.csdn.net/qq_42250189/article/details/104995376
今日推荐
周排行