316 lines
5.8 KiB
C++
316 lines
5.8 KiB
C++
#include "pch.h"
|
|
|
|
|
|
CServiceControl::CServiceControl(LPCTSTR path, LPCTSTR name)
|
|
{
|
|
ZeroMemory(m_path,sizeof(m_path));
|
|
ZeroMemory(m_name,sizeof(m_name));
|
|
|
|
StringCbCopy(m_path,sizeof(m_path),path);
|
|
StringCbCopy(m_name,sizeof(m_name),name);
|
|
}
|
|
|
|
|
|
CServiceControl::~CServiceControl()
|
|
{
|
|
UnInstall();
|
|
}
|
|
|
|
|
|
DWORD CServiceControl::Install(DWORD servicetype, DWORD starttype)
|
|
{
|
|
SC_HANDLE servicemanager = NULL;
|
|
SC_HANDLE service = NULL;
|
|
|
|
TCHAR msg[1024] = {0,};
|
|
|
|
servicemanager = OpenSCManager(
|
|
NULL, //로컬 머신 이름
|
|
NULL, //서비스 엑티브 디비
|
|
SC_MANAGER_ALL_ACCESS //모든 접근 권한
|
|
);
|
|
|
|
if(!servicemanager)
|
|
{
|
|
return GetLastError();
|
|
}
|
|
|
|
service = CreateService(
|
|
servicemanager,
|
|
m_name,
|
|
m_name,
|
|
SERVICE_ALL_ACCESS,
|
|
servicetype,
|
|
starttype,
|
|
SERVICE_ERROR_NORMAL,
|
|
m_path,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL);
|
|
|
|
DWORD dwError = GetLastError();
|
|
|
|
if(!service)
|
|
{
|
|
if(dwError == ERROR_SERVICE_EXISTS)
|
|
{
|
|
service = OpenService(
|
|
servicemanager,
|
|
m_name,
|
|
SERVICE_ALL_ACCESS
|
|
);
|
|
if(!service)
|
|
{
|
|
CloseServiceHandle(servicemanager);
|
|
return GetLastError();
|
|
}
|
|
|
|
ChangeServiceConfig(service,
|
|
SERVICE_KERNEL_DRIVER,
|
|
starttype,
|
|
SERVICE_ERROR_NORMAL,
|
|
m_path,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
m_name
|
|
);
|
|
|
|
}
|
|
}
|
|
|
|
CloseServiceHandle(service);
|
|
CloseServiceHandle(servicemanager);
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
|
|
|
|
DWORD CServiceControl::UnInstall()
|
|
{
|
|
SC_HANDLE servicemanager = NULL;
|
|
SC_HANDLE service = NULL;
|
|
DWORD error = ERROR_SUCCESS;
|
|
|
|
servicemanager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
|
|
if(servicemanager == NULL)
|
|
{
|
|
return GetLastError();
|
|
}
|
|
|
|
service = OpenService( servicemanager, m_name, SERVICE_ALL_ACCESS);
|
|
if(service == NULL)
|
|
{
|
|
error = GetLastError();
|
|
}
|
|
else
|
|
{
|
|
if(!DeleteService(service))
|
|
{
|
|
error = GetLastError();
|
|
}
|
|
|
|
CloseServiceHandle(service);
|
|
}
|
|
|
|
CloseServiceHandle(servicemanager);
|
|
return error;
|
|
}
|
|
|
|
|
|
|
|
|
|
DWORD CServiceControl::Stop()
|
|
{
|
|
|
|
SC_HANDLE servicemanager = NULL;
|
|
SC_HANDLE service = NULL;
|
|
DWORD erorr = ERROR_SUCCESS;
|
|
|
|
servicemanager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
|
|
if(servicemanager == NULL)
|
|
{
|
|
return GetLastError();
|
|
}
|
|
|
|
service = OpenService( servicemanager, m_name, SERVICE_ALL_ACCESS);
|
|
if(service == NULL)
|
|
{
|
|
erorr = GetLastError();
|
|
}
|
|
else
|
|
{
|
|
SERVICE_STATUS status;
|
|
if(!ControlService(service,SERVICE_CONTROL_STOP,&status))
|
|
{
|
|
erorr = GetLastError();
|
|
}
|
|
|
|
CloseServiceHandle(service);
|
|
}
|
|
|
|
CloseServiceHandle(servicemanager);
|
|
return erorr;
|
|
}
|
|
|
|
|
|
|
|
DWORD CServiceControl::Start()
|
|
{
|
|
SC_HANDLE servicemanager = NULL;
|
|
SC_HANDLE service = NULL;
|
|
DWORD erorr = ERROR_SUCCESS;
|
|
|
|
servicemanager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
|
|
if(servicemanager == NULL)
|
|
{
|
|
BSONE_DEBUGA("Start 1.0\n");
|
|
return GetLastError();
|
|
}
|
|
|
|
service = OpenService(servicemanager, m_name, SERVICE_ALL_ACCESS);
|
|
if(service == NULL)
|
|
{
|
|
BSONE_DEBUGA("Start 2.0\n");
|
|
erorr = GetLastError();
|
|
}
|
|
else
|
|
{
|
|
for( DWORD i = 0; i<5 ; i++)
|
|
{
|
|
if(!StartService(service, 0, (LPCTSTR *)NULL))
|
|
{
|
|
erorr = GetLastError();
|
|
if( erorr == 0x420 )
|
|
{
|
|
Sleep(100);
|
|
continue;
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
|
|
CloseServiceHandle(service);
|
|
}
|
|
CloseServiceHandle(servicemanager);
|
|
|
|
return erorr;
|
|
}
|
|
|
|
|
|
DWORD CServiceControl::GetRegProcessCreate()
|
|
{
|
|
CRegKey reg;
|
|
DWORD dwValue = 0;
|
|
TCHAR subkey[MAX_PATH] = { 0, };
|
|
|
|
StringCbPrintf(subkey, sizeof(subkey), _T("System\\CurrentControlSet\\Services\\%s\\Parameters"), m_name);
|
|
|
|
if (reg.Open(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Test")) == ERROR_SUCCESS)
|
|
{
|
|
if (reg.QueryDWORDValue(_T("ProcessCreate"), dwValue) == ERROR_SUCCESS)
|
|
{
|
|
}
|
|
|
|
reg.Close();
|
|
}
|
|
|
|
return dwValue;
|
|
}
|
|
|
|
|
|
DWORD CServiceControl::SetMiniFltSetting(LPCTSTR attribute_name, LPCTSTR attribute, DWORD flags, DWORD bs1fltkernel)
|
|
{
|
|
CRegKey reg;
|
|
TCHAR subkey[MAX_PATH] = {0,};
|
|
DWORD status = ERROR_SUCCESS;
|
|
DWORD dwVal = 0;
|
|
|
|
StringCbPrintf(subkey,sizeof(subkey),_T("System\\CurrentControlSet\\Services\\%s\\Instances"), m_name);
|
|
|
|
if(reg.Create(HKEY_LOCAL_MACHINE, subkey) == ERROR_SUCCESS)
|
|
{
|
|
if(reg.SetStringValue(_T("DefaultInstance"), attribute_name) != ERROR_SUCCESS)
|
|
goto $cleanup;
|
|
|
|
reg.Close();
|
|
}
|
|
|
|
StringCbPrintf(subkey,sizeof(subkey),_T("System\\CurrentControlSet\\Services\\%s\\Instances\\%s"), m_name, attribute_name);
|
|
|
|
if(reg.Create(HKEY_LOCAL_MACHINE, subkey) == ERROR_SUCCESS)
|
|
{
|
|
if(reg.SetStringValue(_T("Altitude"), attribute) != ERROR_SUCCESS)
|
|
goto $cleanup;
|
|
|
|
dwVal = flags;
|
|
if(reg.SetDWORDValue(_T("Flags"), dwVal) != ERROR_SUCCESS)
|
|
goto $cleanup;
|
|
}
|
|
|
|
|
|
StringCbPrintf(subkey, sizeof(subkey), _T("System\\CurrentControlSet\\Services\\%s\\Parameters"), m_name);
|
|
|
|
if (reg.Create(HKEY_LOCAL_MACHINE, subkey) == ERROR_SUCCESS)
|
|
{
|
|
dwVal = bs1fltkernel;
|
|
if (reg.SetDWORDValue(_T("DebugLevel"), dwVal) != ERROR_SUCCESS)
|
|
goto $cleanup;
|
|
|
|
dwVal = 0x00000000;
|
|
if (reg.SetDWORDValue(_T("ProcessCreate"), dwVal) != ERROR_SUCCESS)
|
|
goto $cleanup;
|
|
}
|
|
|
|
$cleanup:
|
|
status = GetLastError();
|
|
if(status == ERROR_ALREADY_EXISTS || status == ERROR_SERVICE_EXISTS)
|
|
status = ERROR_SUCCESS;
|
|
|
|
reg.Close();
|
|
|
|
return status;
|
|
}
|
|
|
|
|
|
BOOL CServiceControl::AcquirePrivilege( const wchar_t* privilege )
|
|
{
|
|
LUID luid;
|
|
HANDLE handle_token;
|
|
BOOL acquired = FALSE;
|
|
|
|
if( !OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &handle_token ) )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if ( LookupPrivilegeValue( NULL, privilege, &luid ) )
|
|
{
|
|
TOKEN_PRIVILEGES token_privileges;
|
|
|
|
token_privileges.PrivilegeCount = 1;
|
|
token_privileges.Privileges[0].Luid = luid;
|
|
token_privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
|
|
|
|
|
|
if ( AdjustTokenPrivileges(handle_token, FALSE, &token_privileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL) )
|
|
{
|
|
acquired = TRUE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
}
|
|
|
|
CloseHandle( handle_token );
|
|
|
|
return acquired;
|
|
}
|