Formatting changes

This commit is contained in:
kdeng00
2020-12-05 23:20:40 -05:00
parent 37af458d5f
commit 12450e2f0e
6 changed files with 559 additions and 559 deletions
+83 -83
View File
@@ -17,7 +17,7 @@
template<typename Handle = SC_HANDLE, typename Char = wchar_t>
VOID ServiceInstall(void);
template<typename TSTR = LPTSTR, typename CTSTR = LPCTSTR,
typename Handle = HANDLE, typename Char = TCHAR>
typename Handle = HANDLE, typename Char = TCHAR>
VOID ServiceReportEvent(LPTSTR);
std::shared_ptr<models::ServiceInfo<>> service_info(new models::ServiceInfo<>(L"Service Example"));
@@ -27,32 +27,32 @@ std::shared_ptr<models::ServiceInfo<>> service_info(new models::ServiceInfo<>(L"
int _tmain(int argc, TCHAR *argv[])
{
std::cout << "ServiceExample\n";
std::cout << "ServiceExample\n";
if (lstrcmpi(argv[1], TEXT("install")) == 0)
{
ServiceInstall();
if (lstrcmpi(argv[1], TEXT("install")) == 0)
{
ServiceInstall();
return -1;
}
return -1;
}
SERVICE_TABLE_ENTRY SERVICETABLE[] =
{
{ service_info->service_name,
(LPSERVICE_MAIN_FUNCTION)
service::ServiceEntryPoint::service_main_start },
{ nullptr, nullptr },
};
SERVICE_TABLE_ENTRY SERVICETABLE[] =
{
{ service_info->service_name,
(LPSERVICE_MAIN_FUNCTION)
service::ServiceEntryPoint::service_main_start },
{ nullptr, nullptr },
};
if (!StartServiceCtrlDispatcher(SERVICETABLE))
{
auto func = reinterpret_cast<LPTSTR>(TEXT("StartServiceCtrlDispatcher"));
ServiceReportEvent(func);
}
if (!StartServiceCtrlDispatcher(SERVICETABLE))
{
auto func = reinterpret_cast<LPTSTR>(TEXT("StartServiceCtrlDispatcher"));
ServiceReportEvent(func);
}
return 0;
return 0;
}
@@ -60,89 +60,89 @@ int _tmain(int argc, TCHAR *argv[])
template<typename Handle, typename Char>
VOID ServiceInstall()
{
Char buffer[MAX_PATH];
Char buffer[MAX_PATH];
if (!GetModuleFileName(nullptr, buffer, MAX_PATH))
{
std::cout << "Cannot install service " << GetLastError() << "\n";
if (!GetModuleFileName(nullptr, buffer, MAX_PATH))
{
std::cout << "Cannot install service " << GetLastError() << "\n";
return;
}
return;
}
// Get a handle to the SCM database.
// Get a handle to the SCM database.
Handle schSCManager = OpenSCManager(
nullptr, // local computer
nullptr, // ServicesActive database
SC_MANAGER_ALL_ACCESS); // full access rights
Handle schSCManager = OpenSCManager(
nullptr, // local computer
nullptr, // ServicesActive database
SC_MANAGER_ALL_ACCESS); // full access rights
if (nullptr == schSCManager)
{
std::cout << "OpenSCManager failed " << GetLastError() << "\n";
if (nullptr == schSCManager)
{
std::cout << "OpenSCManager failed " << GetLastError() << "\n";
return;
}
return;
}
// Create the service
// Create the service
Handle schService = CreateService(
schSCManager, // SCM database
service_info->service_name, // name of service
service_info->service_name, // service name to display
SERVICE_ALL_ACCESS, // desired access
SERVICE_WIN32_OWN_PROCESS, // service type
SERVICE_DEMAND_START, // start type
SERVICE_ERROR_NORMAL, // error control type
buffer, // path to service's binary
nullptr, // no load ordering group
nullptr, // no tag identifier
nullptr, // no dependencies
nullptr, // LocalSystem account
nullptr); // no password
Handle schService = CreateService(
schSCManager, // SCM database
service_info->service_name, // name of service
service_info->service_name, // service name to display
SERVICE_ALL_ACCESS, // desired access
SERVICE_WIN32_OWN_PROCESS, // service type
SERVICE_DEMAND_START, // start type
SERVICE_ERROR_NORMAL, // error control type
buffer, // path to service's binary
nullptr, // no load ordering group
nullptr, // no tag identifier
nullptr, // no dependencies
nullptr, // LocalSystem account
nullptr); // no password
if (schService == nullptr)
{
std::cout << "CreateService failed " << GetLastError() << "\n";
if (schService == nullptr)
{
std::cout << "CreateService failed " << GetLastError() << "\n";
CloseServiceHandle(schSCManager);
return;
}
else
{
std::cout << "Service installed successfully\n";
}
CloseServiceHandle(schSCManager);
return;
}
else
{
std::cout << "Service installed successfully\n";
}
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
}
template<typename TStr, typename CTStr,
typename Handle, typename Char>
typename Handle, typename Char>
VOID ServiceReportEvent(LPTSTR szFunction)
{
CTStr lpszStrings[2];
Char Buffer[80];
CTStr lpszStrings[2];
Char Buffer[80];
Handle hEventSource = RegisterEventSource(nullptr, service_info->service_name);
Handle hEventSource = RegisterEventSource(nullptr, service_info->service_name);
if (nullptr != hEventSource)
{
StringCchPrintf(Buffer, 80, TEXT("%s failed with %d"), szFunction, GetLastError());
if (nullptr != hEventSource)
{
StringCchPrintf(Buffer, 80, TEXT("%s failed with %d"), szFunction, GetLastError());
lpszStrings[0] = service_info->service_name;
lpszStrings[1] = Buffer;
lpszStrings[0] = service_info->service_name;
lpszStrings[1] = Buffer;
ReportEvent(hEventSource, // event log handle
EVENTLOG_ERROR_TYPE, // event type
0, // event category
SERVICE_ERROR_NORMAL, // event identifier
nullptr, // no security identifier
2, // size of lpszStrings array
0, // no binary data
lpszStrings, // array of strings
nullptr); // no binary data
ReportEvent(hEventSource, // event log handle
EVENTLOG_ERROR_TYPE, // event type
0, // event category
SERVICE_ERROR_NORMAL, // event identifier
nullptr, // no security identifier
2, // size of lpszStrings array
0, // no binary data
lpszStrings, // array of strings
nullptr); // no binary data
DeregisterEventSource(hEventSource);
}
DeregisterEventSource(hEventSource);
}
}
+22 -22
View File
@@ -6,29 +6,29 @@
namespace models
{
template<typename Str = std::wstring,
typename Char = wchar_t,
typename Status = SERVICE_STATUS,
typename StatusHandle = SERVICE_STATUS_HANDLE,
typename Handle = HANDLE>
class ServiceInfo
{
public:
ServiceInfo()
{
service_stop_event = INVALID_HANDLE_VALUE;
}
ServiceInfo(std::wstring &&name) :
service_name(const_cast<wchar_t*>(name.c_str()))
{
service_stop_event = INVALID_HANDLE_VALUE;
}
template<typename Str = std::wstring,
typename Char = wchar_t,
typename Status = SERVICE_STATUS,
typename StatusHandle = SERVICE_STATUS_HANDLE,
typename Handle = HANDLE>
class ServiceInfo
{
public:
ServiceInfo()
{
service_stop_event = INVALID_HANDLE_VALUE;
}
ServiceInfo(std::wstring &&name) :
service_name(const_cast<wchar_t*>(name.c_str()))
{
service_stop_event = INVALID_HANDLE_VALUE;
}
wchar_t *service_name;
Status service_status;
StatusHandle service_handle;
Handle service_stop_event;
};
wchar_t *service_name;
Status service_status;
StatusHandle service_handle;
Handle service_stop_event;
};
}
#endif
+55 -55
View File
@@ -11,72 +11,72 @@
namespace service
{
class ServiceControlHandler
{
public:
template<typename D = DWORD,
typename Obj = models::ServiceInfo<>,
typename Ptr = std::shared_ptr<Obj>>
static VOID WINAPI ServiceCtrlHandler(D ctrlCode)
{
extern Ptr service_info;
class ServiceControlHandler
{
public:
template<typename D = DWORD,
typename Obj = models::ServiceInfo<>,
typename Ptr = std::shared_ptr<Obj>>
static VOID WINAPI ServiceCtrlHandler(D ctrlCode)
{
extern Ptr service_info;
switch (ctrlCode)
{
case SERVICE_CONTROL_STOP:
ReportServiceStatus<D>(SERVICE_STOP_PENDING, NO_ERROR, 0);
switch (ctrlCode)
{
case SERVICE_CONTROL_STOP:
ReportServiceStatus<D>(SERVICE_STOP_PENDING, NO_ERROR, 0);
SetEvent(service_info->service_stop_event);
ReportServiceStatus<D>(service_info->service_status.dwCurrentState, NO_ERROR, 0);
SetEvent(service_info->service_stop_event);
ReportServiceStatus<D>(service_info->service_status.dwCurrentState, NO_ERROR, 0);
return;
case SERVICE_CONTROL_INTERROGATE:
break;
default:
break;
}
}
return;
case SERVICE_CONTROL_INTERROGATE:
break;
default:
break;
}
}
template<typename D = DWORD,
typename Obj = models::ServiceInfo<>,
typename Ptr = std::shared_ptr<Obj>>
static VOID ReportServiceStatus(D dwCurrentState,
D dwWin32ExitCode,
D dwWaitHint)
{
extern Ptr service_info;
template<typename D = DWORD,
typename Obj = models::ServiceInfo<>,
typename Ptr = std::shared_ptr<Obj>>
static VOID ReportServiceStatus(D dwCurrentState,
D dwWin32ExitCode,
D dwWaitHint)
{
extern Ptr service_info;
static D dwCheckPoint = 1;
static D dwCheckPoint = 1;
service_info->service_status.dwCurrentState = dwCurrentState;
service_info->service_status.dwWin32ExitCode = dwWin32ExitCode;
service_info->service_status.dwWaitHint = dwWaitHint;
service_info->service_status.dwCurrentState = dwCurrentState;
service_info->service_status.dwWin32ExitCode = dwWin32ExitCode;
service_info->service_status.dwWaitHint = dwWaitHint;
if (dwCurrentState == SERVICE_START_PENDING)
{
service_info->service_status.dwControlsAccepted = 0;
}
else
{
service_info->service_status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
}
if (dwCurrentState == SERVICE_START_PENDING)
{
service_info->service_status.dwControlsAccepted = 0;
}
else
{
service_info->service_status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
}
if ((dwCurrentState == SERVICE_RUNNING) ||
(dwCurrentState == SERVICE_STOPPED))
{
service_info->service_status.dwCheckPoint = 0;
}
else
{
service_info->service_status.dwCheckPoint = dwCheckPoint++;
}
if ((dwCurrentState == SERVICE_RUNNING) ||
(dwCurrentState == SERVICE_STOPPED))
{
service_info->service_status.dwCheckPoint = 0;
}
else
{
service_info->service_status.dwCheckPoint = dwCheckPoint++;
}
SetServiceStatus(service_info->service_handle, &service_info->service_status);
}
SetServiceStatus(service_info->service_handle, &service_info->service_status);
}
private:
};
private:
};
}
#endif
+128 -128
View File
@@ -13,169 +13,169 @@
namespace service
{
class ServiceEntryPoint
{
public:
ServiceEntryPoint() = default;
class ServiceEntryPoint
{
public:
ServiceEntryPoint() = default;
template<typename D = DWORD, typename TStr = LPTSTR,
typename Handle = HANDLE,
typename Obj = models::ServiceInfo<>,
typename Ptr = std::shared_ptr<Obj>>
static VOID WINAPI service_main_start(D argc, TStr *argv)
{
extern Ptr service_info;
template<typename D = DWORD, typename TStr = LPTSTR,
typename Handle = HANDLE,
typename Obj = models::ServiceInfo<>,
typename Ptr = std::shared_ptr<Obj>>
static VOID WINAPI service_main_start(D argc, TStr *argv)
{
extern Ptr service_info;
service_info->service_handle = RegisterServiceCtrlHandler(
service_info->service_name,
service::ServiceControlHandler::ServiceCtrlHandler);
service_info->service_handle = RegisterServiceCtrlHandler(
service_info->service_name,
service::ServiceControlHandler::ServiceCtrlHandler);
if (!service_info->service_handle)
{
return;
}
if (!service_info->service_handle)
{
return;
}
notify_service_controller_starting(service_info);
notify_service_controller_starting(service_info);
if (!starting_service(service_info))
{
return;
}
if (!starting_service(service_info))
{
return;
}
notify_service_controller_started(service_info);
notify_service_controller_started(service_info);
// Start a thread that will perform the main task of the service
Handle hThread = CreateThread(nullptr, 0, ServiceWorkerThread, nullptr, 0, nullptr);
// Start a thread that will perform the main task of the service
Handle hThread = CreateThread(nullptr, 0, ServiceWorkerThread, nullptr, 0, nullptr);
// Wait until our worker thread exits signaling that the service needs to stop
WaitForSingleObject(hThread, INFINITE);
// Wait until our worker thread exits signaling that the service needs to stop
WaitForSingleObject(hThread, INFINITE);
close_handle(service_info);
}
private:
template<typename D = DWORD, typename Lp = LPVOID,
typename Obj = models::ServiceInfo<>,
typename Ptr = std::shared_ptr<Obj>>
static D WINAPI ServiceWorkerThread(Lp lpParam)
{
extern Ptr service_info;
close_handle(service_info);
}
private:
template<typename D = DWORD, typename Lp = LPVOID,
typename Obj = models::ServiceInfo<>,
typename Ptr = std::shared_ptr<Obj>>
static D WINAPI ServiceWorkerThread(Lp lpParam)
{
extern Ptr service_info;
const auto INTERVAL = 1500;
const auto INTERVAL = 1500;
const auto some_file_path = "C:\\example_file.txt";
const auto some_file_path = "C:\\example_file.txt";
while (WaitForSingleObject(service_info->service_stop_event, 0) != WAIT_OBJECT_0)
{
std::fstream file(some_file_path, std::ios::out | std::ios::app);
while (WaitForSingleObject(service_info->service_stop_event, 0) != WAIT_OBJECT_0)
{
std::fstream file(some_file_path, std::ios::out | std::ios::app);
const auto content = "burrow";
const auto content = "burrow";
file << content << "\n";
file << content << "\n";
file.close();
file.close();
Sleep(INTERVAL);
}
Sleep(INTERVAL);
}
return ERROR_SUCCESS;
}
return ERROR_SUCCESS;
}
template<typename Obj = models::ServiceInfo<>,
typename Ptr = std::shared_ptr<Obj>>
static bool starting_service(Ptr service_info)
{
/*
* Perform tasks necessary to start the service here
*/
template<typename Obj = models::ServiceInfo<>,
typename Ptr = std::shared_ptr<Obj>>
static bool starting_service(Ptr service_info)
{
/*
* Perform tasks necessary to start the service here
*/
// Create a service stop event to wait on later
service_info->service_stop_event = CreateEvent(nullptr, TRUE, FALSE, nullptr);
if (service_info->service_stop_event == nullptr)
{
// Error creating event
// Tell service controller we are stopped and exit
service_info->service_status.dwControlsAccepted = 0;
service_info->service_status.dwCurrentState = SERVICE_STOPPED;
service_info->service_status.dwWin32ExitCode = GetLastError();
service_info->service_status.dwCheckPoint = 1;
// Create a service stop event to wait on later
service_info->service_stop_event = CreateEvent(nullptr, TRUE, FALSE, nullptr);
if (service_info->service_stop_event == nullptr)
{
// Error creating event
// Tell service controller we are stopped and exit
service_info->service_status.dwControlsAccepted = 0;
service_info->service_status.dwCurrentState = SERVICE_STOPPED;
service_info->service_status.dwWin32ExitCode = GetLastError();
service_info->service_status.dwCheckPoint = 1;
if (SetServiceStatus(service_info->service_handle, &service_info->service_status) == FALSE)
{
OutputDebugString(_T(
"My Sample Service: ServiceMain: SetServiceStatus returned error"));
}
if (SetServiceStatus(service_info->service_handle, &service_info->service_status) == FALSE)
{
OutputDebugString(_T(
"My Sample Service: ServiceMain: SetServiceStatus returned error"));
}
return false;
}
return false;
}
return true;
}
return true;
}
template<typename Obj = models::ServiceInfo<>,
typename Ptr = std::shared_ptr<Obj>>
static void close_handle(Ptr service_info)
{
/*
* Perform any cleanup tasks
*/
template<typename Obj = models::ServiceInfo<>,
typename Ptr = std::shared_ptr<Obj>>
static void close_handle(Ptr service_info)
{
/*
* Perform any cleanup tasks
*/
CloseHandle(service_info->service_stop_event);
CloseHandle(service_info->service_stop_event);
// Tell the service controller we are stopped
service_info->service_status.dwControlsAccepted = 0;
service_info->service_status.dwCurrentState = SERVICE_STOPPED;
service_info->service_status.dwWin32ExitCode = 0;
service_info->service_status.dwCheckPoint = 3;
// Tell the service controller we are stopped
service_info->service_status.dwControlsAccepted = 0;
service_info->service_status.dwCurrentState = SERVICE_STOPPED;
service_info->service_status.dwWin32ExitCode = 0;
service_info->service_status.dwCheckPoint = 3;
if (SetServiceStatus(service_info->service_handle, &service_info->service_status) == FALSE)
{
OutputDebugString(_T(
"My Sample Service: ServiceMain: SetServiceStatus returned error"));
}
}
if (SetServiceStatus(service_info->service_handle, &service_info->service_status) == FALSE)
{
OutputDebugString(_T(
"My Sample Service: ServiceMain: SetServiceStatus returned error"));
}
}
template<typename Obj = models::ServiceInfo<>,
typename Ptr = std::shared_ptr<Obj>>
static void notify_service_controller_starting(Ptr service_info)
{
// Tell the service controller we are starting
ZeroMemory(&service_info->service_status, sizeof(service_info->service_status));
service_info->service_status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
service_info->service_status.dwControlsAccepted = 0;
service_info->service_status.dwCurrentState = SERVICE_START_PENDING;
service_info->service_status.dwWin32ExitCode = 0;
service_info->service_status.dwServiceSpecificExitCode = 0;
service_info->service_status.dwCheckPoint = 0;
template<typename Obj = models::ServiceInfo<>,
typename Ptr = std::shared_ptr<Obj>>
static void notify_service_controller_starting(Ptr service_info)
{
// Tell the service controller we are starting
ZeroMemory(&service_info->service_status, sizeof(service_info->service_status));
service_info->service_status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
service_info->service_status.dwControlsAccepted = 0;
service_info->service_status.dwCurrentState = SERVICE_START_PENDING;
service_info->service_status.dwWin32ExitCode = 0;
service_info->service_status.dwServiceSpecificExitCode = 0;
service_info->service_status.dwCheckPoint = 0;
if (SetServiceStatus(service_info->service_handle, &service_info->service_status) == FALSE)
{
OutputDebugString(_T(
"My Sample Service: ServiceMain: SetServiceStatus returned error"));
}
}
if (SetServiceStatus(service_info->service_handle, &service_info->service_status) == FALSE)
{
OutputDebugString(_T(
"My Sample Service: ServiceMain: SetServiceStatus returned error"));
}
}
template<typename Obj = models::ServiceInfo<>,
typename Ptr = std::shared_ptr<Obj>>
static void notify_service_controller_started(Ptr service_info)
{
// Tell the service controller we are started
service_info->service_status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
service_info->service_status.dwCurrentState = SERVICE_RUNNING;
service_info->service_status.dwWin32ExitCode = 0;
service_info->service_status.dwCheckPoint = 0;
template<typename Obj = models::ServiceInfo<>,
typename Ptr = std::shared_ptr<Obj>>
static void notify_service_controller_started(Ptr service_info)
{
// Tell the service controller we are started
service_info->service_status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
service_info->service_status.dwCurrentState = SERVICE_RUNNING;
service_info->service_status.dwWin32ExitCode = 0;
service_info->service_status.dwCheckPoint = 0;
if (SetServiceStatus(service_info->service_handle, &service_info->service_status) == FALSE)
{
OutputDebugString(_T(
"My Sample Service: ServiceMain: SetServiceStatus returned error"));
}
}
};
if (SetServiceStatus(service_info->service_handle, &service_info->service_status) == FALSE)
{
OutputDebugString(_T(
"My Sample Service: ServiceMain: SetServiceStatus returned error"));
}
}
};
}
#endif