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