Files
Work/service/ServiceHook.hpp
2024-08-07 09:16:27 -04:00

60 lines
1.8 KiB
C++

#ifndef _SERVICE_SERVICEHOOK_HPP_
#define _SERVICE_SERVICEHOOK_HPP_
#ifndef _HOOKPROC_APIENTRY_HPP_
#include <hookproc/apientry.hpp>
#endif
#ifndef _HOOKPROC_PROCADDRESS_HPP_
#include <hookproc/procaddr.hpp>
#endif
class ServiceHook;
typedef ProcAddress<ServiceHook> ServiceHookProc;
class ServiceHook : private ServiceHookProc
{
public:
typedef void (__stdcall *LPFNSERVICEMAIN)(DWORD dwArgc,LPTSTR *lpszArg);
typedef void (__stdcall *LPFNSERVICEHANDLER)(DWORD dwControl);
ServiceHook(void);
virtual ~ServiceHook();
LPFNSERVICEMAIN getServiceMainBase(void)const;
LPFNSERVICEHANDLER getServiceHandlerBase(void)const;
protected:
virtual void svcMain(DWORD dwArgc,LPTSTR *lpszArg);
virtual void svcHandler(DWORD dwControl);
private:
enum {ParamLength=8};
enum {ServiceMainParamLength=8,ServiceHandlerParamLength=4};
ServiceHook &operator=(const ServiceHook &someServiceHook);
void serviceMainEntryProc(DWORD dwArgc,LPTSTR *lpszArg);
void serviceHandlerEntryProc(DWORD dwControl);
APIEntry mServiceMainEntry;
APIEntry mServiceHandlerEntry;
};
inline
ServiceHook::ServiceHook(void)
: mServiceMainEntry(ServiceMainParamLength,(DWORD)this,getProcAddress((ProcAddress<ServiceHook>::LPFNMETHODVOID)&ServiceHook::serviceMainEntryProc)),
mServiceHandlerEntry(ServiceHandlerParamLength,(DWORD)this,getProcAddress((ProcAddress<ServiceHook>::LPFNMETHODVOID)&ServiceHook::serviceHandlerEntryProc))
{
}
inline
ServiceHook &ServiceHook::operator=(const ServiceHook &someServiceHook)
{ // private implementation
return *this;
}
inline
ServiceHook::LPFNSERVICEMAIN ServiceHook::getServiceMainBase(void)const
{
return (LPFNSERVICEMAIN)mServiceMainEntry.codeBase();
}
inline
ServiceHook::LPFNSERVICEHANDLER ServiceHook::getServiceHandlerBase(void)const
{
return (LPFNSERVICEHANDLER)mServiceHandlerEntry.codeBase();
}
#endif