开源项目之金山卫士

金山卫士是一款由金山网络技术有限公司出品的查杀木马能力强、检测漏洞快、体积小巧的免费安全软件。它采用金山领先的云安全技术,不仅能查杀上亿已知木马,还能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。

程序入口代码:

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, int /*nCmdShow*/)
{
#   ifdef _DEBUG

    //bkconsole theConsole;

#   endif

    HRESULT hRet = E_FAIL;

//	g_dwMainThreadId = ::GetCurrentThreadId();
    
	//初始化路径 操作注册表
    hRet = _Module.Init(hInstance);
    if (FAILED(hRet))
        return -1;

	//确认管理员权限
	if (FALSE == _Module.CheckIntegrityLevel())
		return -2;

	//初始化控件
    ::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

	//加载riched20.dll字符编辑器相关文件。
	_Module.InitRichEdit2();

	//运行主程序  接下来就是加载图片了(BkResManager::SetResourcePath(strPath)) ……
    _Module.RunMain();

    ::CoUninitialize();

    return 0;
}

//加载UI
void CBKSafeVulModule::_InitUIResource()
{

    BkString::Load(IDR_BK_STRING_DEF);
    BkFontPool::SetDefaultFont(BkString::Get(IDS_APP_FONT), -12);
    BkSkin::LoadSkins(IDR_BK_SKIN_DEF);
    BkStyle::LoadStyles(IDR_BK_STYLE_DEF);
}


//开始扫描漏洞
void CBeikeSafeMainDlg::StartScanLeak()
{
	m_viewVulfix.ShowWindow(SW_SHOW);
	if(!m_bVulfixInited || m_bVulfixRescanRequired)
	{
		BOOL toRescan = TRUE;
		if(m_bVulfixRescanRequired && theEngine && theEngine->m_isRepairing)
		{
			toRescan = FALSE;
		}			
		m_bVulfixInited = TRUE;
		m_bVulfixRescanRequired = FALSE;
		if(toRescan)
			m_viewVulfix.m_viewSoftVul.InitEnv();
	}
}

//初始化扫描引擎
void CBeikeVulfixHandler::InitEnv()
{
	if(!theEngine)
	{
		theEngine = new CVulEngine;	
		theEngine->_InitFunctions();

		m_WinInfo.Init();
		//m_WinInfo64 = IsWin64();
	}
	//开始扫描
	PostMessage( WMH_SCAN_START, 0, 0);
}
	//对应的功能函数声明
	LRESULT OnScanStart(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnScanDone(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	bool _RepairSingle( int arrVulIds, T_VulListItemData* pItemData );

//开始扫描
LRESULT CBeikeVulfixHandler::OnScanStart( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled )
{
	OnBkBtnScan();
	return 0;
}
void CBeikeVulfixHandler::OnBkBtnScan()
{
	if(m_firstInited)
	{
		// Clean downloaded files 
		BOOL bSave = BKSafeConfig::Get_Vulfix_SaveDownFile();
		if( !bSave )
			theEngine->m_fixLog.CleanFiles(FALSE, NULL);
		m_firstInited = FALSE;
		SetItemVisible(1015, !theEngine->IsSystemSupported());
	}
	
	ResetListCtrl(m_wndListCtrlVul);
	if( theEngine->ScanVul( m_RefWin.m_hWnd ) )
	{
		m_dwScanBeginTime = GetTickCount();
		m_bScanStarted = FALSE;

		m_nScanState = 0;
		m_nTotalItem = 0;
		m_nCurrentItem = 0;
		_SetDisplayState(SCANSTATE_SCANNING);
		_SetScanProgress( 0 );
		m_RefWin.SetTimer(0, 200, NULL);
		m_wndListCtrlVul.SetEmptyString(BkString::Get(IDS_VULFIX_5027));
		m_RefWin.StartIconAnimate( IDC_IMG_VULFIX_SCAN_ANIMATION, IDC_PROGRESS_VULFIX_SCANNING, 300);
		SetItemDWordAttribute(IDC_PROGRESS_VULFIX_SCANNING, "showpercent", 0);
	}
}
//修复
bool CBeikeVulfixHandler::_RepairSingle( int arrVulIds, T_VulListItemData* pItemData )
{
	if(!theEngine->CheckRepairPrequisite(pItemData->nType==VTYPE_OFFICE))
		return FALSE;
	
	CSimpleArray<int>	vulId;
	CSimpleArray<int>	softId;
	
	if ( pItemData->nType == VTYPE_SOFTLEAK )
		softId.Add(arrVulIds);
	else
		vulId.Add(arrVulIds);

	m_nRepairTotal = 1;
	m_nRepairInstalled = 0;
	m_nRepairDownloaded = 0;
	m_nRepairProcessed = 0;
	m_nRepairCurrentRate = 0;

	m_RefWin.StartIconAnimate(30100);

	_SetDisplayState(SCANSTATE_REPAIRING);
	_UpdateRepairTitle();

	// Fill the list ctrl 
	ResetListCtrl(m_wndListCtrlVulFixing);
	AppendItem2RepairList( m_wndListCtrlVulFixing, new T_VulListItemData( *pItemData ) );
	
	// Fix 	
	return theEngine->RepairAll( m_RefWin.m_hWnd, vulId, softId);
}

测试漏洞代码:

int _tmain(int argc, _TCHAR* argv[])
{
	_tsetlocale(0, _T("chs"));

	//模拟参数
	argc = 2;
	argv[0] = L"";
	argv[1] = L"1";


    if ( argc < 2 )
    {
        _tprintf( _T("参数:\n") );
        _tprintf( _T("1: 测试快速扫描\n") );
        _tprintf( _T("2: 测试全面扫描\n") );
        _tprintf( _T("3: 测试修复功能\n") );
        return 0;
    }

    if ( 0 ==  _tcsicmp( argv[1], _T("1") ) )
    {

        _tprintf(_T("测试快速扫描\n"));
        PressAnyKeyToContinue();
        TestQuickScan();
        goto Exit0;
    }

    if ( 0 == _tcsicmp( argv[1], _T("2") ) )
    {
        _tprintf(_T("测试全面扫描\n"));
        PressAnyKeyToContinue();
        TestFullScan();
        goto Exit0;
    }

	if ( 0 == _tcsicmp( argv[1], _T("3") ) )
    {
        _tprintf(_T("测试修复功能,为避免风险,可选和软件漏洞不做修复\n"));
        PressAnyKeyToContinue();
        TestRepair();
    }

Exit0:
	PressAnyKeyToContinue();
	return 0;
}
TestQuickScan()
HRESULT WINAPI ExpressScanLeak(IVulCollection **pVulCollection, DWORD dwFlags, BOOL bQuickScan);
如果成功, 先调用 IVulCollection::get_Status
 如果S_OK, 则根据status 来判断是否有漏洞风险, -1, 0 表示可能无风险, 1 表示可能有风险
 否则,根据 IVulCollection::get_VulCount 和 IVulCollection::get_Item 来判断是否有漏洞存在, 具体看例子中函数 DumpIVulCollection 

TestRepair()
使用接口 IVulfix 的方法 Scan 扫描漏洞, 扫描完成后使用方法 GetResults, GetSoftVuls 分别获取系统漏洞列表, 和软件漏洞列表
使用接口 IRepairVul 修复漏洞

漏洞修复测试代码结束!

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


程序效果如图:


代码分析:

//程序的初始化
LRESULT CMainDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
    HICON hIcon = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), 
        IMAGE_ICON, ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR);
    SetIcon(hIcon, TRUE);
    HICON hIconSmall = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), 
        IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
    SetIcon(hIconSmall, FALSE);

    // 创建大字体
    CFontHandle hFont = GetFont();
    LOGFONT logFont = { 0 };
    hFont.GetLogFont(&logFont);
    logFont.lfHeight = -14;
    logFont.lfWeight = FW_BOLD;
    m_fontBig.CreateFontIndirect(&logFont);
    DoDataExchange();

    CString strTitle = _T("金山卫士ARP防火墙");
    SetBkSkin(m_bmpSkin);
    InitSkinDialog(m_bmpCloseBtn, NULL, strTitle);
    SetWindowPos(NULL, 0, 0, 496, 184, SWP_NOMOVE);
    CenterWindow();

    m_btnEnable.InitButton(m_bmpEnableBtn);
    m_btnEnable.SetWindowText(_T(""));
	m_btnEnable.SetWindowPos(NULL, 412, 53, 0, 0, SWP_NOSIZE);
    m_btnDisable.InitButton(m_bmpDisableBtn);
    m_btnDisable.SetWindowText(_T(""));
	m_btnDisable.SetWindowPos(NULL, 412, 53, 0, 0, SWP_NOSIZE);
	m_lnkSetting.SetWindowPos(NULL, 424, 100, 0, 0, SWP_NOSIZE);
	//GetDlgItem(IDC_LOG_GROUP).SetWindowPos(NULL, 11, 120, 476, 104, 0);
	GetDlgItem(IDC_TXT_LOG).SetWindowPos(NULL, 20, 136, 0, 0, SWP_NOSIZE);
	m_lnkVersion.SetWindowPos(NULL, 20, 160, 0, 0, SWP_NOSIZE);
	m_lnkBBS.SetWindowPos(NULL, 120, 160, 0, 0, SWP_NOSIZE);
	m_lnkViewLog.SetWindowPos(NULL, 460, 136, 0, 0, SWP_NOSIZE);
	GetDlgItem(IDC_LINE).SetWindowPos(NULL, 20, 127, 466, 1, 0);

    CString strVersion = _T("版本:"); 
    strVersion += _Module.GetProductVersion();
    m_lnkVersion.SetWindowText(strVersion);

    if (m_piArpSetting)
    {
        m_piArpSetting->IsArpFwEnable(&m_bFwEnable);
    }

	//更新UI
    UpdateUI();
	//创建线程开始工作 
    StartWork();

    return TRUE;
}

//工作线程
UINT CMainDlg::WorkThreadProc(LPVOID pSetting)
{
    CMainDlg* pThis = (CMainDlg*)pSetting;
    IArpFwSetting* piArpSetting = NULL;
    HANDLE hExitSignal = NULL;
    HRESULT hRetCode;
    wchar_t szLastLog[512] = { 0 };

    KAV_PROCESS_ERROR(pThis);

    piArpSetting = pThis->m_piArpSetting;
    KAV_PROCESS_ERROR(piArpSetting);

    hExitSignal = pThis->m_hExitSignal;
    KAV_PROCESS_ERROR(hExitSignal);

    for (;;)
    {
        BOOL bEnable = FALSE;

        if (::WaitForSingleObject(hExitSignal, 1000) == WAIT_OBJECT_0)
            break;

        hRetCode = piArpSetting->IsArpFwEnable(&bEnable);
        if (FAILED(hRetCode))
            continue;

        pThis->PostMessage(WM_ARPFW_STATE, bEnable, 0);

        hRetCode = piArpSetting->GetLastLog(512, szLastLog);
        if (FAILED(hRetCode))
            continue;

        pThis->SendMessage(WM_ARPFW_LASTLOG, (WPARAM)szLastLog);
    }

Exit0:
    _endthreadex(0);
    return 0;
}

	//控制arp的对象
    KComInterfacePtr<IArpFwSetting> m_spIArpFwSetting;
    KComInterfacePtr<IKArpSp> m_spIArpFwSp;

    //实例化
    m_spIArpFwSetting.LoadInterface(_T("arpsetting.dll"));
    m_spIArpFwSp.LoadInterface(_T("arpproxy.dll"));

//加载
BOOL CArpSetting::Install()
{
    BOOL retval = FALSE;
    BOOL bRetCode;

    KAV_PROCESS_ERROR(m_spIArpFwSetting);

    bRetCode = m_spIArpFwSetting->InstallArpFw();
    KAV_PROCESS_ERROR(bRetCode);

    retval = TRUE;

Exit0:
    return retval;
}

//卸载
BOOL CArpSetting::UnInstall()
{
    BOOL retval = FALSE;
    BOOL bRetCode;

    KAV_PROCESS_ERROR(m_spIArpFwSetting);

    bRetCode = m_spIArpFwSetting->UnInstallArpFw();
    KAV_PROCESS_ERROR(bRetCode);

    retval = TRUE;

Exit0:
    return retval;
}

//开启
BOOL CArpSetting::StartSP()
{
    BOOL retval = FALSE;
    BOOL bRetCode;

    KAV_PROCESS_ERROR(m_spIArpFwSp);

    KxeBaseInit();

    bRetCode = m_spIArpFwSp->Start();
    KAV_PROCESS_ERROR(bRetCode);

    retval = TRUE;

Exit0:
    return retval;
}

//停止
BOOL CArpSetting::StopSP()
{
    BOOL retval = FALSE;
    BOOL bRetCode;

    KAV_PROCESS_ERROR(m_spIArpFwSp);

    bRetCode = m_spIArpFwSp->Stop();
    KAV_PROCESS_ERROR(bRetCode);

    KxeBaseUnInit();

    retval = TRUE;

Exit0:
    return retval;
}

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

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

项目如图:



效果如图:



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

关键代码:

    //清除实例对象
IKClear*    m_piKClear;

//初始化清除实例对象
BOOL MainWnd::InitKClear()
{
    BOOL retval = FALSE;
    CreateKClearObject_t CreateKClearObject = NULL;
    TCHAR szKClearPath[MAX_PATH] = { 0 };
    HRESULT hr;
    HMODULE hKClear = NULL;
    IKClear* piKClear = NULL;
    HWND hWnd = NULL;

    if (!m_hKClear)
    {
        ::GetModuleFileName(NULL, szKClearPath, MAX_PATH);
        PathRemoveFileSpec(szKClearPath);
        PathAppend(szKClearPath, _T("kclear.dll"));
        hKClear = LoadLibrary(szKClearPath);
        if (!hKClear)
            goto clean0;

        m_hKClear = hKClear;
    }

    if (!m_piKClear)
    {
        CreateKClearObject = (CreateKClearObject_t)GetProcAddress(m_hKClear, "CreateKClearObject");
        if (!CreateKClearObject)
            goto clean0;

        hr = CreateKClearObject(__uuidof(IKClear), (void**)&piKClear);
        if (FAILED(hr))
            goto clean0;

        m_piKClear = piKClear;
    }

    if (!m_wndKClear.m_hWnd)
    {
        hWnd = m_piKClear->CreateKClear(m_hWnd);
        m_wndKClear.m_hWnd = hWnd;
        m_wndKClear.ShowWindow(SW_SHOW);
    }

    retval = TRUE;

clean0:
    if (!retval)
    {
        UnInitKClear();
    }

    return retval;
}

//释放清除对象资源
void MainWnd::UnInitKClear()
{
    if (m_wndKClear.m_hWnd)
    {
        m_wndKClear.DestroyWindow();
    }

//     if (m_piKClear)
//     {
//         m_piKClear->Release();
//         m_piKClear = NULL;
//     }
// 
//     if (m_hKClear)
//     {
//         FreeLibrary(m_hKClear);
//         m_hKClear = NULL;
//     }
}

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

int MainWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    SetWindowPos(NULL, 0, 0, 800, 570, SWP_NOREPOSITION);
    CenterWindow();

    InitKClear();

    return 0;
}

清除操作完毕!~~

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

项目如图:


效果如图:


//关键对象

	CBeikeSafeSysOptUIHandler*       m_sysoptHandler;
//构造
	m_sysoptHandler = new CBeikeSafeSysOptUIHandler(this);

//初始化
	(*m_sysoptHandler).Init();
	(*m_sysoptHandler).FirstShow();

//操作关键类
class CBeikeSafeSysOptUIHandler :
	public IEnumRunCallBackNull,
	public IAutoOptLstCBack,
	public IListOpCallback
{
public:
	CBeikeSafeSysOptUIHandler(CBeikeSafeMainDlg* refDialog)
		: m_dlg(refDialog)
		, m_pRunOptEng(NULL)
		, m_nState(STATE_RUNOPT_NULL)
		, m_bFirstShowed(FALSE)
		, m_bFirstScanRunEnd(FALSE)
		, m_bSkipToOnekeyOpt(FALSE)
		, m_hOptimizeThread(NULL)
		, m_bOpting(FALSE)
		, m_bRefreshList(FALSE)
		, m_nIgnoredCount(0)
		, m_bReportOnekeyOpt(TRUE)
	{
	}

	virtual ~CBeikeSafeSysOptUIHandler()
	{
		if (m_pRunOptEng!=NULL)
		{
			CRunOptLoader::GetGlobalPtr()->FreeOptEng(m_pRunOptEng);
			m_pRunOptEng = NULL;
		}
		if (m_hOptimizeThread != NULL)
		{
			::CloseHandle(m_hOptimizeThread);
			m_hOptimizeThread = NULL;
		}
	}

public:
	BOOL IsOpPermit()
	{
		return (m_nState==STATE_RUNOPT_NULL);
	}

	void Init();
	void FirstShow();
	void SecondShow();
	BOOL OnBkRunTypeSelChange(int nTabItemIDOld, int nTabItemIDNew);
	BOOL OnBkSysOptSelChange(int nTabItemIDOld, int nTabItemIDNew);

	void InitEng()
	{
		if (m_pRunOptEng==NULL)
			m_pRunOptEng = CRunOptLoader::GetGlobalPtr()->GetOptEng();
	}

	BOOL FindRunItem(CKsafeRunInfo* pInfo);
	BOOL _FindRunItem(CKsafeRunInfo* pInfo);
	void EndScan();
	void RestoreEnd();
	void PostRestoreRunItem(DWORD nType,BOOL bEnable,LPCTSTR lpName);

	LRESULT OnWmScanEnd(UINT uMsg, WPARAM wParam, LPARAM lParam);
	LRESULT OnWmRestoreEnd(UINT uMsg, WPARAM wParam, LPARAM lParam);
	LRESULT OnWmFindItem(UINT uMsg, WPARAM wParam, LPARAM lParam);
	LRESULT OnWmFirstIn(UINT uMsg, WPARAM wParam, LPARAM lParam);
	LRESULT OnOnekeyOptEnd(UINT uMsg, WPARAM wParam, LPARAM lParam);
	LRESULT OnRefreshOnekeyOpt(UINT uMsg, WPARAM wParam, LPARAM lParam);

	BOOL OnClickButton(CKsafeRunInfo* pInfo);
	BOOL OnDeleteItem(CKsafeRunInfo* pInfo);
	BOOL OnClickLabel(DWORD nIndex, CKsafeRunInfo* pInfo);
	void ClickCheck();

    void UpdateClearInterface(int nSel);

public:

	void OnBkShowDisableItem();
	void OnListReSize(CRect rcWnd);
	void RefreshItemList();
	void OnBkCancelAll();
	void OnBkCancelAll2();
	void OnBkBtnWaitMore();
	void OnBkRunOptTopMore();

	void RefreshCLRState(int nSel=-1, BOOL bDowning=FALSE);
    void RefreshUpdateState(int nSel=-1, BOOL bDowning=FALSE);

	void RefreshTabNumber(DWORD nNewTab=-1);
	void SetTopRunDiv(DWORD nType);
	void GetRunListByCheckState();


	void InitAutoOptList();
	void OnBkBtnDoOpt();
	void OnAutoOptCheckAll();
	void OnAutoOptCheckAll2();
	void OnBkBtnRefresh();
	void OnBkBtnContinueOpt();
	void OnBkLnkViewRun();
	void OnBkLnkViewServ();
	void OnBkLnkViewTask();
	void OnTimer(UINT_PTR nIDEvent);//优化时定时器刷新显示loading动画
	void ShowOptDetail();
	void OnBkLnkCleanTrash();
	void OnBkLnkSoftMgr_ZJBJ();
	void OnBkCheckHideSystem();
	void ShowNoTaskInfo();
	static DWORD WINAPI	OneKeyOptProc(LPVOID lpParam);
	BOOL Is3XXInstalled();
	void OnBkLnkShowIgnored();
	void OnBkLnkAddToIgnored();
	void SaveIgnoreID();
	void LoadIgnoredID();
	void GetIgnoredItem();

	void OnBkLnkRefreshList();
	
protected:
	CBeikeSafeMainDlg*		m_dlg;
	CRunOptListView			m_runList;
	IRunOptimizeEng*		m_pRunOptEng;
	DWORD					m_nState;
	BOOL					m_bFirstShowed;
	BOOL					m_bFirstScanRunEnd;
	BOOL					m_bOpting;
	BOOL					m_bSkipToOnekeyOpt;
	BOOL					m_bRefreshList;		//runlist刷新后置为TRUE,为TRUE则InitAutoOptList,再置为FALSE
	BOOL					m_bReportOnekeyOpt;	//进入一键优化tab,是否要上报
	CAutoRunOptList			m_list;
	HANDLE					m_hOptimizeThread;
	CString					m_strIniFilePath;
	CString					m_strIgnoredIniPath;
	int						m_nIgnoredCount;
	CSimpleArray<int>		m_arrayIgnoredID;
	CSimpleArray<CKsafeRunInfo*>	m_arrayItem;			//所有启动项
	CSimpleArray<CKsafeRunInfo*>	m_arrayIgnoredItem;		//忽略项
	CSimpleArray<CKsafeRunInfo*>	m_arrayOnekeyOptItem;	//除去忽略项之后的启动项
public:
	BK_NOTIFY_MAP(IDC_RICHVIEW_WIN)
		BK_NOTIFY_TAB_SELCHANGE(IDC_TAB_RUNOPT_TYPE,OnBkRunTypeSelChange)
		BK_NOTIFY_TAB_SELCHANGE(IDC_TAB_SYSOPT_LEFT,OnBkSysOptSelChange)
		BK_NOTIFY_ID_COMMAND(IDC_CHECKBOX_SHOW_DISABLE,OnBkShowDisableItem)
		BK_NOTIFY_ID_COMMAND(IDC_LBL_RUNOPT_REFRESH,OnBkLnkRefreshList)
		BK_NOTIFY_ID_COMMAND(IDC_BTN_SYSOPT_WAIT_MORE,OnBkBtnWaitMore)
		BK_NOTIFY_ID_COMMAND(IDC_BTN_RUNOPT_CANCEL_ALL,OnBkCancelAll)
		BK_NOTIFY_ID_COMMAND(IDC_LBL_RUNOPT_TOP_MORE,OnBkRunOptTopMore)
		
		BK_NOTIFY_ID_COMMAND(IDC_BTN_RUN_AUTOOPT_DO,OnBkBtnDoOpt)
		BK_NOTIFY_ID_COMMAND(IDC_CHECKBOX_AUTOOPT_ALL,OnAutoOptCheckAll)
		BK_NOTIFY_ID_COMMAND(IDC_CHECKBOX_AUTOOPT_ALL2,OnAutoOptCheckAll2)
		BK_NOTIFY_ID_COMMAND(IDC_LNK_AUTOOPT_BTM_REFRESH,OnBkBtnRefresh)
		BK_NOTIFY_ID_COMMAND(IDC_BTN_AUTOOPT_BTM_CONTINUE,OnBkBtnContinueOpt)
		
		BK_NOTIFY_ID_COMMAND(IDC_LNK_SHOW_IGNORED,OnBkLnkShowIgnored)
		BK_NOTIFY_ID_COMMAND(IDC_LNK_VIEW_IGNORED,OnBkLnkShowIgnored)
		BK_NOTIFY_ID_COMMAND(IDC_LNK_ADDTO_IGNORED,OnBkLnkAddToIgnored)
		BK_NOTIFY_ID_COMMAND(IDC_LNK_ADDTO_IGNORED2,OnBkLnkAddToIgnored)
		BK_NOTIFY_ID_COMMAND(IDC_LNK_VIEW_RUN,OnBkLnkViewRun)
		BK_NOTIFY_ID_COMMAND(IDC_LNK_VIEW_SERV,OnBkLnkViewServ)
		BK_NOTIFY_ID_COMMAND(IDC_LNK_VIEW_TASK,OnBkLnkViewTask)
		BK_NOTIFY_ID_COMMAND(IDC_LNK_AUTOOPT_CANCELALL,OnBkCancelAll2)
		BK_NOTIFY_ID_COMMAND(IDC_CHECKBOX_RUNOPT_HIDE_SYSTEM,OnBkCheckHideSystem)
		BK_NOTIFY_REALWND_RESIZED(IDC_LST_RUNOPT, OnListReSize)
	BK_NOTIFY_MAP_END()

	BEGIN_MSG_MAP_EX(CBeikeSafeSysOptUIHandler)
		MSG_WM_TIMER(OnTimer)	//优化时定时器刷新显示loading动画
		MSG_BK_NOTIFY(IDC_RICHVIEW_WIN)
		MESSAGE_HANDLER_EX(MSG_SYSOPT_RUN_SCAN_END,		OnWmScanEnd)
		MESSAGE_HANDLER_EX(MSG_SYSOPT_RUN_RESTORE_END,	OnWmRestoreEnd)
		MESSAGE_HANDLER_EX(MSG_SYSOPT_RUN_SCAN_FIND,	OnWmFindItem)
		MESSAGE_HANDLER_EX(MSG_SYSOPT_RUN_FIRST_IN,		OnWmFirstIn)
		MESSAGE_HANDLER_EX(MSG_SYSOPT_ONEKEYOPT_END,	OnOnekeyOptEnd);
		MESSAGE_HANDLER_EX(MSG_SYSOPT_REFRESH_ONEKEYOPT,	OnRefreshOnekeyOpt)
	END_MSG_MAP()
};

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

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


效果如图:



	//显示视图
	CEmbeddedView	m_viewVulfix;

	m_viewVulfix.Create(GetViewHWND(), NULL, WS_CHILD|WS_CLIPCHILDREN, 0, 3000);
	ATLVERIFY( m_viewVulfix.Load( IDR_BK_VULDLG_MAIN ) );
	m_viewVulfix.m_viewSoftVul.SetMainDlg( this );
	m_viewVulfix.Init(m_hWnd);
//操作关键类
class CBeikeVulfixHandler 
: public CBaseViewHandler<CEmbeddedView>
	, public CBkSafeUIHandlerBase
{
public:
	CBeikeVulfixHandler(CEmbeddedView &mainDlg);
	~CBeikeVulfixHandler(void);
	
public:
	BOOL Init(HWND hMainWnd, HWND hWndParent);
	void InitEnv();
	void SetMainDlg(CBeikeSafeMainDlg *pMainDlg);
	STATE_CLOSE_CHECK CloseCheck();
	void _SetDisplayState(TScanSoftState st, TRepairSubState subst=REPAIRSTATE_ING, LPCTSTR szMsg=NULL);

protected:
	CBeikeSafeMainDlg *m_MainDlg;
	HWND m_hMainWnd;
	BOOL m_firstInited;
	DWORD m_dwPos;
	CListViewCtrlEx m_wndListCtrlVul, m_wndListCtrlVulFixing;
	BOOL m_bRelateInfoShowing;
	CRichEditCtrlEx m_ctlRichEdit;
	int m_nCurrentRelateInfoItem;
	CHyperTextCtrl m_ctlNaviLink;
	
	bool m_bScanStarted;	// 看是否正在扫描xml, 还是还在等待信息(Win7 & Vista) 
	// scan 
	int m_nScanState, m_nTotalItem, m_nCurrentItem;
	DWORD m_dwScanBeginTime;
	// Repair 
	int m_nRepairTotal, m_nRepairInstalled, m_nRepairDownloaded, m_nRepairProcessed;
	int m_nRepairCurrentRate;
	
	CString m_strLastScanTime;
	T_WindowsInfo m_WinInfo;
	BOOL m_WinInfo64;
	
	// 
	INT m_nNumMust, m_nNumOption, m_nNumSP;
	

	// BK HANDLER
	void OnBkBtnSwitchRelateInfo();
	void OnBkBtnSelectAll();
	void OnBkBtnSelectNone();
	void OnBkBtnSelectAllSuggested();
	void OnBkBtnSelectAllOptional();
	
	void OnBkBtnIgnore();	// 忽略

	void OnBkBtnScan();
	void OnBkBtnCancelScan();
	
	void OnBkBtnBeginRepair();
	void OnBkBtnCancelRepair();
	void OnBkBtnRunBackground();
	void OnBkBtnReboot();
	
	void OnBkBtnEnableRelateCOM();
	void OnBkBtnDisableRelateCOM();

	void OnBkBtnViewInstalled();
	void OnBkBtnViewIgnored();
	void OnBkBtnViewSupersede();
	void OnBkBtnViewInvalid();	
	
	void OnBkBtnErrorRepair();
	void OnBkBtnVisitVulPurposePage();
	void OnBkBtnExport();
	void OnListReSize(CRect rcWnd);
	void OnDownListReSize(CRect rcWnd);
public:
	// WM HANDLER
	LRESULT OnListBoxVulFixNotify(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
	LRESULT OnVulFixEventHandle(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnListLinkClicked(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);

	LRESULT OnScanStart(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnScanDone(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnRepaireDone(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnRichEditLink(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
	LRESULT OnStnClickedNavi(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/);

	void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);

protected:
	int FindListItem( int nID );
	void _ShutdownComputer(BOOL bReboot);
	void _DisplayRelateVulFixInfo( int nItem );
	void _SetScanProgress( int nPos );
	void _SetRepairProgress( int nPos );
	void _UpdateRepairTitle();
	void _EnableRelateCOM( BOOL bEnable );
	void _FillScanResult();
	
	bool _RepairSingle( int arrVulIds, T_VulListItemData* pItemData );
	void _EnableSelectedOpBtn(INT nMust, INT nSP, INT nOption);

	void _NotifyTrayIcon(LPCTSTR szText, INT nTimeOut, BOOL bDelayShow=TRUE);
	void _ViewDetail(INT nSelTab);
	void _UpdateViewDetailBtnsNumber( INT nFixed, INT nIgnored, INT nReplaced, INT nInvalid );
	void _PromptAutoShutdown();
	void _UpdateScanResultTitle( INT nTipIcon, LPCTSTR szTips );
	BOOL _ExportResult( LPCTSTR szFileName, T_ExportInfoArray &arrExportInfo );
	
public:
	BK_NOTIFY_MAP(IDC_RICHVIEW_WIN_VULFIX)
		// 系统漏洞 
		BK_NOTIFY_ID_COMMAND(IDC_DIV_VULFIX_RESULT_SPLITTER, OnBkBtnSwitchRelateInfo)
		//选择全部
		BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_RESULT_CHECK_ALL, OnBkBtnSelectAll)
		//一个也不选
		BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_RESULT_UNCHECK_ALL, OnBkBtnSelectNone)		
		//全部单选
		BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_RESULT_CHECK_OPTIONAL, OnBkBtnSelectAllOptional)		
		//开始修复
		BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_RESULT_FIX, OnBkBtnBeginRepair)
		//开始扫描
		BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_RESULT_RESCAN, OnBkBtnScan)
		//忽略
		BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_RESULT_IGNORE, OnBkBtnIgnore)				
		// 扫描中 
		BK_NOTIFY_ID_COMMAND(IDC_BTN_VULFIX_SCAN_CANCEL, OnBkBtnCancelScan)		
		// 漏洞修复
		BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_REPAIR_TOP_CANCEL, OnBkBtnCancelRepair)
		//后台
		BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_REPAIR_TOP_BACKRUN, OnBkBtnRunBackground)
		//重启
		BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_REPAIR_TOP_REBOOT, OnBkBtnReboot)
		//开始扫描
		BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_REPAIR_TOP_RESCAN, OnBkBtnScan)
		//重启
		BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_REPAIR_TOP_REBOOT2, OnBkBtnReboot)
		//开始扫描
		BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_REPAIR_TOP_RESCAN2, OnBkBtnScan)
		//重启
		BK_NOTIFY_ID_COMMAND(IDC_DIV_VULFIX_REPAIR_BTM_DONE_PART, OnBkBtnReboot)
		//开始扫描
		BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_REPAIR_TOP_RESCAN3, OnBkBtnScan)
		BK_NOTIFY_ID_COMMAND(1052, OnBkBtnScan)	// 修复, 所有下载失败, 则直接显示重新扫描

		//扫描失败
		BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_ERROR_REPAIR, OnBkBtnErrorRepair)

		BK_NOTIFY_ID_COMMAND(1034, OnBkBtnVisitVulPurposePage)
		//输出信息
		BK_NOTIFY_ID_COMMAND(2001, OnBkBtnExport)
		
		

		BK_NOTIFY_REALWND_RESIZED(IDC_LST_VULFIX_RESULT_LIST, OnListReSize)
		BK_NOTIFY_REALWND_RESIZED(IDC_LST_VULFIX_FIXING_LIST, OnDownListReSize)
		
		// 查看已忽略/已安装
		//BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_SHOW_IGNORED_DLG, OnBkBtnViewIgnored)	
		//BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_SHOW_INSTALLED_DLG, OnBkBtnViewInstalled)	
		//BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_SHOW_SUPERSEDED_DLG, OnBkBtnViewSupersede)
		//BK_NOTIFY_ID_COMMAND(IDC_LBL_VULFIX_SHOW_INVALID_DLG, OnBkBtnViewInvalid)
	BK_NOTIFY_MAP_END()
	
	BEGIN_MSG_MAP_EX(CBeikeVulfixHandler)
		MSG_BK_NOTIFY(IDC_RICHVIEW_WIN_VULFIX)
		
		MESSAGE_HANDLER(WMH_SCAN_START, OnScanStart)
		MESSAGE_HANDLER(WMH_SCAN_DONE, OnScanDone)
		MESSAGE_HANDLER(WMH_REPAIR_DONE, OnRepaireDone)	
		MESSAGE_HANDLER(WMH_SCAN_SOFT_DONE, OnScanDone)
		MESSAGE_RANGE_HANDLER(WMH_VULFIX_BASE, WMH_VULFIX_BASE+EVulfix_Task_Error, OnVulFixEventHandle)
		MESSAGE_HANDLER(WMH_LISTEX_LINK, OnListLinkClicked)

		NOTIFY_ID_HANDLER(IDC_LST_VULFIX_RESULT_LIST, OnListBoxVulFixNotify)
		NOTIFY_HANDLER(IDC_TXT_VULFIX_VUL_DESCRIPTION, EN_LINK, OnRichEditLink)
		COMMAND_HANDLER(1016, STN_CLICKED, OnStnClickedNavi)
		//MSG_WM_CHAR(OnChar)
	END_MSG_MAP()
};
至于里面是怎么操作的!本文就不讨论了!

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

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






  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值