VC添加服务代码(转)
VC没发现就自己花了2天时间写了个 写好后拿给 NB 看 他说他以前写了 就把代码发出来吧

我的代码
#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; 
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
NB的代码
#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;
}
 
                    
                     
                    
                 
                    
                 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号