23 #include "../../../core/info.hpp"
24 #include "../../../core/exception.hpp"
25 #include "../../../core/trace.hpp"
29 using namespace libjmmcg;
30 using namespace NTUtils;
38 const TCHAR CloseServiceHandle_name[]=
_T(
"CloseServiceHandle");
40 const TCHAR OpenSCManager_name[]=_T(
"OpenSCManagerW");
41 const TCHAR OpenService_name[]=_T(
"OpenServiceW");
42 const TCHAR StartService_name[]=_T(
"StartServiceW");
44 const TCHAR OpenSCManager_name[]=
_T(
"OpenSCManagerA");
45 const TCHAR OpenService_name[]=
_T(
"OpenServiceA");
46 const TCHAR StartService_name[]=
_T(
"StartServiceA");
48 const TCHAR ControlService_name[]=
_T(
"ControlService");
52 typedef WINADVAPI SC_HANDLE (WINAPI *
const OpenSCManagerType)(LPCTSTR lpMachineName,LPCTSTR lpDatabaseName,DWORD dwDesiredAccess);
56 ServiceManipulation::ServiceManipulation(
const TCHAR *
const machine) :
57 LoadLibraryWrapper(scm_lib_name),
58 pCloseServiceHandle(
reinterpret_cast<CloseServiceHandleType>(::GetProcAddress(Handle(),CloseServiceHandle_name))),
59 pOpenService(
reinterpret_cast<OpenServiceType>(::GetProcAddress(Handle(),OpenService_name))),
60 pControlService(
reinterpret_cast<ControlServiceType>(::GetProcAddress(Handle(),ControlService_name))),
61 pStartService(
reinterpret_cast<StartServiceType>(::GetProcAddress(Handle(),StartService_name))) {
62 assert(pCloseServiceHandle);
64 assert(pControlService);
65 assert(pStartService);
66 const OpenSCManagerType pOpenSCManager=
reinterpret_cast<OpenSCManagerType>(::GetProcAddress(Handle(),OpenSCManager_name));
67 assert(pOpenSCManager);
68 scm=(*pOpenSCManager)(machine,NULL,SC_MANAGER_ALL_ACCESS);
70 throw exception_type(
_T(
"Failed to open the Service Control Manager on the specified machine."),info::function(__LINE__,
__PRETTY_FUNCTION__,
typeid(*
this),info::function::argument(
_T(
"const TCHAR * const"),machine)),__REV_INFO__);
72 curr_service_name=NULL;
75 ServiceManipulation::~ServiceManipulation(
void) {
76 if (curr_service_name) {
77 (*pCloseServiceHandle)(curr_service);
78 JMMCG_TRACE(_T(
"ServiceManipulation::~ServiceManipulation(): Closing service: 0x")<<std::hex<<curr_service<<_T(
", windows error code: ")<<NTUtils::win_exception::StrFromWinErr(::GetLastError()));
80 (*pCloseServiceHandle)(scm);
81 JMMCG_TRACE(_T(
"ServiceManipulation::~ServiceManipulation(): Closing service control manager: 0x")<<std::hex<<scm<<_T(
", windows error code: ")<<NTUtils::win_exception::StrFromWinErr(::GetLastError()));
85 ServiceManipulation::OpenService(
const TCHAR *
const service_name,
const DWORD access) {
86 if (curr_service_name && _tcscmp(curr_service_name,service_name)) {
87 (*pCloseServiceHandle)(curr_service);
88 JMMCG_TRACE(_T(
"ServiceManipulation::OpenService(...): Closing service: 0x")<<std::hex<<curr_service<<_T(
", windows error code: ")<<NTUtils::win_exception::StrFromWinErr(::GetLastError()));
89 curr_service_name=NULL;
91 if (!curr_service_name) {
92 curr_service=(*pOpenService)(scm,curr_service_name=service_name,access);
94 info::function info(__LINE__,
__PRETTY_FUNCTION__,
typeid(*
this),info::function::argument(
_T(
"const TCHAR * const"),service_name));
95 info.add_arg(
_T(
"const DWORD"),access);
96 throw exception_type(
_T(
"Failed to open the specified service with the specified access mask."),info,__REV_INFO__);
99 assert(curr_service_name && curr_service);