BOOL Start(LPCTSTR ServiceName, LPCTSTR *ServiceArgs, INT ArgCount) { SC_HANDLE hSCManager = NULL; SC_HANDLE hSc = NULL; LPSERVICE_STATUS_PROCESS pServiceInfo = NULL; #ifdef SCDBG LPCTSTR *TmpArgs = ServiceArgs; INT TmpCnt = ArgCount; _tprintf(_T("service to control - %s\n"), ServiceName); _tprintf(_T("Arguments:\n")); while (TmpCnt) { _tprintf(_T(" %s\n"), *TmpArgs); TmpArgs++; TmpCnt--; } _tprintf(_T("\n")); #endif /* SCDBG */ hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT); if (hSCManager == NULL) { ReportLastError(); return FALSE; } hSc = OpenService(hSCManager, ServiceName, SERVICE_START | SERVICE_QUERY_STATUS); if (hSc == NULL) goto fail; if (!ArgCount) { ServiceArgs = NULL; } if (! StartService(hSc, ArgCount, ServiceArgs)) { _tprintf(_T("[SC] StartService FAILED %lu:\n\n"), GetLastError()); goto fail; } pServiceInfo = QueryService(ServiceName); if (pServiceInfo != NULL) { PrintService(ServiceName, pServiceInfo, TRUE); } HeapFree(GetProcessHeap(), 0, pServiceInfo); CloseServiceHandle(hSc); CloseServiceHandle(hSCManager); return TRUE; fail: ReportLastError(); if (hSc) CloseServiceHandle(hSc); if (hSCManager) CloseServiceHandle(hSCManager); return FALSE; }
BOOL Control(DWORD Control, LPCTSTR ServiceName, LPCTSTR *Args, INT ArgCount) { SC_HANDLE hSCManager = NULL; SC_HANDLE hService = NULL; SERVICE_STATUS Status; DWORD dwDesiredAccess = 0; BOOL bResult = TRUE; SERVICE_STATUS_PROCESS StatusEx; #ifdef SCDBG LPCTSTR *TmpArgs = Args; INT TmpCnt = ArgCount; _tprintf(_T("service to control - %s\n"), ServiceName); _tprintf(_T("command - %lu\n"), Control); _tprintf(_T("Arguments:\n")); while (TmpCnt) { _tprintf(_T(" %s\n"), *TmpArgs); TmpArgs++; TmpCnt--; } _tprintf(_T("\n")); #endif /* SCDBG */ switch (Control) { case SERVICE_CONTROL_STOP: dwDesiredAccess = SERVICE_STOP; break; case SERVICE_CONTROL_PAUSE: dwDesiredAccess = SERVICE_PAUSE_CONTINUE; break; case SERVICE_CONTROL_CONTINUE: dwDesiredAccess = SERVICE_PAUSE_CONTINUE; break; case SERVICE_CONTROL_INTERROGATE: dwDesiredAccess = SERVICE_INTERROGATE; break; case SERVICE_CONTROL_SHUTDOWN: dwDesiredAccess = 0; break; } hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT); if (hSCManager == NULL) { _tprintf(_T("[SC] OpenSCManager FAILED %lu:\n\n"), GetLastError()); bResult = FALSE; goto done; } hService = OpenService(hSCManager, ServiceName, dwDesiredAccess); if (hService == NULL) { _tprintf(_T("[SC] OpenService FAILED %lu:\n\n"), GetLastError()); bResult = FALSE; goto done; } if (!ControlService(hService, Control, &Status)) { _tprintf(_T("[SC] ControlService FAILED %lu:\n\n"), GetLastError()); bResult = FALSE; goto done; } /* FIXME: lazy hack ;) */ CopyMemory(&StatusEx, &Status, sizeof(Status)); StatusEx.dwProcessId = 0; StatusEx.dwServiceFlags = 0; PrintService(ServiceName, &StatusEx, FALSE); done: if (!bResult) ReportLastError(); if (hService) CloseServiceHandle(hService); if (hSCManager) CloseServiceHandle(hSCManager); return bResult; }
BOOL Query(LPCTSTR *ServiceArgs, DWORD ArgCount, BOOL bExtended) { LPENUM_SERVICE_STATUS_PROCESS pServiceStatus = NULL; DWORD NumServices = 0; //DWORD ServiceType; //DWORD ServiceState; BOOL bServiceName = TRUE; DWORD OptSize, i; LPCTSTR *TmpArgs; INT TmpCnt; #ifdef SCDBG TmpArgs = ServiceArgs; TmpCnt = ArgCount; _tprintf(_T("Arguments:\n")); while (TmpCnt) { _tprintf(_T(" %s\n"), *TmpArgs); TmpArgs++; TmpCnt--; } _tprintf(_T("\n")); #endif /* SCDBG */ /* display all running services and drivers */ if (ArgCount == 0) { NumServices = EnumServices(&pServiceStatus, SERVICE_WIN32, SERVICE_ACTIVE); if (NumServices != 0) { for (i=0; i < NumServices; i++) { PrintService(pServiceStatus[i].lpServiceName, &pServiceStatus[i].ServiceStatusProcess, bExtended); } _tprintf(_T("number : %lu\n"), NumServices); if (pServiceStatus) HeapFree(GetProcessHeap(), 0, pServiceStatus); return TRUE; } return FALSE; } TmpArgs = ServiceArgs; TmpCnt = ArgCount; OptSize = sizeof(QueryOpts) / sizeof(QueryOpts[0]); while (TmpCnt--) { for (i=0; i < OptSize; i++) { if (!lstrcmpi(*TmpArgs, QueryOpts[i])) { bServiceName = FALSE; } } TmpArgs++; } /* FIXME: parse options */ /* print only the service requested */ if (bServiceName) { LPSERVICE_STATUS_PROCESS pStatus; LPCTSTR ServiceName = *ServiceArgs; pStatus = QueryService(ServiceName); if (pStatus) { PrintService(ServiceName, pStatus, bExtended); } } return TRUE; }