Files
2021-05-17 00:36:08 +07:00

154 lines
4.5 KiB
C++

#include "stdafx.h"
//--------------------------------------------------------------------------------------
BOOL ServiceStart(char *lpszName, char *lpszPath, BOOL bCreate)
{
BOOL bRet = FALSE;
SC_HANDLE hManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hManager)
{
SC_HANDLE hService = NULL;
if (bCreate)
{
// create service for kernel-mode driver
hService = CreateService(
hManager, lpszName, lpszName, SERVICE_START | DELETE | SERVICE_STOP,
SERVICE_KERNEL_DRIVER, SERVICE_SYSTEM_START, SERVICE_ERROR_IGNORE,
lpszPath, NULL, NULL, NULL, NULL, NULL
);
if (hService == NULL)
{
if (GetLastError() == ERROR_SERVICE_EXISTS)
{
// open existing service
if ((hService = OpenService(hManager, lpszName, SERVICE_START | DELETE | SERVICE_STOP)) == NULL)
{
DbgMsg(__FILE__, __LINE__, "OpenService() ERROR %d\n", GetLastError());
}
}
else
{
DbgMsg(__FILE__, __LINE__, "CreateService() ERROR %d\n", GetLastError());
}
}
}
else
{
// open existing service
hService = OpenService(hManager, lpszName, SERVICE_START | DELETE | SERVICE_STOP);
}
if (hService)
{
// start service
if (StartService(hService, 0, NULL))
{
bRet = TRUE;
}
else
{
if (GetLastError() == ERROR_SERVICE_ALREADY_RUNNING)
{
// service is already started
bRet = TRUE;
}
else
{
DbgMsg(__FILE__, __LINE__, "StartService() ERROR %d\n", GetLastError());
}
}
CloseServiceHandle(hService);
}
CloseServiceHandle(hManager);
}
else
{
DbgMsg(__FILE__, __LINE__, "OpenSCManager() ERROR %d\n", GetLastError());
}
return bRet;
}
//--------------------------------------------------------------------------------------
BOOL ServiceStop(char *lpszName)
{
BOOL bRet = FALSE;
SC_HANDLE hManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hManager)
{
// open existing service
SC_HANDLE hService = OpenService(hManager, lpszName, SERVICE_ALL_ACCESS);
if (hService)
{
SERVICE_STATUS Status;
// stop service
if (ControlService(hService, SERVICE_CONTROL_STOP, &Status))
{
bRet = TRUE;
}
else
{
DbgMsg(__FILE__, __LINE__, "ControlService() ERROR %d\n", GetLastError());
}
CloseServiceHandle(hService);
}
else
{
DbgMsg(__FILE__, __LINE__, "OpenService() ERROR %d\n", GetLastError());
}
CloseServiceHandle(hManager);
}
else
{
DbgMsg(__FILE__, __LINE__, "OpenSCManager() ERROR %d\n", GetLastError());
}
return bRet;
}
//--------------------------------------------------------------------------------------
BOOL ServiceRemove(char *lpszName)
{
BOOL bRet = FALSE;
SC_HANDLE hManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hManager)
{
// open existing service
SC_HANDLE hService = OpenService(hManager, lpszName, SERVICE_ALL_ACCESS);
if (hService)
{
// delete service
if (DeleteService(hService))
{
bRet = TRUE;
}
else
{
DbgMsg(__FILE__, __LINE__, "DeleteService() ERROR %d\n", GetLastError());
}
CloseServiceHandle(hService);
}
else
{
DbgMsg(__FILE__, __LINE__, "OpenService() ERROR %d\n", GetLastError());
}
CloseServiceHandle(hManager);
}
else
{
DbgMsg(__FILE__, __LINE__, "OpenSCManager() ERROR %d\n", GetLastError());
}
return bRet;
}
//--------------------------------------------------------------------------------------
// EoF