服务是指执行指定系统功能的程序、历程或进程,以便支持其他程序,尤其是底层(接近硬件)程序。
// Services.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #pragma comment(lib,"ws2_32.lib") void WINAPI ServiceMain(DWORD,LPTSTR *); void WINAPI ServiceCtrlHandler(DWORD Opcode); void door(); BOOL InstallCmdService(); void DelServices(); BOOL bRunning=true; SERVICE_STATUS m_ServiceStatus; SERVICE_STATUS_HANDLE m_ServiceStatusHandle; int _tmain(int argc, _TCHAR* argv[]) { SERVICE_TABLE_ENTRY DispathTable[]={ {"system",ServiceMain}, {NULL,NULL} }; if(argc==2){ if(!_stricmp(argv[1],"-i")){ //第二个参数等于 install InstallCmdService(); } return 0; } StartServiceCtrlDispatcherA(DispathTable); return 0; } //服务主函数 void WINAPI ServiceMain(DWORD dwArgc, LPTSTR * lpArgv){ m_ServiceStatus.dwServiceType=SERVICE_WIN32; m_ServiceStatus.dwCurrentState=SERVICE_START_PENDING; m_ServiceStatus.dwControlsAccepted=SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE; m_ServiceStatus.dwWin32ExitCode=0; m_ServiceStatus.dwServiceSpecificExitCode=0; m_ServiceStatus.dwCheckPoint=0; m_ServiceStatus.dwWaitHint=0; m_ServiceStatusHandle=RegisterServiceCtrlHandler("system",ServiceCtrlHandler); if(m_ServiceStatusHandle==(SERVICE_STATUS_HANDLE)0) return ; m_ServiceStatus.dwCurrentState=SERVICE_RUNNING; m_ServiceStatus.dwCheckPoint=0; m_ServiceStatus.dwWaitHint=0; if(SetServiceStatus(m_ServiceStatusHandle,&m_ServiceStatus)){ bRunning=true; door(); } return; } void WINAPI ServiceCtrlHandler(DWORD Opcode){ switch(Opcode){ case SERVICE_CONTROL_PAUSE: m_ServiceStatus.dwCurrentState=SERVICE_PAUSED; break; case SERVICE_CONTROL_CONTINUE: m_ServiceStatus.dwCurrentState=SERVICE_RUNNING; break; case SERVICE_CONTROL_STOP: m_ServiceStatus.dwCurrentState=SERVICE_STOPPED; m_ServiceStatus.dwWin32ExitCode=0; m_ServiceStatus.dwServiceSpecificExitCode=0; m_ServiceStatus.dwCheckPoint=0; m_ServiceStatus.dwWaitHint=0; SetServiceStatus(m_ServiceStatusHandle,&m_ServiceStatus); break; case SERVICE_CONTROL_INTERROGATE: break; } } void door(){ printf("sign"); } BOOL InstallCmdService(){ char strDir[1024]; char sysDir[1024]; SC_HANDLE schSCManager,schService; GetModuleFileName(NULL,strDir,sizeof(strDir)); GetSystemDirectory(sysDir,sizeof(sysDir)); strcat(sysDir,"\\system.exe"); if(CopyFile(strDir,sysDir,FALSE)) printf("Copy file ok \n"); strcpy(strDir,sysDir); schSCManager=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); if(schSCManager==NULL){ printf("open scmanger failed \n"); return false; } LPCTSTR lpszBinaryPathName=strDir; schService=CreateService(schSCManager, "system", "system", //将服务信息添加到SCM的数据库中 SERVICE_ALL_ACCESS, //访问权限 SERVICE_WIN32_OWN_PROCESS, //服务类型 SERVICE_AUTO_START, //自启类型 SERVICE_ERROR_NORMAL, //错误控制类型 lpszBinaryPathName, //服务名 NULL, NULL, NULL, NULL, NULL ); if(schService){ printf("install service sucess!\n"); } else{ return false; } CloseServiceHandle(schService); return true; } void DelService(){ char name[100]; SC_HANDLE scm; SC_HANDLE service; SERVICE_STATUS status; strcpy(name,"system"); if(scm=OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE)==NULL){ printf("OpenSCManager Error "); } service=OpenService(scm,name,SERVICE_ALL_ACCESS | DELETE); if(!service){ printf("OpenService error"); } BOOL isSuccess=QueryServiceStatus(service,&status); if(!isSuccess){ printf("QueryServiceStatus error !"); return ; } if(status.dwCurrentState!=SERVICE_STOPPED){ isSuccess=ControlService(service,SERVICE_STOPPED,&status); if(!isSuccess){ printf("stop service error"); } Sleep(500); } isSuccess=DeleteService(service); if(!isSuccess){ printf("Delete Service Fail !"); } else{ printf("Delete Service Success !"); } CloseServiceHandle(service); CloseServiceHandle(scm); }