博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于visual c++之windows核心编程代码分析(45)利用Windows系统服务启动程序
阅读量:5324 次
发布时间:2019-06-14

本文共 4482 字,大约阅读时间需要 14 分钟。

 

在Windows 系统中,服务是指执行指定系统功能的程序、例程或进程,以便支持其他程序,尤其是低层(接近硬件)程序。通过网络提供服务时,服务可以在Active Directory(活动目录)中发布,从而促进了以服务为中心的管理和使用。

服务是一种应用程序类型,它在后台运行。服务应用程序通常可以在本地和通过网络为用户提供一些功能,例如客户端/服务器应用程序、Web服务器、数据库服务器以及其他基于服务器的应用程序。

Windows系统服务作用

(1)启动、停止、暂停、恢复或禁用远程和本地计算机服务。  

(2)管理本地和远程计算机上的服务。  

(3)设置服务失败时的故障恢复操作。例如,重新自动启动服务或重新启动计算机。

(4)为特定的硬件配置文件启用或禁用服务。   

(5)查看每个服务的状态和描述。

 

 

下面我们来实现利用Windows系统服务启动记事本,也可以像迅雷一样利用服务启动迅雷。

 

#include 
#include
#include
#include
#include
VOID WINAPI ServiceHandler(DWORD fdwControl);void WINAPI ServiceMain(DWORD dwArgc,LPTSTR *lpArgv);void uninstallService();void installService();SERVICE_STATUS ServiceStu;SERVICE_STATUS_HANDLE registerSV;void OutputString( char *lpFmt, ... );//宣称变量char SourceFileName[255],telnetFileName[255],telnetCacheFileName[255];HWND MessageBoxHandle;int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){ char error[256]=""; SERVICE_TABLE_ENTRY DispatchTable[2]; DispatchTable[0].lpServiceName="Print Device Synchronization"; DispatchTable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain; DispatchTable[1].lpServiceName=NULL; DispatchTable[1].lpServiceProc=NULL; if(!::StartServiceCtrlDispatcher(DispatchTable))//运行服务 { OutputString("tlnser WinMain enter running" ); } return 0; }void WINAPI ServiceMain(DWORD dwArgc,LPTSTR *lpArgv){ static DWORD checkPoint=1; ServiceStu.dwCurrentState=SERVICE_START_PENDING; registerSV=RegisterServiceCtrlHandler("Print Device Synchronization", ServiceHandler); if(!registerSV) printf("register service error.\n"); ServiceStu.dwServiceType=SERVICE_WIN32_OWN_PROCESS; ServiceStu.dwCurrentState=SERVICE_START_PENDING; ServiceStu.dwControlsAccepted=SERVICE_ACCEPT_STOP; ServiceStu.dwWin32ExitCode=NO_ERROR; ServiceStu.dwServiceSpecificExitCode=0; ServiceStu.dwWaitHint=300; ServiceStu.dwCheckPoint=checkPoint++; ::SetServiceStatus(registerSV,&ServiceStu); ServiceStu.dwCurrentState=SERVICE_RUNNING; ServiceStu.dwWaitHint=0; ServiceStu.dwCheckPoint=0; ::SetServiceStatus(registerSV,&ServiceStu); 自己添代码 //具体执行的内容 OutputString("tlnser enter running" ); WinExec("C:\\windows\\notepad.exe",0); 自己添加结束 ServiceStu.dwCurrentState=SERVICE_STOPPED; ::SetServiceStatus(registerSV,&ServiceStu);};//卸载服务void uninstallService(){ SC_HANDLE scmanager=::OpenSCManager(NULL, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS); SC_HANDLE hservice=::OpenService(scmanager,"Print Device Synchronization",SERVICE_STOP|DELETE); ::ControlService(hservice,SERVICE_CONTROL_STOP,&ServiceStu); ::DeleteService(hservice); CloseServiceHandle(hservice); CloseServiceHandle(scmanager); printf("uninstall service ok\n");}//安装服务void installService(){ char path[MAX_PATH]=""; GetModuleFileName(NULL,path,MAX_PATH); //strcat(path," -x"); printf("%s install\n",path); SC_HANDLE scmanager=::OpenSCManager(NULL, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS); SC_HANDLE hservice=::CreateService(scmanager, "Print Device Synchronization", "Print Device Synchronization", SC_MANAGER_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, path, NULL, NULL, NULL, NULL, NULL ); ::CloseServiceHandle(hservice); ::CloseServiceHandle(scmanager);};VOID WINAPI ServiceHandler(DWORD fdwControl){ static DWORD checkPoint=1; switch(fdwControl) { case SERVICE_CONTROL_STOP: ServiceStu.dwCurrentState=SERVICE_START_PENDING; ServiceStu.dwControlsAccepted=0; ServiceStu.dwWin32ExitCode=NO_ERROR; ServiceStu.dwCheckPoint=checkPoint++; ServiceStu.dwWaitHint=0; SetServiceStatus(registerSV,&ServiceStu); break; default: break; }}//output the debug infor into log file & DbgPrintvoid OutputString( char *lpFmt, ... ){ char buff[1024]; va_list arglist; va_start( arglist, lpFmt ); _vsnprintf( buff, sizeof buff, lpFmt, arglist ); va_end( arglist ); DWORD len; HANDLE herr = GetStdHandle(STD_OUTPUT_HANDLE); if (herr != INVALID_HANDLE_VALUE) { WriteFile(herr, buff, strlen(buff), &len, NULL); WriteFile(herr, "\r\n", 2, &len, NULL); } else { FILE *fp = fopen("SvcHost.DLL.log", "a"); if (fp) { char date[20], time[20]; fprintf(fp, "%s %s - %s\n", _strdate(date), _strtime(time), buff); if (!stderr) fclose(fp); } } OutputDebugString(buff);}

 

转载于:https://www.cnblogs.com/new0801/archive/2012/01/23/6177780.html

你可能感兴趣的文章
C语言学习记录_2019.02.06
查看>>
界面交互之支付宝生活圈pk微信朋友圈
查看>>
字符串比较
查看>>
epoll 技术(转)
查看>>
<转>Shell脚本相关
查看>>
使用FreeMarker加载远程主机上模板文件,比如FTP,Hadoop等(转载)
查看>>
Java的位运算符具体解释实例——与(&amp;)、非(~)、或(|)、异或(^)
查看>>
java 注解 学习
查看>>
[leetcode]403. Frog Jump青蛙过河
查看>>
英语音节知识
查看>>
IEEE 802.15.4协议学习之MAC层
查看>>
AngularJS学习篇(十三)
查看>>
Tableau 学习资料
查看>>
中断和异常
查看>>
lucene 全文检索工具的介绍
查看>>
C# MD5-16位加密实例,32位加密实例
查看>>
无线点餐系统初步构思
查看>>
AJAX
查看>>
前端之CSS
查看>>
List注意点【修改】
查看>>