BSOne.SFC/Tocsg.Module/Bs1Flt/bs1fltctrl/service.cpp

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;
}