start.c

来自「一个类似windows」· C语言 代码 · 共 112 行

C
112
字号
/*
 * COPYRIGHT:   See COPYING in the top level directory
 * PROJECT:     ReactOS SC utility
 * FILE:        subsys/system/sc/start.c
 * PURPOSE:     control ReactOS services
 * PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com)
 * REVISIONS:
 *           Ged Murphy 20/10/05 Created
 *
 */

#include "sc.h"

BOOL Start(LPCTSTR ServiceName, LPCTSTR *ServiceArgs, INT ArgCount)
{
    SC_HANDLE hSc;
    SERVICE_STATUS_PROCESS ServiceStatus, ServiceStatus2;
    DWORD BytesNeeded;

#ifdef SCDBG  
    /* testing */
    _tprintf(_T("service to start - %s\n\n"), ServiceName);
    _tprintf(_T("Arguments :\n"));
    while (*ServiceArgs)
    {
        printf("%s\n", *ServiceArgs);
        ServiceArgs++;
    }
#endif    

    /* get a handle to the service requested for starting */
    hSc = OpenService(hSCManager, ServiceName, SERVICE_ALL_ACCESS);

    if (hSc == NULL)
    {
        _tprintf(_T("openService failed\n"));
        ReportLastError();
        return FALSE;
    }

    /* start the service opened */
    if (! StartService(hSc, ArgCount, ServiceArgs))
    {
		_tprintf(_T("[SC] StartService FAILED %lu:\n\n"), GetLastError());
        ReportLastError();
        return FALSE;
    }
    
    if (! QueryServiceStatusEx(
            hSc,
            SC_STATUS_PROCESS_INFO,
            (LPBYTE)&ServiceStatus,
            sizeof(SERVICE_STATUS_PROCESS),
            &BytesNeeded))
    {
        _tprintf(_T("QueryServiceStatusEx 1 failed\n"));
        ReportLastError();
        return FALSE;
    }

    
    while (ServiceStatus.dwCurrentState == SERVICE_START_PENDING)
    {
        /* wait before checking status */
        Sleep(ServiceStatus.dwWaitHint);
        
        /* check status again */
        if (! QueryServiceStatusEx(
                hSc,
                SC_STATUS_PROCESS_INFO,
                (LPBYTE)&ServiceStatus,
                sizeof(SERVICE_STATUS_PROCESS),
                &BytesNeeded))
        {
            _tprintf(_T("QueryServiceStatusEx 2 failed\n"));
            ReportLastError();
            return FALSE;
        }
    }

	QueryServiceStatusEx(hSc, SC_STATUS_PROCESS_INFO, (LPBYTE)&ServiceStatus2, 
		sizeof(SERVICE_STATUS_PROCESS), &BytesNeeded);

    CloseServiceHandle(hSc);
    
    if (ServiceStatus.dwCurrentState == SERVICE_RUNNING)
    {
        _tprintf(_T("\nSERVICE_NAME: %s\n"), ServiceName);
        _tprintf(_T("\tTYPE               : %lu\n"), ServiceStatus2.dwServiceType);
        _tprintf(_T("\tSTATE              : %lu\n"), ServiceStatus2.dwCurrentState);
		_tprintf(_T("\tWIN32_EXIT_CODE    : %lu\n"), ServiceStatus2.dwWin32ExitCode);
		_tprintf(_T("\tCHECKPOINT         : %lu\n"), ServiceStatus2.dwCheckPoint);
		_tprintf(_T("\tWAIT_HINT          : %lu\n"), ServiceStatus2.dwWaitHint);
		_tprintf(_T("\tPID                : %lu\n"), ServiceStatus2.dwProcessId);
		_tprintf(_T("\tFLAGS              : %lu\n"), ServiceStatus2.dwServiceFlags);

        return TRUE;
    }
    else
    {
        _tprintf(_T("Failed to start %s\n"), ServiceName);
        _tprintf(_T("Curent state: %lu\n"), ServiceStatus.dwCurrentState);
        _tprintf(_T("Exit code: %lu\n"), ServiceStatus.dwWin32ExitCode);
        _tprintf(_T("Service Specific exit code: %lu\n"),
                ServiceStatus.dwServiceSpecificExitCode);
        _tprintf(_T("Check point: %lu\n"), ServiceStatus.dwCheckPoint);
        _tprintf(_T("Wait hint: %lu\n"), ServiceStatus.dwWaitHint);
        
        return FALSE;
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?