note : StartService

来源:互联网 发布:女民工团 知乎 编辑:程序博客网 时间:2024/04/28 09:44

今天要启动一个程序的2个服务,笔记和网上都有资料, 很普通的用法.

同事出于好意,给了一段启动服务的代码.

看了下,是他逆向过来的代码, 有着明显的IDA F5的痕迹。里面的常量没有整理.

那段代码的逻辑不是很严谨,回来整理了一下.


// testScm.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <windows.h>#include <winsvc.h>// 访问权限值// 0xF003Fu#define LS_SERVICE_ACCESS             (STANDARD_RIGHTS_REQUIRED     | \    SERVICE_QUERY_CONFIG         | \    SERVICE_CHANGE_CONFIG        | \    SERVICE_QUERY_STATUS         | \    SERVICE_ENUMERATE_DEPENDENTS | \    SERVICE_START                | \    SERVICE_STOP)/// 重试时间// 0x3e8u#define SLEEP_TIME  1000// 服务的名称#define SERVICE_ONE L"xxx"#define SERVICE_TWO L"yyy"BOOL StartServices();BOOL StartServices(SC_HANDLE & hSCManager, const WCHAR * pcServiceName);int _tmain(int argc, _TCHAR* argv[]){    BOOL    bRc = FALSE;    bRc = StartServices();    _tprintf(L"Services start %s\r\n", bRc ? L"TRUE" : L"FALSE");    _tprintf(L"END, press any to quit\r\n");    getwchar();return 0;}BOOL StartServices(SC_HANDLE & hSCManager, const WCHAR * pcServiceName){    BOOL            bRc = FALSE;    int             iRetryCnt = 0;    DWORD           dwDesiredAccess = LS_SERVICE_ACCESS;    SC_HANDLE       hSCObject = NULL;    SERVICE_STATUS  ServiceStatus;    if (NULL == pcServiceName)        return FALSE;    ::ZeroMemory(&ServiceStatus, sizeof(SERVICE_STATUS));    hSCObject = OpenServiceW(hSCManager, pcServiceName, dwDesiredAccess);    if (NULL != hSCObject)    {        if (QueryServiceStatus(hSCObject, &ServiceStatus))        {            if (SERVICE_RUNNING == ServiceStatus.dwCurrentState)            {                /// 如果服务原本就是启动的, do nothing                bRc = TRUE;            }            else if (StartServiceW(hSCObject, 0, 0))            {                /// 启动服务成功后, 查询服务启动后的状态, 最多重试10次                do                {                    if (!QueryServiceStatus(hSCObject, &ServiceStatus))                        break;                    if (SERVICE_RUNNING == ServiceStatus.dwCurrentState)                    {                        bRc = TRUE;                        break;                    }                    Sleep(SLEEP_TIME);                } while (++iRetryCnt <= 10);            }        }        CloseServiceHandle(hSCObject);    }    return bRc;}BOOL StartServices(){    BOOL bRc = FALSE;    SC_HANDLE hSCManager = NULL;    hSCManager = OpenSCManagerW(0, 0, SERVICE_QUERY_CONFIG);    if ( hSCManager )    {        /// 这个程序有多个服务, 要都启动成功,才算成功        bRc = StartServices(hSCManager, SERVICE_ONE);        if (bRc)            bRc = StartServices(hSCManager, SERVICE_TWO);        CloseServiceHandle(hSCManager);    }    return bRc;}



0 0