开源项目之金山卫士

http://blog.csdn.net/banketree/article/details/7992188


金山卫士是一款由金山网络技术有限公司出品的查杀木马能力强、检测漏洞快、体积小巧的免费安全软件。它采用金山领先的云安全技术,不仅能查杀上亿已知木马,还能5分钟内发现新木马;漏洞检测针对windows7优化,速度更快;更有实时保护、插件清理、修复IE等功能,全面保护电脑的系统安全。

源码分为七个部分:

pcmamager  :开源卫士整体

kclear :卫士垃圾清理

ksm  :卫士主界面

karpfw :卫士ARP防火墙

sysopt :系统优化 之 开机加速器

bksafevul:漏洞扫描器

ppro:隐私保护器


项目目录如图:



下面进行代码分析,先从bksafevul(漏洞扫描器)开始。

项目如图:


  ksafevul.exe  提供可视化的漏洞修复功能
  ksafevul.dll  漏洞修复引擎
  leakscan_test.exe  命令行版本例子程序
  data\*.*                   漏洞库目录
         office.dat          微软office 32位软件补丁
         office64.dat       微软office 64位软件补丁
         system.dat       windows 32位补丁
         system64.dat   window 64位补丁
         soft.dat             第三方软件补丁

程序效果如图:


现在根据功能来分析!~

== 漏洞修复sdk 功能 =
1. 漏洞的快速扫描,主要是坚持系统是否存在补丁,一旦发现补丁就快速返回,另外针对x64 位系统只能通过接口来获取补丁的做了速度优化。

2. 漏洞全盘扫描,获取全部补丁,以及下载等。
3. 漏洞的修复。
4. 漏洞库升级,需要knup.dll。

程序入口代码:

[cpp]  view plain  copy
  1. int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/LPTSTR lpstrCmdLine, int /*nCmdShow*/)  
  2. {  
  3. #   ifdef _DEBUG  
  4.   
  5.     //bkconsole theConsole;  
  6.   
  7. #   endif  
  8.   
  9.     HRESULT hRet = E_FAIL;  
  10.   
  11. //  g_dwMainThreadId = ::GetCurrentThreadId();  
  12.       
  13.     //初始化路径 操作注册表  
  14.     hRet = _Module.Init(hInstance);  
  15.     if (FAILED(hRet))  
  16.         return -1;  
  17.   
  18.     //确认管理员权限  
  19.     if (FALSE == _Module.CheckIntegrityLevel())  
  20.         return -2;  
  21.   
  22.     //初始化控件  
  23.     ::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);  
  24.   
  25.     //加载riched20.dll字符编辑器相关文件。  
  26.     _Module.InitRichEdit2();  
  27.   
  28.     //运行主程序  接下来就是加载图片了(BkResManager::SetResourcePath(strPath)) ……  
  29.     _Module.RunMain();  
  30.   
  31.     ::CoUninitialize();  
  32.   
  33.     return 0;  
  34. }  

[cpp]  view plain  copy
  1. //加载UI  
  2. void CBKSafeVulModule::_InitUIResource()  
  3. {  
  4.   
  5.     BkString::Load(IDR_BK_STRING_DEF);  
  6.     BkFontPool::SetDefaultFont(BkString::Get(IDS_APP_FONT), -12);  
  7.     BkSkin::LoadSkins(IDR_BK_SKIN_DEF);  
  8.     BkStyle::LoadStyles(IDR_BK_STYLE_DEF);  
  9. }  


[cpp]  view plain  copy
  1. //开始扫描漏洞  
  2. void CBeikeSafeMainDlg::StartScanLeak()  
  3. {  
  4.     m_viewVulfix.ShowWindow(SW_SHOW);  
  5.     if(!m_bVulfixInited || m_bVulfixRescanRequired)  
  6.     {  
  7.         BOOL toRescan = TRUE;  
  8.         if(m_bVulfixRescanRequired && theEngine && theEngine->m_isRepairing)  
  9.         {  
  10.             toRescan = FALSE;  
  11.         }             
  12.         m_bVulfixInited = TRUE;  
  13.         m_bVulfixRescanRequired = FALSE;  
  14.         if(toRescan)  
  15.             m_viewVulfix.m_viewSoftVul.InitEnv();  
  16.     }  
  17. }  

[cpp]  view plain  copy
  1. //初始化扫描引擎  
  2. void CBeikeVulfixHandler::InitEnv()  
  3. {  
  4.     if(!theEngine)  
  5.     {  
  6.         theEngine = new CVulEngine;   
  7.         theEngine->_InitFunctions();  
  8.   
  9.         m_WinInfo.Init();  
  10.         //m_WinInfo64 = IsWin64();  
  11.     }  
  12.     //开始扫描  
  13.     PostMessage( WMH_SCAN_START, 0, 0);  
  14. }  
[cpp]  view plain  copy
  1. //对应的功能函数声明  
  2. LRESULT OnScanStart(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);  
  3. LRESULT OnScanDone(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);  
  4. bool _RepairSingle( int arrVulIds, T_VulListItemData* pItemData );  

[cpp]  view plain  copy
  1. //开始扫描  
  2. LRESULT CBeikeVulfixHandler::OnScanStart( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled )  
  3. {  
  4.     OnBkBtnScan();  
  5.     return 0;  
  6. }  
[cpp]  view plain  copy
  1. void CBeikeVulfixHandler::OnBkBtnScan()  
  2. {  
  3.     if(m_firstInited)  
  4.     {  
  5.         // Clean downloaded files   
  6.         BOOL bSave = BKSafeConfig::Get_Vulfix_SaveDownFile();  
  7.         if( !bSave )  
  8.             theEngine->m_fixLog.CleanFiles(FALSE, NULL);  
  9.         m_firstInited = FALSE;  
  10.         SetItemVisible(1015, !theEngine->IsSystemSupported());  
  11.     }  
  12.       
  13.     ResetListCtrl(m_wndListCtrlVul);  
  14.     if( theEngine->ScanVul( m_RefWin.m_hWnd ) )  
  15.     {  
  16.         m_dwScanBeginTime = GetTickCount();  
  17.         m_bScanStarted = FALSE;  
  18.   
  19.         m_nScanState = 0;  
  20.         m_nTotalItem = 0;  
  21.         m_nCurrentItem = 0;  
  22.         _SetDisplayState(SCANSTATE_SCANNING);  
  23.         _SetScanProgress( 0 );  
  24.         m_RefWin.SetTimer(0, 200, NULL);  
  25.         m_wndListCtrlVul.SetEmptyString(BkString::Get(IDS_VULFIX_5027));  
  26.         m_RefWin.StartIconAnimate( IDC_IMG_VULFIX_SCAN_ANIMATION, IDC_PROGRESS_VULFIX_SCANNING, 300);  
  27.         SetItemDWordAttribute(IDC_PROGRESS_VULFIX_SCANNING, "showpercent", 0);  
  28.     }  
  29. }  
[cpp]  view plain  copy
  1. //修复  
  2. bool CBeikeVulfixHandler::_RepairSingle( int arrVulIds, T_VulListItemData* pItemData )  
  3. {  
  4.     if(!theEngine->CheckRepairPrequisite(pItemData->nType==VTYPE_OFFICE))  
  5.         return FALSE;  
  6.       
  7.     CSimpleArray<int> vulId;  
  8.     CSimpleArray<int> softId;  
  9.       
  10.     if ( pItemData->nType == VTYPE_SOFTLEAK )  
  11.         softId.Add(arrVulIds);  
  12.     else  
  13.         vulId.Add(arrVulIds);  
  14.   
  15.     m_nRepairTotal = 1;  
  16.     m_nRepairInstalled = 0;  
  17.     m_nRepairDownloaded = 0;  
  18.     m_nRepairProcessed = 0;  
  19.     m_nRepairCurrentRate = 0;  
  20.   
  21.     m_RefWin.StartIconAnimate(30100);  
  22.   
  23.     _SetDisplayState(SCANSTATE_REPAIRING);  
  24.     _UpdateRepairTitle();  
  25.   
  26.     // Fill the list ctrl   
  27.     ResetListCtrl(m_wndListCtrlVulFixing);  
  28.     AppendItem2RepairList( m_wndListCtrlVulFixing, new T_VulListItemData( *pItemData ) );  
  29.       
  30.     // Fix    
  31.     return theEngine->RepairAll( m_RefWin.m_hWnd, vulId, softId);  
  32. }  

测试漏洞代码:

[cpp]  view plain  copy
  1. int _tmain(int argc, _TCHAR* argv[])  
  2. {  
  3.     _tsetlocale(0, _T("chs"));  
  4.   
  5.     //模拟参数  
  6.     argc = 2;  
  7.     argv[0] = L"";  
  8.     argv[1] = L"1";  
  9.   
  10.   
  11.     if ( argc < 2 )  
  12.     {  
  13.         _tprintf( _T("参数:\n") );  
  14.         _tprintf( _T("1: 测试快速扫描\n") );  
  15.         _tprintf( _T("2: 测试全面扫描\n") );  
  16.         _tprintf( _T("3: 测试修复功能\n") );  
  17.         return 0;  
  18.     }  
  19.   
  20.     if ( 0 ==  _tcsicmp( argv[1], _T("1") ) )  
  21.     {  
  22.   
  23.         _tprintf(_T("测试快速扫描\n"));  
  24.         PressAnyKeyToContinue();  
  25.         TestQuickScan();  
  26.         goto Exit0;  
  27.     }  
  28.   
  29.     if ( 0 == _tcsicmp( argv[1], _T("2") ) )  
  30.     {  
  31.         _tprintf(_T("测试全面扫描\n"));  
  32.         PressAnyKeyToContinue();  
  33.         TestFullScan();  
  34.         goto Exit0;  
  35.     }  
  36.   
  37.     if ( 0 == _tcsicmp( argv[1], _T("3") ) )  
  38.     {  
  39.         _tprintf(_T("测试修复功能,为避免风险,可选和软件漏洞不做修复\n"));  
  40.         PressAnyKeyToContinue();  
  41.         TestRepair();  
  42.     }  
  43.   
  44. Exit0:  
  45.     PressAnyKeyToContinue();  
  46.     return 0;  
  47. }  
[cpp]  view plain  copy
  1. TestQuickScan()  
  2. HRESULT WINAPI ExpressScanLeak(IVulCollection **pVulCollection, DWORD dwFlags, BOOL bQuickScan);  
  3. 如果成功, 先调用 IVulCollection::get_Status  
  4.  如果S_OK, 则根据status 来判断是否有漏洞风险, -1, 0 表示可能无风险, 1 表示可能有风险  
  5.  否则,根据 IVulCollection::get_VulCount 和 IVulCollection::get_Item 来判断是否有漏洞存在, 具体看例子中函数 DumpIVulCollection   

[cpp]  view plain  copy
  1. TestRepair()  
  2. 使用接口 IVulfix 的方法 Scan 扫描漏洞, 扫描完成后使用方法 GetResults, GetSoftVuls 分别获取系统漏洞列表, 和软件漏洞列表  
  3. 使用接口 IRepairVul 修复漏洞  

漏洞修复测试代码结束!

进入karpfw(卫士ARP防火墙 英文: Kavass arp firewall)。


程序效果如图:


代码分析:

[cpp]  view plain  copy
  1. //程序的初始化  
  2. LRESULT CMainDlg::OnInitDialog(UINT /*uMsg*/WPARAM /*wParam*/LPARAM /*lParam*/BOOL/*bHandled*/)  
  3. {  
  4.     HICON hIcon = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME),   
  5.         IMAGE_ICON, ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR);  
  6.     SetIcon(hIcon, TRUE);  
  7.     HICON hIconSmall = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME),   
  8.         IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);  
  9.     SetIcon(hIconSmall, FALSE);  
  10.   
  11.     // 创建大字体  
  12.     CFontHandle hFont = GetFont();  
  13.     LOGFONT logFont = { 0 };  
  14.     hFont.GetLogFont(&logFont);  
  15.     logFont.lfHeight = -14;  
  16.     logFont.lfWeight = FW_BOLD;  
  17.     m_fontBig.CreateFontIndirect(&logFont);  
  18.     DoDataExchange();  
  19.   
  20.     CString strTitle = _T("金山卫士ARP防火墙");  
  21.     SetBkSkin(m_bmpSkin);  
  22.     InitSkinDialog(m_bmpCloseBtn, NULL, strTitle);  
  23.     SetWindowPos(NULL, 0, 0, 496, 184, SWP_NOMOVE);  
  24.     CenterWindow();  
  25.   
  26.     m_btnEnable.InitButton(m_bmpEnableBtn);  
  27.     m_btnEnable.SetWindowText(_T(""));  
  28.     m_btnEnable.SetWindowPos(NULL, 412, 53, 0, 0, SWP_NOSIZE);  
  29.     m_btnDisable.InitButton(m_bmpDisableBtn);  
  30.     m_btnDisable.SetWindowText(_T(""));  
  31.     m_btnDisable.SetWindowPos(NULL, 412, 53, 0, 0, SWP_NOSIZE);  
  32.     m_lnkSetting.SetWindowPos(NULL, 424, 100, 0, 0, SWP_NOSIZE);  
  33.     //GetDlgItem(IDC_LOG_GROUP).SetWindowPos(NULL, 11, 120, 476, 104, 0);  
  34.     GetDlgItem(IDC_TXT_LOG).SetWindowPos(NULL, 20, 136, 0, 0, SWP_NOSIZE);  
  35.     m_lnkVersion.SetWindowPos(NULL, 20, 160, 0, 0, SWP_NOSIZE);  
  36.     m_lnkBBS.SetWindowPos(NULL, 120, 160, 0, 0, SWP_NOSIZE);  
  37.     m_lnkViewLog.SetWindowPos(NULL, 460, 136, 0, 0, SWP_NOSIZE);  
  38.     GetDlgItem(IDC_LINE).SetWindowPos(NULL, 20, 127, 466, 1, 0);  
  39.   
  40.     CString strVersion = _T("版本:");   
  41.     strVersion += _Module.GetProductVersion();  
  42.     m_lnkVersion.SetWindowText(strVersion);  
  43.   
  44.     if (m_piArpSetting)  
  45.     {  
  46.         m_piArpSetting->IsArpFwEnable(&m_bFwEnable);  
  47.     }  
  48.   
  49.     //更新UI  
  50.     UpdateUI();  
  51.     //创建线程开始工作   
  52.     StartWork();  
  53.   
  54.     return TRUE;  
  55. }  

[cpp]  view plain  copy
  1. //工作线程  
  2. UINT CMainDlg::WorkThreadProc(LPVOID pSetting)  
  3. {  
  4.     CMainDlg* pThis = (CMainDlg*)pSetting;  
  5.     IArpFwSetting* piArpSetting = NULL;  
  6.     HANDLE hExitSignal = NULL;  
  7.     HRESULT hRetCode;  
  8.     wchar_t szLastLog[512] = { 0 };  
  9.   
  10.     KAV_PROCESS_ERROR(pThis);  
  11.   
  12.     piArpSetting = pThis->m_piArpSetting;  
  13.     KAV_PROCESS_ERROR(piArpSetting);  
  14.   
  15.     hExitSignal = pThis->m_hExitSignal;  
  16.     KAV_PROCESS_ERROR(hExitSignal);  
  17.   
  18.     for (;;)  
  19.     {  
  20.         BOOL bEnable = FALSE;  
  21.   
  22.         if (::WaitForSingleObject(hExitSignal, 1000) == WAIT_OBJECT_0)  
  23.             break;  
  24.   
  25.         hRetCode = piArpSetting->IsArpFwEnable(&bEnable);  
  26.         if (FAILED(hRetCode))  
  27.             continue;  
  28.   
  29.         pThis->PostMessage(WM_ARPFW_STATE, bEnable, 0);  
  30.   
  31.         hRetCode = piArpSetting->GetLastLog(512, szLastLog);  
  32.         if (FAILED(hRetCode))  
  33.             continue;  
  34.   
  35.         pThis->SendMessage(WM_ARPFW_LASTLOG, (WPARAM)szLastLog);  
  36.     }  
  37.   
  38. Exit0:  
  39.     _endthreadex(0);  
  40.     return 0;  
  41. }  

[cpp]  view plain  copy
  1. //控制arp的对象  
  2.    KComInterfacePtr<IArpFwSetting> m_spIArpFwSetting;  
  3.    KComInterfacePtr<IKArpSp> m_spIArpFwSp;  

[cpp]  view plain  copy
  1. //实例化  
  2. m_spIArpFwSetting.LoadInterface(_T("arpsetting.dll"));  
  3. m_spIArpFwSp.LoadInterface(_T("arpproxy.dll"));  

[cpp]  view plain  copy
  1. //加载  
  2. BOOL CArpSetting::Install()  
  3. {  
  4.     BOOL retval = FALSE;  
  5.     BOOL bRetCode;  
  6.   
  7.     KAV_PROCESS_ERROR(m_spIArpFwSetting);  
  8.   
  9.     bRetCode = m_spIArpFwSetting->InstallArpFw();  
  10.     KAV_PROCESS_ERROR(bRetCode);  
  11.   
  12.     retval = TRUE;  
  13.   
  14. Exit0:  
  15.     return retval;  
  16. }  
  17.   
  18. //卸载  
  19. BOOL CArpSetting::UnInstall()  
  20. {  
  21.     BOOL retval = FALSE;  
  22.     BOOL bRetCode;  
  23.   
  24.     KAV_PROCESS_ERROR(m_spIArpFwSetting);  
  25.   
  26.     bRetCode = m_spIArpFwSetting->UnInstallArpFw();  
  27.     KAV_PROCESS_ERROR(bRetCode);  
  28.   
  29.     retval = TRUE;  
  30.   
  31. Exit0:  
  32.     return retval;  
  33. }  
  34.   
  35. //开启  
  36. BOOL CArpSetting::StartSP()  
  37. {  
  38.     BOOL retval = FALSE;  
  39.     BOOL bRetCode;  
  40.   
  41.     KAV_PROCESS_ERROR(m_spIArpFwSp);  
  42.   
  43.     KxeBaseInit();  
  44.   
  45.     bRetCode = m_spIArpFwSp->Start();  
  46.     KAV_PROCESS_ERROR(bRetCode);  
  47.   
  48.     retval = TRUE;  
  49.   
  50. Exit0:  
  51.     return retval;  
  52. }  
  53.   
  54. //停止  
  55. BOOL CArpSetting::StopSP()  
  56. {  
  57.     BOOL retval = FALSE;  
  58.     BOOL bRetCode;  
  59.   
  60.     KAV_PROCESS_ERROR(m_spIArpFwSp);  
  61.   
  62.     bRetCode = m_spIArpFwSp->Stop();  
  63.     KAV_PROCESS_ERROR(bRetCode);  
  64.   
  65.     KxeBaseUnInit();  
  66.   
  67.     retval = TRUE;  
  68.   
  69. Exit0:  
  70.     return retval;  
  71. }  

至于arp是怎么操作的,就得进入arpproxy、arpsetting了,而关键的驱动操作是在kndisflt中!本文就不介绍它们了,有机会再深入!~

接着进入kclear(卫士垃圾清理 英文: Kavass Clear)!

项目如图:



效果如图:



该项目需要用到ATL_Server开发包!

关键代码:

[cpp]  view plain  copy
  1. //清除实例对象  
  2. ear*    m_piKClear;  

[cpp]  view plain  copy
  1. //初始化清除实例对象  
  2. BOOL MainWnd::InitKClear()  
  3. {  
  4.     BOOL retval = FALSE;  
  5.     CreateKClearObject_t CreateKClearObject = NULL;  
  6.     TCHAR szKClearPath[MAX_PATH] = { 0 };  
  7.     HRESULT hr;  
  8.     HMODULE hKClear = NULL;  
  9.     IKClear* piKClear = NULL;  
  10.     HWND hWnd = NULL;  
  11.   
  12.     if (!m_hKClear)  
  13.     {  
  14.         ::GetModuleFileName(NULL, szKClearPath, MAX_PATH);  
  15.         PathRemoveFileSpec(szKClearPath);  
  16.         PathAppend(szKClearPath, _T("kclear.dll"));  
  17.         hKClear = LoadLibrary(szKClearPath);  
  18.         if (!hKClear)  
  19.             goto clean0;  
  20.   
  21.         m_hKClear = hKClear;  
  22.     }  
  23.   
  24.     if (!m_piKClear)  
  25.     {  
  26.         CreateKClearObject = (CreateKClearObject_t)GetProcAddress(m_hKClear, "CreateKClearObject");  
  27.         if (!CreateKClearObject)  
  28.             goto clean0;  
  29.   
  30.         hr = CreateKClearObject(__uuidof(IKClear), (void**)&piKClear);  
  31.         if (FAILED(hr))  
  32.             goto clean0;  
  33.   
  34.         m_piKClear = piKClear;  
  35.     }  
  36.   
  37.     if (!m_wndKClear.m_hWnd)  
  38.     {  
  39.         hWnd = m_piKClear->CreateKClear(m_hWnd);  
  40.         m_wndKClear.m_hWnd = hWnd;  
  41.         m_wndKClear.ShowWindow(SW_SHOW);  
  42.     }  
  43.   
  44.     retval = TRUE;  
  45.   
  46. clean0:  
  47.     if (!retval)  
  48.     {  
  49.         UnInitKClear();  
  50.     }  
  51.   
  52.     return retval;  
  53. }  
  54.   
  55. //释放清除对象资源  
  56. void MainWnd::UnInitKClear()  
  57. {  
  58.     if (m_wndKClear.m_hWnd)  
  59.     {  
  60.         m_wndKClear.DestroyWindow();  
  61.     }  
  62.   
  63. //     if (m_piKClear)  
  64. //     {  
  65. //         m_piKClear->Release();  
  66. //         m_piKClear = NULL;  
  67. //     }  
  68. //   
  69. //     if (m_hKClear)  
  70. //     {  
  71. //         FreeLibrary(m_hKClear);  
  72. //         m_hKClear = NULL;  
  73. //     }  
  74. }  

清除在程序创建时就调用了!

[cpp]  view plain  copy
  1. int MainWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)  
  2. {  
  3.     SetWindowPos(NULL, 0, 0, 800, 570, SWP_NOREPOSITION);  
  4.     CenterWindow();  
  5.   
  6.     InitKClear();  
  7.   
  8.     return 0;  
  9. }  

清除操作完毕!~~

接着进入sysopt(系统优化 开机加速)!

项目如图:


效果如图:


//关键对象

[cpp]  view plain  copy
  1. CBeikeSafeSysOptUIHandler*       m_sysoptHandler;  
[cpp]  view plain  copy
  1. //构造  
  2.     m_sysoptHandler = new CBeikeSafeSysOptUIHandler(this);  

[cpp]  view plain  copy
  1. //初始化  
  2.     (*m_sysoptHandler).Init();  
  3.     (*m_sysoptHandler).FirstShow();  

[cpp]  view plain  copy
  1. //操作关键类  
  2. class CBeikeSafeSysOptUIHandler :  
  3.     public IEnumRunCallBackNull,  
  4.     public IAutoOptLstCBack,  
  5.     public IListOpCallback  
  6. {  
  7. public:  
  8.     CBeikeSafeSysOptUIHandler(CBeikeSafeMainDlg* refDialog)  
  9.         : m_dlg(refDialog)  
  10.         , m_pRunOptEng(NULL)  
  11.         , m_nState(STATE_RUNOPT_NULL)  
  12.         , m_bFirstShowed(FALSE)  
  13.         , m_bFirstScanRunEnd(FALSE)  
  14.         , m_bSkipToOnekeyOpt(FALSE)  
  15.         , m_hOptimizeThread(NULL)  
  16.         , m_bOpting(FALSE)  
  17.         , m_bRefreshList(FALSE)  
  18.         , m_nIgnoredCount(0)  
  19.         , m_bReportOnekeyOpt(TRUE)  
  20.     {  
  21.     }  
  22.   
  23.     virtual ~CBeikeSafeSysOptUIHandler()  
  24.     {  
  25.         if (m_pRunOptEng!=NULL)  
  26.         {  
  27.             CRunOptLoader::GetGlobalPtr()->FreeOptEng(m_pRunOptEng);  
  28.             m_pRunOptEng = NULL;  
  29.         }  
  30.         if (m_hOptimizeThread != NULL)  
  31.         {  
  32.             ::CloseHandle(m_hOptimizeThread);  
  33.             m_hOptimizeThread = NULL;  
  34.         }  
  35.     }  
  36.   
  37. public:  
  38.     BOOL IsOpPermit()  
  39.     {  
  40.         return (m_nState==STATE_RUNOPT_NULL);  
  41.     }  
  42.   
  43.     void Init();  
  44.     void FirstShow();  
  45.     void SecondShow();  
  46.     BOOL OnBkRunTypeSelChange(int nTabItemIDOld, int nTabItemIDNew);  
  47.     BOOL OnBkSysOptSelChange(int nTabItemIDOld, int nTabItemIDNew);  
  48.   
  49.     void InitEng()  
  50.     {  
  51.         if (m_pRunOptEng==NULL)  
  52.             m_pRunOptEng = CRunOptLoader::GetGlobalPtr()->GetOptEng();  
  53.     }  
  54.   
  55.     BOOL FindRunItem(CKsafeRunInfo* pInfo);  
  56.     BOOL _FindRunItem(CKsafeRunInfo* pInfo);  
  57.     void EndScan();  
  58.     void RestoreEnd();  
  59.     void PostRestoreRunItem(DWORD nType,BOOL bEnable,LPCTSTR lpName);  
  60.   
  61.     LRESULT OnWmScanEnd(UINT uMsg, WPARAM wParam, LPARAM lParam);  
  62.     LRESULT OnWmRestoreEnd(UINT uMsg, WPARAM wParam, LPARAM lParam);  
  63.     LRESULT OnWmFindItem(UINT uMsg, WPARAM wParam, LPARAM lParam);  
  64.     LRESULT OnWmFirstIn(UINT uMsg, WPARAM wParam, LPARAM lParam);  
  65.     LRESULT OnOnekeyOptEnd(UINT uMsg, WPARAM wParam, LPARAM lParam);  
  66.     LRESULT OnRefreshOnekeyOpt(UINT uMsg, WPARAM wParam, LPARAM lParam);  
  67.   
  68.     BOOL OnClickButton(CKsafeRunInfo* pInfo);  
  69.     BOOL OnDeleteItem(CKsafeRunInfo* pInfo);  
  70.     BOOL OnClickLabel(DWORD nIndex, CKsafeRunInfo* pInfo);  
  71.     void ClickCheck();  
  72.   
  73.     void UpdateClearInterface(int nSel);  
  74.   
  75. public:  
  76.   
  77.     void OnBkShowDisableItem();  
  78.     void OnListReSize(CRect rcWnd);  
  79.     void RefreshItemList();  
  80.     void OnBkCancelAll();  
  81.     void OnBkCancelAll2();  
  82.     void OnBkBtnWaitMore();  
  83.     void OnBkRunOptTopMore();  
  84.   
  85.     void RefreshCLRState(int nSel=-1, BOOL bDowning=FALSE);  
  86.     void RefreshUpdateState(int nSel=-1, BOOL bDowning=FALSE);  
  87.   
  88.     void RefreshTabNumber(DWORD nNewTab=-1);  
  89.     void SetTopRunDiv(DWORD nType);  
  90.     void GetRunListByCheckState();  
  91.   
  92.   
  93.     void InitAutoOptList();  
  94.     void OnBkBtnDoOpt();  
  95.     void OnAutoOptCheckAll();  
  96.     void OnAutoOptCheckAll2();  
  97.     void OnBkBtnRefresh();  
  98.     void OnBkBtnContinueOpt();  
  99.     void OnBkLnkViewRun();  
  100.     void OnBkLnkViewServ();  
  101.     void OnBkLnkViewTask();  
  102.     void OnTimer(UINT_PTR nIDEvent);//优化时定时器刷新显示loading动画  
  103.     void ShowOptDetail();  
  104.     void OnBkLnkCleanTrash();  
  105.     void OnBkLnkSoftMgr_ZJBJ();  
  106.     void OnBkCheckHideSystem();  
  107.     void ShowNoTaskInfo();  
  108.     static DWORD WINAPI OneKeyOptProc(LPVOID lpParam);  
  109.     BOOL Is3XXInstalled();  
  110.     void OnBkLnkShowIgnored();  
  111.     void OnBkLnkAddToIgnored();  
  112.     void SaveIgnoreID();  
  113.     void LoadIgnoredID();  
  114.     void GetIgnoredItem();  
  115.   
  116.     void OnBkLnkRefreshList();  
  117.       
  118. protected:  
  119.     CBeikeSafeMainDlg*      m_dlg;  
  120.     CRunOptListView         m_runList;  
  121.     IRunOptimizeEng*        m_pRunOptEng;  
  122.     DWORD                   m_nState;  
  123.     BOOL                    m_bFirstShowed;  
  124.     BOOL                    m_bFirstScanRunEnd;  
  125.     BOOL                    m_bOpting;  
  126.     BOOL                    m_bSkipToOnekeyOpt;  
  127.     BOOL                    m_bRefreshList;     //runlist刷新后置为TRUE,为TRUE则InitAutoOptList,再置为FALSE  
  128.     BOOL                    m_bReportOnekeyOpt; //进入一键优化tab,是否要上报  
  129.     CAutoRunOptList         m_list;  
  130.     HANDLE                  m_hOptimizeThread;  
  131.     CString                 m_strIniFilePath;  
  132.     CString                 m_strIgnoredIniPath;  
  133.     int                     m_nIgnoredCount;  
  134.     CSimpleArray<int>     m_arrayIgnoredID;  
  135.     CSimpleArray<CKsafeRunInfo*>  m_arrayItem;            //所有启动项  
  136.     CSimpleArray<CKsafeRunInfo*>  m_arrayIgnoredItem;     //忽略项  
  137.     CSimpleArray<CKsafeRunInfo*>  m_arrayOnekeyOptItem;   //除去忽略项之后的启动项  
  138. public:  
  139.     BK_NOTIFY_MAP(IDC_RICHVIEW_WIN)  
  140.         BK_NOTIFY_TAB_SELCHANGE(IDC_TAB_RUNOPT_TYPE,OnBkRunTypeSelChange)  
  141.         BK_NOTIFY_TAB_SELCHANGE(IDC_TAB_SYSOPT_LEFT,OnBkSysOptSelChange)  
  142.         BK_NOTIFY_ID_COMMAND(IDC_CHECKBOX_SHOW_DISABLE,OnBkShowDisableItem)  
  143.         BK_NOTIFY_ID_COMMAND(IDC_LBL_RUNOPT_REFRESH,OnBkLnkRefreshList)  
  144.         BK_NOTIFY_ID_COMMAND(IDC_BTN_SYSOPT_WAIT_MORE,OnBkBtnWaitMore)  
  145.         BK_NOTIFY_ID_COMMAND(IDC_BTN_RUNOPT_CANCEL_ALL,OnBkCancelAll)  
  146.         BK_NOTIFY_ID_COMMAND(IDC_LBL_RUNOPT_TOP_MORE,OnBkRunOptTopMore)  
  147.           
  148.         BK_NOTIFY_ID_COMMAND(IDC_BTN_RUN_AUTOOPT_DO,OnBkBtnDoOpt)  
  149.         BK_NOTIFY_ID_COMMAND(IDC_CHECKBOX_AUTOOPT_ALL,OnAutoOptCheckAll)  
  150.         BK_NOTIFY_ID_COMMAND(IDC_CHECKBOX_AUTOOPT_ALL2,OnAutoOptCheckAll2)  
  151.         BK_NOTIFY_ID_COMMAND(IDC_LNK_AUTOOPT_BTM_REFRESH,OnBkBtnRefresh)  
  152.         BK_NOTIFY_ID_COMMAND(IDC_BTN_AUTOOPT_BTM_CONTINUE,OnBkBtnContinueOpt)  
  153.           
  154.         BK_NOTIFY_ID_COMMAND(IDC_LNK_SHOW_IGNORED,OnBkLnkShowIgnored)  
  155.         BK_NOTIFY_ID_COMMAND(IDC_LNK_VIEW_IGNORED,OnBkLnkShowIgnored)  
  156.         BK_NOTIFY_ID_COMMAND(IDC_LNK_ADDTO_IGNORED,OnBkLnkAddToIgnored)  
  157.         BK_NOTIFY_ID_COMMAND(IDC_LNK_ADDTO_IGNORED2,OnBkLnkAddToIgnored)  
  158.         BK_NOTIFY_ID_COMMAND(IDC_LNK_VIEW_RUN,OnBkLnkViewRun)  
  159.         BK_NOTIFY_ID_COMMAND(IDC_LNK_VIEW_SERV,OnBkLnkViewServ)  
  160.         BK_NOTIFY_ID_COMMAND(IDC_LNK_VIEW_TASK,OnBkLnkViewTask)  
  161.         BK_NOTIFY_ID_COMMAND(IDC_LNK_AUTOOPT_CANCELALL,OnBkCancelAll2)  
  162.         BK_NOTIFY_ID_COMMAND(IDC_CHECKBOX_RUNOPT_HIDE_SYSTEM,OnBkCheckHideSystem)  
  163.         BK_NOTIFY_REALWND_RESIZED(IDC_LST_RUNOPT, OnListReSize)  
  164.     BK_NOTIFY_MAP_END()  
  165.   
  166.     BEGIN_MSG_MAP_EX(CBeikeSafeSysOptUIHandler)  
  167.         MSG_WM_TIMER(OnTimer)   //优化时定时器刷新显示loading动画  
  168.         MSG_BK_NOTIFY(IDC_RICHVIEW_WIN)  
  169.         MESSAGE_HANDLER_EX(MSG_SYSOPT_RUN_SCAN_END,     OnWmScanEnd)  
  170.         MESSAGE_HANDLER_EX(MSG_SYSOPT_RUN_RESTORE_END,  OnWmRestoreEnd)  
  171.         MESSAGE_HANDLER_EX(MSG_SYSOPT_RUN_SCAN_FIND,    OnWmFindItem)  
  172.         MESSAGE_HANDLER_EX(MSG_SYSOPT_RUN_FIRST_IN,     OnWmFirstIn)  
  173.         MESSAGE_HANDLER_EX(MSG_SYSOPT_ONEKEYOPT_END,    OnOnekeyOptEnd);  
  174.         MESSAGE_HANDLER_EX(MSG_SYSOPT_REFRESH_ONEKEYOPT,    OnRefreshOnekeyOpt)  
  175.     END_MSG_MAP()  
  176. };  

至于里面是怎么操作的!本文就不讨论了!

接着进入ksm(金山卫士主界面)了!


效果如图:



[cpp]  view plain  copy
  1. //显示视图  
  2. CEmbeddedView   m_viewVulfix;  

[cpp]  view plain  copy
  1. m_viewVulfix.Create(GetViewHWND(), NULL, WS_CHILD|WS_CLIPCHILDREN, 0, 3000);  
  2. ATLVERIFY( m_viewVulfix.Load( IDR_BK_VULDLG_MAIN ) );  
  3. m_viewVulfix.m_viewSoftVul.SetMainDlg( this );  
  4. m_viewVulfix.Init(m_hWnd);  
[cpp]  view plain  copy
  1. //操作关键类  
  2. class CBeikeVulfixHandler   
  3. public CBaseViewHandler<CEmbeddedView>  
  4.     , public CBkSafeUIHandlerBase  
  5. {  
  6. public:  
  7.     CBeikeVulfixHandler(CEmbeddedView &mainDlg);  
  8.     ~CBeikeVulfixHandler(void);  
  9.       
  10. public:  
  11.     BOOL Init(HWND hMainWnd, HWND hWndParent);  
  12.     void InitEnv();  
  13.     void SetMainDlg(CBeikeSafeMainDlg *pMainDlg);  
  14.     STATE_CLOSE_CHECK CloseCheck();  
  15.     void _SetDisplayState(TScanSoftState st, TRepairSubState subst=REPAIRSTATE_ING, LPCTSTR szMsg=NULL);  
  16.   
  17. protected:  
  18.     CBeikeSafeMainDlg *m_MainDlg;  
  19.     HWND m_hMainWnd;  
  20.     BOOL m_firstInited;  
  21.     DWORD m_dwPos;  
  22.     CListViewCtrlEx m_wndListCtrlVul, m_wndListCtrlVulFixing;  
  23.     BOOL m_bRelateInfoShowing;  
  24.     CRichEditCtrlEx m_ctlRichEdit;  
  25.     int m_nCurrentRelateInfoItem;  
  26.     CHyperTextCtrl m_ctlNaviLink;  
  27.       
  28.     bool m_bScanStarted;    // 看是否正在扫描xml, 还是还在等待信息(Win7 & Vista)   
  29.     // scan   
  30.     int m_nScanState, m_nTotalItem, m_nCurrentItem;  
  31.     DWORD m_dwScanBeginTime;  
  32.     // Repair   
  33.     int m_nRepairTotal, m_nRepairInstalled, m_nRepairDownloaded, m_nRepairProcessed;  
  34.     int m_nRepairCurrentRate;  
  35.       
  36.     CString m_strLastScanTime;  
  37.     T_WindowsInfo m_WinInfo;  
  38.     BOOL m_WinInfo64;  
  39.       
  40.     //   
  41.     INT m_nNumMust, m_nNumOption, m_nNumSP;  
  42.       
  43.   
  44.     // BK HANDLER  
  45.     void OnBkBtnSwitchRelateInfo();  
  46.     void OnBkBtnSelectAll();  
  47.     void OnBkBtnSelectNone();  
  48.     void OnBkBtnSelectAllSuggested();  
  49.     void OnBkBtnSelectAllOptional();  
  50.       
  51.     void OnBkBtnIgnore();   // 忽略  
  52.   
  53.     void OnBkBtnScan();  
  54.     void OnBkBtnCancelScan();  
  55.       
  56.     void OnBkBtnBeginRepair();  
  57.     void OnBkBtnCancelRepair();  
  58.     void OnBkBtnRunBackground();  
  59.     void OnBkBtnReboot();  
  60.       
  61.     void OnBkBtnEnableRelateCOM();  
  62.     void OnBkBtnDisableRelateCOM();  
  63.   
  64.     void OnBkBtnViewInstalled();  
  65.     void OnBkBtnViewIgnored();  
  66.     void OnBkBtnViewSupersede();  
  67.     void OnBkBtnViewInvalid();    
  68.       
  69.     void OnBkBtnErrorRepair();  
  70.     void OnBkBtnVisitVulPurposePage();  
  71.     void OnBkBtnExport();  
  72.     void OnListReSize(CRect rcWnd);  
  73.     void OnDownListReSize(CRect rcWnd);  
  74. public:  
  75.     // WM HANDLER  
  76.     LRESULT OnListBoxVulFixNotify(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);  
  77.     LRESULT OnVulFixEventHandle(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);  
  78.     LRESULT OnListLinkClicked(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);  
  79.   
  80.     LRESULT OnScanStart(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);  
  81.     LRESULT OnScanDone(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);  
  82.     LRESULT OnRepaireDone(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);  
  83.     LRESULT OnRichEditLink(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);  
  84.     LRESULT OnStnClickedNavi(WORD /*wNotifyCode*/WORD /*wID*/HWND /*hWndCtl*/BOOL/*bHandled*/);  
  85.   
  86.     void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);  
  87.   
  88. protected:  
  89.     int FindListItem( int nID );  
  90.     void _ShutdownComputer(BOOL bReboot);  
  91.     void _DisplayRelateVulFixInfo( int nItem );  
  92.     void _SetScanProgress( int nPos );  
  93.     void _SetRepairProgress( int nPos );  
  94.     void _UpdateRepairTitle();  
  95.     void _EnableRelateCOM( BOOL bEnable );  
  96.     void _FillScanResult();  
  97.       
  98.     bool _RepairSingle( int arrVulIds, T_VulListItemData* pItemData );  
  99.     void _EnableSelectedOpBtn(INT nMust, INT nSP, INT nOption);  
  100.   
  101.     void _NotifyTrayIcon(LPCTSTR szText, INT nTimeOut, BOOL bDelayShow=TRUE);  
  102.     void _ViewDetail(INT nSelTab);  
  103.     void _UpdateViewDetailBtnsNumber( INT nFixed, INT nIgnored, INT nReplaced, INT nInvalid );  
  104.     void _PromptAutoShutdown();  
  105.     void _UpdateScanResultTitle( INT nTipIcon, LPCTSTR szTips );  
  106.     BOOL _ExportResult( LPCTSTR szFileName, T_ExportInfoArray &arrExportInfo );  
  107.       
  108. public:  
  109.     BK_NOTIFY_MAP(IDC_RICHVIEW_WIN_VULFIX)  
  110.         // 系统漏洞   
  111.         BK_NOTIFY_ID_COMMAND(IDC_DIV_VULFIX_RESULT_SPLITTER, OnBkBtnSwitchRelateInfo)  
  112.         //选择全部  
  113.         BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_RESULT_CHECK_ALL, OnBkBtnSelectAll)  
  114.         //一个也不选  
  115.         BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_RESULT_UNCHECK_ALL, OnBkBtnSelectNone)        
  116.         //全部单选  
  117.         BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_RESULT_CHECK_OPTIONAL, OnBkBtnSelectAllOptional)          
  118.         //开始修复  
  119.         BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_RESULT_FIX, OnBkBtnBeginRepair)  
  120.         //开始扫描  
  121.         BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_RESULT_RESCAN, OnBkBtnScan)  
  122.         //忽略  
  123.         BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_RESULT_IGNORE, OnBkBtnIgnore)                 
  124.         // 扫描中   
  125.         BK_NOTIFY_ID_COMMAND(IDC_BTN_VULFIX_SCAN_CANCEL, OnBkBtnCancelScan)       
  126.         // 漏洞修复  
  127.         BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_REPAIR_TOP_CANCEL, OnBkBtnCancelRepair)  
  128.         //后台  
  129.         BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_REPAIR_TOP_BACKRUN, OnBkBtnRunBackground)  
  130.         //重启  
  131.         BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_REPAIR_TOP_REBOOT, OnBkBtnReboot)  
  132.         //开始扫描  
  133.         BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_REPAIR_TOP_RESCAN, OnBkBtnScan)  
  134.         //重启  
  135.         BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_REPAIR_TOP_REBOOT2, OnBkBtnReboot)  
  136.         //开始扫描  
  137.         BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_REPAIR_TOP_RESCAN2, OnBkBtnScan)  
  138.         //重启  
  139.         BK_NOTIFY_ID_COMMAND(IDC_DIV_VULFIX_REPAIR_BTM_DONE_PART, OnBkBtnReboot)  
  140.         //开始扫描  
  141.         BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_REPAIR_TOP_RESCAN3, OnBkBtnScan)  
  142.         BK_NOTIFY_ID_COMMAND(1052, OnBkBtnScan) // 修复, 所有下载失败, 则直接显示重新扫描  
  143.   
  144.         //扫描失败  
  145.         BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_ERROR_REPAIR, OnBkBtnErrorRepair)  
  146.   
  147.         BK_NOTIFY_ID_COMMAND(1034, OnBkBtnVisitVulPurposePage)  
  148.         //输出信息  
  149.         BK_NOTIFY_ID_COMMAND(2001, OnBkBtnExport)  
  150.           
  151.           
  152.   
  153.         BK_NOTIFY_REALWND_RESIZED(IDC_LST_VULFIX_RESULT_LIST, OnListReSize)  
  154.         BK_NOTIFY_REALWND_RESIZED(IDC_LST_VULFIX_FIXING_LIST, OnDownListReSize)  
  155.           
  156.         // 查看已忽略/已安装  
  157.         //BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_SHOW_IGNORED_DLG, OnBkBtnViewIgnored)   
  158.         //BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_SHOW_INSTALLED_DLG, OnBkBtnViewInstalled)   
  159.         //BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_SHOW_SUPERSEDED_DLG, OnBkBtnViewSupersede)  
  160.         //BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_SHOW_INVALID_DLG, OnBkBtnViewInvalid)  
  161.     BK_NOTIFY_MAP_END()  
  162.       
  163.     BEGIN_MSG_MAP_EX(CBeikeVulfixHandler)  
  164.         MSG_BK_NOTIFY(IDC_RICHVIEW_WIN_VULFIX)  
  165.           
  166.         MESSAGE_HANDLER(WMH_SCAN_START, OnScanStart)  
  167.         MESSAGE_HANDLER(WMH_SCAN_DONE, OnScanDone)  
  168.         MESSAGE_HANDLER(WMH_REPAIR_DONE, OnRepaireDone)   
  169.         MESSAGE_HANDLER(WMH_SCAN_SOFT_DONE, OnScanDone)  
  170.         MESSAGE_RANGE_HANDLER(WMH_VULFIX_BASE, WMH_VULFIX_BASE+EVulfix_Task_Error, OnVulFixEventHandle)  
  171.         MESSAGE_HANDLER(WMH_LISTEX_LINK, OnListLinkClicked)  
  172.   
  173.         NOTIFY_ID_HANDLER(IDC_LST_VULFIX_RESULT_LIST, OnListBoxVulFixNotify)  
  174.         NOTIFY_HANDLER(IDC_TXT_VULFIX_VUL_DESCRIPTION, EN_LINK, OnRichEditLink)  
  175.         COMMAND_HANDLER(1016, STN_CLICKED, OnStnClickedNavi)  
  176.         //MSG_WM_CHAR(OnChar)  
  177.     END_MSG_MAP()  
  178. };  
至于里面是怎么操作的!本文就不讨论了!

最后是pcmanager了,它是开源卫士完整版,也就是前面的集合了!~

学习的目标是成熟!~~~



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值