vc编写系统服务

原创 2011年01月19日 17:15:00
#include
<
afx.h
>


void WINAPI ServiceMain(); // 服务主函数
void WINAPI ServiceStrl(DWORD); // 服务控制
void Init(); // 初始化
BOOL IsInstalled(); // 判断服务是否已安装
BOOL Install(); // 安装服务
BOOL UnInstall(); // 卸载服务
void Action(); // 服务任务
char chServiceName[] = " MyService " ; // 服务名称
char chServiceDisplayName[] = " MyService " ; // 服务显示名称
char chServiceDescription[] = " My service description. " ; // 服务描述
SERVICE_STATUS_HANDLE hServiceStatus; // 服务句柄
SERVICE_STATUS ServiceStatus; // 服务状态
DWORD dwThreadId; // 进程ID

// 程序主函数
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd)
{

// 初始化
Init();

// 获取进程ID
dwThreadId = ::GetCurrentThreadId();

// 判断命令行参数,决定动作
if (stricmp(lpCmdLine, " /install " ) == 0 )
if ( ! IsInstalled())
if ( ! Install())
return 1 ;
else if (stricmp(lpCmdLine, " /uninstall " ) == 0 )
if (IsInstalled())
if ( ! UnInstall())
return 1 ;
else
{
SERVICE_TABLE_ENTRY ServiceTableEntry[]
=
{
{chServiceName,(LPSERVICE_MAIN_FUNCTION)ServiceMain},
{NULL,NULL}
};
::StartServiceCtrlDispatcher(ServiceTableEntry);
}
return 0 ;
}

// 初始化
void Init()
{
hServiceStatus
= NULL;
ServiceStatus.dwServiceType
= SERVICE_WIN32_OWN_PROCESS;
ServiceStatus.dwCurrentState
= SERVICE_STOPPED;
ServiceStatus.dwControlsAccepted
= SERVICE_ACCEPT_STOP;
ServiceStatus.dwWin32ExitCode
= 0 ;
ServiceStatus.dwServiceSpecificExitCode
= 0 ;
ServiceStatus.dwCheckPoint
= 0 ;
ServiceStatus.dwWaitHint
= 0 ;
}

// 服务主函数
void WINAPI ServiceMain()
{
ServiceStatus.dwCurrentState
= SERVICE_START_PENDING;
ServiceStatus.dwControlsAccepted
= SERVICE_ACCEPT_STOP;

// 注册服务控制函数
hServiceStatus = RegisterServiceCtrlHandler(chServiceName,ServiceStrl);
if ( ! hServiceStatus)
{
MessageBox(NULL,
" 注册控制服务失败! " , "" ,MB_OK);
return ;
}

// 设置服务状态
SetServiceStatus(hServiceStatus, & ServiceStatus);

ServiceStatus.dwWin32ExitCode
= S_OK;
ServiceStatus.dwCheckPoint
= 0 ;
ServiceStatus.dwWaitHint
= 0 ;
ServiceStatus.dwCurrentState
= SERVICE_RUNNING;
SetServiceStatus(hServiceStatus,
& ServiceStatus);

// 服务任务部分
Action();

// 退出服务
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(hServiceStatus,
& ServiceStatus);
}

// 服务控制函数
void WINAPI ServiceStrl(DWORD dwMsg)
{
switch (dwMsg)
{
case SERVICE_CONTROL_STOP:
ServiceStatus.dwCurrentState
= SERVICE_STOP_PENDING;
SetServiceStatus(hServiceStatus,
& ServiceStatus);
PostThreadMessage(dwThreadId,WM_CLOSE,
0 , 0 );
break ;
case SERVICE_CONTROL_PAUSE:
break ;
case SERVICE_CONTROL_CONTINUE:
break ;
case SERVICE_CONTROL_INTERROGATE:
break ;
case SERVICE_CONTROL_SHUTDOWN:
break ;
case SERVICE_CONTROL_PARAMCHANGE:
break ;
default :
break ;
}
}

// 安装服务
BOOL Install()
{
// 打开服务控制管理器
SC_HANDLE hSCM = ::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if ( ! hSCM)
return FALSE;

char chFilePathName[MAX_PATH];
CString strFileName;
char chSystemPath[MAX_PATH];
char * chNewFileName;

// 获取自身程序文件名和系统目录
::GetModuleFileName(NULL,chFilePathName,MAX_PATH);
strFileName
= chFilePathName;
while (strFileName.Find( " // " , 0 ) !=- 1 )
strFileName
= strFileName.Right(strFileName.GetLength() - strFileName.Find( " // " , 0 ) - 1 );

// 截取系统目录字符串,设置为system目录
::GetSystemDirectory(chSystemPath,MAX_PATH);
for ( int n = 0 ;(unsigned int )n < strlen(chSystemPath);n ++ )
{
if (chSystemPath[n] == ' 3 ' )
chSystemPath[n]
= ' /0 ' ;
}
chNewFileName
= strcat(chSystemPath, " // " );
chNewFileName
= strcat(chSystemPath,strFileName);

// 将自身复制到系统system目录下
::CopyFile(chFilePathName,chNewFileName,FALSE);

// 创建服务
SC_HANDLE hService = ::CreateService(hSCM,chServiceName,chServiceDisplayName,
SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,SERVICE_DEMAND_START,SERVICE_ERROR_NORMAL,
chNewFileName,NULL,NULL,NULL,NULL,NULL);

// 设置服务描述
SERVICE_DESCRIPTION ServiceDescription;
ServiceDescription.lpDescription
= chServiceDescription;
::ChangeServiceConfig2(hService,SERVICE_CONFIG_DESCRIPTION,
& ServiceDescription);

// 释放句柄
CloseServiceHandle(hSCM);

if ( ! hService)
return FALSE;

// 释放句柄
CloseServiceHandle(hService);

MessageBox(NULL,
" Install done! " , "" ,MB_OK);

return TRUE;
}

// 判断服务是否已安装
BOOL IsInstalled()
{
// 打开服务控制管理器
SC_HANDLE hSCM = ::OpenSCManager(NULL,NULL,SERVICE_ALL_ACCESS);
if ( ! hSCM)
return FALSE;

// 打开服务
SC_HANDLE hService = ::OpenService(hSCM,chServiceName,SERVICE_QUERY_CONFIG);
if ( ! hService)
return FALSE;

// 释放句柄
CloseServiceHandle(hSCM);
CloseServiceHandle(hService);

return TRUE;
}

// 卸载服务
BOOL UnInstall()
{
// 打开服务控制管理器
SC_HANDLE hSCM = ::OpenSCManager(NULL,NULL,SERVICE_ALL_ACCESS);
if ( ! hSCM)
return FALSE;

// 打开服务
SC_HANDLE hService = ::OpenService(hSCM,chServiceName,SERVICE_STOP | DELETE);
if ( ! hService)
return FALSE;

// 停止服务
SERVICE_STATUS ServiceStatus;
::ControlService(hService,SERVICE_CONTROL_STOP,
& ServiceStatus);

// 删除服务
if (::DeleteService(hService))
return FALSE;

// 释放句柄
CloseServiceHandle(hSCM);
CloseServiceHandle(hService);

MessageBox(NULL,
" UnInstall done! " , "" ,MB_OK);

return TRUE;
}

// 服务任务
void Action()
{
MessageBox(NULL,
" Service running! " , " NULL " ,MB_OK);
Sleep(
10000 );
}

VC编写系统服务程序笔记

转载自:http://blog.csdn.net/pgshow/article/details/7677583 [cpp] view plaincopy ...
  • u012410612
  • u012410612
  • 2013年10月26日 21:57
  • 1200

用 VC 2008 编写 Windows Service(系统服务) atl 编写系统服务

http://hi.baidu.com/lewutian/item/9019396a05d517166995e6a5 http://hi.baidu.com/cntrump/item/2bf6b43...
  • smallnew198705
  • smallnew198705
  • 2014年03月30日 16:27
  • 1514

用 VC++ 2008 编写 Windows Service(系统服务)

 用 VC++ 2008 编写 Windows Service(系统服务)2008-03-30 08:08现在许多 Windows Service 应用都可以用 c# 很好的完成,不过毕竟是托管代码...
  • ljz888666555
  • ljz888666555
  • 2009年11月06日 17:12
  • 5358

C/C++ 创建windows系统服务程序

Windows上面的程序可以分为前台运行和后台运行,像windows的系统服务都是属于后台程序。 那如何将一个程序变成后台运行呢? 可以在 cmd里面用sc命令来操作:Windows 服务的安装和卸载...
  • xiaoyafang123
  • xiaoyafang123
  • 2016年08月17日 22:20
  • 1557

VC 启动服务

#include else { SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT)); // 选择重试后重启hasp加密锁服务,...
  • u010803748
  • u010803748
  • 2016年11月17日 09:58
  • 111

Windows操作系统服务编写原理

本文转载自:http://soft.chinabyte.com/os/368/12251368.shtml 有那么一类应用程序,是能够为各种用户(包括本地用户和远程用户)所用的,拥有用户授权...
  • Lady__Killer
  • Lady__Killer
  • 2016年11月24日 16:42
  • 650

C++枚举系统服务

突然想仿照XueTr中的服务管理写个小程序。 hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); 打开服务管理器,SC_MANAGER...
  • Sidyhe
  • Sidyhe
  • 2011年12月31日 21:10
  • 4036

vc获取系统服务信息

对系统服务的管理几乎是木马必不可少的功能了,比如神气儿,上兴远程控制等要是能我们给自己的木马加上这个功能,看着也不赖。我们实现的效果如图3-4所示 图3 图4 好啦,现在开始干活 取得配置权限  在...
  • houjinfeng210
  • houjinfeng210
  • 2010年05月11日 11:12
  • 7612

WindowsNT/2000/XP系统服务程序开发模版

关键字: vc   系统服务   开发 程序 //以下程序为Win32控制台项目中编写。//一、要添加的头文件#include "winsvc.h"//二、全局变量、全局函数定义//服务全局变量SER...
  • sharkly
  • sharkly
  • 2006年04月25日 14:59
  • 1536

Android系统开发之一:添加系统级服务方法

说明:本次说的系统服务,是指捆绑在system_process进程中的服务。 仔细阅读源码可以发现,在frameworks/base/services/java/com/android/server/...
  • cbk861110
  • cbk861110
  • 2016年03月15日 19:28
  • 2534
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:vc编写系统服务
举报原因:
原因补充:

(最多只允许输入30个字)