金山卫士开源(开源项目之金山卫士)

发布时间:2025-12-10 19:32:33 浏览次数:8

开源项目之金山卫士-金山卫士 开源

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

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

intWINAPI_tWinMain(HINSTANCEhInstance,HINSTANCE/*hPrevInstance*/,LPTSTRlpstrCmdLine,int/*nCmdShow*/) { #ifdef_DEBUG //bkconsoletheConsole; #endif HRESULThRet=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(); return0; }

[cpp]
view plain
copy

//加载UI voidCBKSafeVulModule::_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); }


[cpp]
view plain
copy

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


[cpp]
view plain
copy

//初始化扫描引擎 voidCBeikeVulfixHandler::InitEnv() { if(!theEngine) { theEngine=newCVulEngine; theEngine->_InitFunctions(); m_WinInfo.Init(); //m_WinInfo64=IsWin64(); } //开始扫描 PostMessage(WMH_SCAN_START,0,0); }[cpp]
view plain
copy

//对应的功能函数声明 LRESULTOnScanStart(UINTuMsg,WPARAMwParam,LPARAMlParam,BOOL&bHandled); LRESULTOnScanDone(UINTuMsg,WPARAMwParam,LPARAMlParam,BOOL&bHandled); bool_RepairSingle(intarrVulIds,T_VulListItemData*pItemData);

[cpp]
view plain
copy

//开始扫描 LRESULTCBeikeVulfixHandler::OnScanStart(UINTuMsg,WPARAMwParam,LPARAMlParam,BOOL&bHandled) { OnBkBtnScan(); return0; }[cpp]
view plain
copy

voidCBeikeVulfixHandler::OnBkBtnScan() { if(m_firstInited) { //Cleandownloadedfiles BOOLbSave=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); } }[cpp]
view plain
copy

//修复 boolCBeikeVulfixHandler::_RepairSingle(intarrVulIds,T_VulListItemData*pItemData) { if(!theEngine->CheckRepairPrequisite(pItemData->nType==VTYPE_OFFICE)) returnFALSE; 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(); //Fillthelistctrl ResetListCtrl(m_wndListCtrlVulFixing); AppendItem2RepairList(m_wndListCtrlVulFixing,newT_VulListItemData(*pItemData)); //Fix returntheEngine->RepairAll(m_RefWin.m_hWnd,vulId,softId); }

测试漏洞代码:

[cpp]
view plain
copy

int_tmain(intargc,_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”)); return0; } if(0==_tcsicmp(argv[1],_T(“1”))) { _tprintf(_T(“测试快速扫描\n”)); PressAnyKeyToContinue(); TestQuickScan(); gotoExit0; } if(0==_tcsicmp(argv[1],_T(“2”))) { _tprintf(_T(“测试全面扫描\n”)); PressAnyKeyToContinue(); TestFullScan(); gotoExit0; } if(0==_tcsicmp(argv[1],_T(“3”))) { _tprintf(_T(“测试修复功能,为避免风险,可选和软件漏洞不做修复\n”)); PressAnyKeyToContinue(); TestRepair(); } Exit0: PressAnyKeyToContinue(); return0; }[cpp]
view plain
copy

TestQuickScan() HRESULTWINAPIExpressScanLeak(IVulCollection**pVulCollection,DWORDdwFlags,BOOLbQuickScan); 如果成功,先调用IVulCollection::get_Status 如果S_OK,则根据status来判断是否有漏洞风险,-1,0表示可能无风险,1表示可能有风险 否则,根据IVulCollection::get_VulCount和IVulCollection::get_Item来判断是否有漏洞存在,具体看例子中函数DumpIVulCollection


[cpp]
view plain
copy

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

漏洞修复测试代码结束!

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

程序效果如图:

代码分析:

[cpp]
view plain
copy

//程序的初始化 LRESULTCMainDlg::OnInitDialog(UINT/*uMsg*/,WPARAM/*wParam*/,LPARAM/*lParam*/,BOOL&/*bHandled*/) { HICONhIcon=(HICON)::LoadImage(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON,::GetSystemMetrics(SM_CXICON),::GetSystemMetrics(SM_CYICON),LR_DEFAULTCOLOR); SetIcon(hIcon,TRUE); HICONhIconSmall=(HICON)::LoadImage(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON,::GetSystemMetrics(SM_CXSMICON),::GetSystemMetrics(SM_CYSMICON),LR_DEFAULTCOLOR); SetIcon(hIconSmall,FALSE); //创建大字体 CFontHandlehFont=GetFont(); LOGFONTlogFont={0}; hFont.GetLogFont(&logFont); logFont.lfHeight=-14; logFont.lfWeight=FW_BOLD; m_fontBig.CreateFontIndirect(&logFont); DoDataExchange(); CStringstrTitle=_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); CStringstrVersion=_T(“版本:”); strVersion+=_Module.GetProductVersion(); m_lnkVersion.SetWindowText(strVersion); if(m_piArpSetting) { m_piArpSetting->IsArpFwEnable(&m_bFwEnable); } //更新UI UpdateUI(); //创建线程开始工作 StartWork(); returnTRUE; }


[cpp]
view plain
copy

//工作线程 UINTCMainDlg::WorkThreadProc(LPVOIDpSetting) { CMainDlg*pThis=(CMainDlg*)pSetting; IArpFwSetting*piArpSetting=NULL; HANDLEhExitSignal=NULL; HRESULThRetCode; wchar_tszLastLog[512]={0}; KAV_PROCESS_ERROR(pThis); piArpSetting=pThis->m_piArpSetting; KAV_PROCESS_ERROR(piArpSetting); hExitSignal=pThis->m_hExitSignal; KAV_PROCESS_ERROR(hExitSignal); for(;;) { BOOLbEnable=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); return0; }


[cpp]
view plain
copy

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


[cpp]
view plain
copy

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


[cpp]
view plain
copy

//加载 BOOLCArpSetting::Install() { BOOLretval=FALSE; BOOLbRetCode; KAV_PROCESS_ERROR(m_spIArpFwSetting); bRetCode=m_spIArpFwSetting->InstallArpFw(); KAV_PROCESS_ERROR(bRetCode); retval=TRUE; Exit0: returnretval; } //卸载 BOOLCArpSetting::UnInstall() { BOOLretval=FALSE; BOOLbRetCode; KAV_PROCESS_ERROR(m_spIArpFwSetting); bRetCode=m_spIArpFwSetting->UnInstallArpFw(); KAV_PROCESS_ERROR(bRetCode); retval=TRUE; Exit0: returnretval; } //开启 BOOLCArpSetting::StartSP() { BOOLretval=FALSE; BOOLbRetCode; KAV_PROCESS_ERROR(m_spIArpFwSp); KxeBaseInit(); bRetCode=m_spIArpFwSp->Start(); KAV_PROCESS_ERROR(bRetCode); retval=TRUE; Exit0: returnretval; } //停止 BOOLCArpSetting::StopSP() { BOOLretval=FALSE; BOOLbRetCode; KAV_PROCESS_ERROR(m_spIArpFwSp); bRetCode=m_spIArpFwSp->Stop(); KAV_PROCESS_ERROR(bRetCode); KxeBaseUnInit(); retval=TRUE; Exit0: returnretval; }



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

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

项目如图:

效果如图:

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

关键代码:

[cpp]
view plain
copy

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

[cpp]
view plain
copy

//初始化清除实例对象 BOOLMainWnd::InitKClear() { BOOLretval=FALSE; CreateKClearObject_tCreateKClearObject=NULL; TCHARszKClearPath[MAX_PATH]={0}; HRESULThr; HMODULEhKClear=NULL; IKClear*piKClear=NULL; HWNDhWnd=NULL; if(!m_hKClear) { ::GetModuleFileName(NULL,szKClearPath,MAX_PATH); PathRemoveFileSpec(szKClearPath); PathAppend(szKClearPath,_T(“kclear.dll”)); hKClear=LoadLibrary(szKClearPath); if(!hKClear) gotoclean0; m_hKClear=hKClear; } if(!m_piKClear) { CreateKClearObject=(CreateKClearObject_t)GetProcAddress(m_hKClear,“CreateKClearObject”); if(!CreateKClearObject) gotoclean0; hr=CreateKClearObject(__uuidof(IKClear),(void**)&piKClear); if(FAILED(hr)) gotoclean0; 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(); } returnretval; } //释放清除对象资源 voidMainWnd::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; //} }



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

[cpp]
view plain
copy

intMainWnd::OnCreate(LPCREATESTRUCTlpCreateStruct) { SetWindowPos(NULL,0,0,800,570,SWP_NOREPOSITION); CenterWindow(); InitKClear(); return0; }

清除操作完毕!~~

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

项目如图:

效果如图:

//关键对象

[cpp]
view plain
copy

CBeikeSafeSysOptUIHandler*m_sysoptHandler;[cpp]
view plain
copy

//构造 m_sysoptHandler=newCBeikeSafeSysOptUIHandler(this);


[cpp]
view plain
copy

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


[cpp]
view plain
copy

//操作关键类 classCBeikeSafeSysOptUIHandler: publicIEnumRunCallBackNull, publicIAutoOptLstCBack, publicIListOpCallback { 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: BOOLIsOpPermit() { return(m_nState==STATE_RUNOPT_NULL); } voidInit(); voidFirstShow(); voidSecondShow(); BOOLOnBkRunTypeSelChange(intnTabItemIDOld,intnTabItemIDNew); BOOLOnBkSysOptSelChange(intnTabItemIDOld,intnTabItemIDNew); voidInitEng() { if(m_pRunOptEng==NULL) m_pRunOptEng=CRunOptLoader::GetGlobalPtr()->GetOptEng(); } BOOLFindRunItem(CKsafeRunInfo*pInfo); BOOL_FindRunItem(CKsafeRunInfo*pInfo); voidEndScan(); voidRestoreEnd(); voidPostRestoreRunItem(DWORDnType,BOOLbEnable,LPCTSTRlpName); LRESULTOnWmScanEnd(UINTuMsg,WPARAMwParam,LPARAMlParam); LRESULTOnWmRestoreEnd(UINTuMsg,WPARAMwParam,LPARAMlParam); LRESULTOnWmFindItem(UINTuMsg,WPARAMwParam,LPARAMlParam); LRESULTOnWmFirstIn(UINTuMsg,WPARAMwParam,LPARAMlParam); LRESULTOnOnekeyOptEnd(UINTuMsg,WPARAMwParam,LPARAMlParam); LRESULTOnRefreshOnekeyOpt(UINTuMsg,WPARAMwParam,LPARAMlParam); BOOLOnClickButton(CKsafeRunInfo*pInfo); BOOLOnDeleteItem(CKsafeRunInfo*pInfo); BOOLOnClickLabel(DWORDnIndex,CKsafeRunInfo*pInfo); voidClickCheck(); voidUpdateClearInterface(intnSel); public: voidOnBkShowDisableItem(); voidOnListReSize(CRectrcWnd); voidRefreshItemList(); voidOnBkCancelAll(); voidOnBkCancelAll2(); voidOnBkBtnWaitMore(); voidOnBkRunOptTopMore(); voidRefreshCLRState(intnSel=-1,BOOLbDowning=FALSE); voidRefreshUpdateState(intnSel=-1,BOOLbDowning=FALSE); voidRefreshTabNumber(DWORDnNewTab=-1); voidSetTopRunDiv(DWORDnType); voidGetRunListByCheckState(); voidInitAutoOptList(); voidOnBkBtnDoOpt(); voidOnAutoOptCheckAll(); voidOnAutoOptCheckAll2(); voidOnBkBtnRefresh(); voidOnBkBtnContinueOpt(); voidOnBkLnkViewRun(); voidOnBkLnkViewServ(); voidOnBkLnkViewTask(); voidOnTimer(UINT_PTRnIDEvent);//优化时定时器刷新显示loading动画 voidShowOptDetail(); voidOnBkLnkCleanTrash(); voidOnBkLnkSoftMgr_ZJBJ(); voidOnBkCheckHideSystem(); voidShowNoTaskInfo(); staticDWORDWINAPIOneKeyOptProc(LPVOIDlpParam); BOOLIs3XXInstalled(); voidOnBkLnkShowIgnored(); voidOnBkLnkAddToIgnored(); voidSaveIgnoreID(); voidLoadIgnoredID(); voidGetIgnoredItem(); voidOnBkLnkRefreshList(); protected: CBeikeSafeMainDlg*m_dlg; CRunOptListViewm_runList; IRunOptimizeEng*m_pRunOptEng; DWORDm_nState; BOOLm_bFirstShowed; BOOLm_bFirstScanRunEnd; BOOLm_bOpting; BOOLm_bSkipToOnekeyOpt; BOOLm_bRefreshList;//runlist刷新后置为TRUE,为TRUE则InitAutoOptList,再置为FALSE BOOLm_bReportOnekeyOpt;//进入一键优化tab,是否要上报 CAutoRunOptListm_list; HANDLEm_hOptimizeThread; CStringm_strIniFilePath; CStringm_strIgnoredIniPath; intm_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(金山卫士主界面)了!

效果如图:

[cpp]
view plain
copy

//显示视图 CEmbeddedViewm_viewVulfix;


[cpp]
view plain
copy

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);[cpp]
view plain
copy

//操作关键类 classCBeikeVulfixHandler :publicCBaseViewHandler<CEmbeddedView> ,publicCBkSafeUIHandlerBase { public: CBeikeVulfixHandler(CEmbeddedView&mainDlg); ~CBeikeVulfixHandler(void); public: BOOLInit(HWNDhMainWnd,HWNDhWndParent); voidInitEnv(); voidSetMainDlg(CBeikeSafeMainDlg*pMainDlg); STATE_CLOSE_CHECKCloseCheck(); void_SetDisplayState(TScanSoftStatest,TRepairSubStatesubst=REPAIRSTATE_ING,LPCTSTRszMsg=NULL); protected: CBeikeSafeMainDlg*m_MainDlg; HWNDm_hMainWnd; BOOLm_firstInited; DWORDm_dwPos; CListViewCtrlExm_wndListCtrlVul,m_wndListCtrlVulFixing; BOOLm_bRelateInfoShowing; CRichEditCtrlExm_ctlRichEdit; intm_nCurrentRelateInfoItem; CHyperTextCtrlm_ctlNaviLink; boolm_bScanStarted;//看是否正在扫描xml,还是还在等待信息(Win7&Vista) //scan intm_nScanState,m_nTotalItem,m_nCurrentItem; DWORDm_dwScanBeginTime; //Repair intm_nRepairTotal,m_nRepairInstalled,m_nRepairDownloaded,m_nRepairProcessed; intm_nRepairCurrentRate; CStringm_strLastScanTime; T_WindowsInfom_WinInfo; BOOLm_WinInfo64; // INTm_nNumMust,m_nNumOption,m_nNumSP; //BKHANDLER voidOnBkBtnSwitchRelateInfo(); voidOnBkBtnSelectAll(); voidOnBkBtnSelectNone(); voidOnBkBtnSelectAllSuggested(); voidOnBkBtnSelectAllOptional(); voidOnBkBtnIgnore();//忽略 voidOnBkBtnScan(); voidOnBkBtnCancelScan(); voidOnBkBtnBeginRepair(); voidOnBkBtnCancelRepair(); voidOnBkBtnRunBackground(); voidOnBkBtnReboot(); voidOnBkBtnEnableRelateCOM(); voidOnBkBtnDisableRelateCOM(); voidOnBkBtnViewInstalled(); voidOnBkBtnViewIgnored(); voidOnBkBtnViewSupersede(); voidOnBkBtnViewInvalid(); voidOnBkBtnErrorRepair(); voidOnBkBtnVisitVulPurposePage(); voidOnBkBtnExport(); voidOnListReSize(CRectrcWnd); voidOnDownListReSize(CRectrcWnd); public: //WMHANDLER LRESULTOnListBoxVulFixNotify(intidCtrl,LPNMHDRpnmh,BOOL&bHandled); LRESULTOnVulFixEventHandle(UINTuMsg,WPARAMwParam,LPARAMlParam,BOOL&bHandled); LRESULTOnListLinkClicked(UINTuMsg,WPARAMwParam,LPARAMlParam,BOOL&bHandled); LRESULTOnScanStart(UINTuMsg,WPARAMwParam,LPARAMlParam,BOOL&bHandled); LRESULTOnScanDone(UINTuMsg,WPARAMwParam,LPARAMlParam,BOOL&bHandled); LRESULTOnRepaireDone(UINTuMsg,WPARAMwParam,LPARAMlParam,BOOL&bHandled); LRESULTOnRichEditLink(intidCtrl,LPNMHDRpnmh,BOOL&bHandled); LRESULTOnStnClickedNavi(WORD/*wNotifyCode*/,WORD/*wID*/,HWND/*hWndCtl*/,BOOL&/*bHandled*/); voidOnChar(UINTnChar,UINTnRepCnt,UINTnFlags); protected: intFindListItem(intnID); void_ShutdownComputer(BOOLbReboot); void_DisplayRelateVulFixInfo(intnItem); void_SetScanProgress(intnPos); void_SetRepairProgress(intnPos); void_UpdateRepairTitle(); void_EnableRelateCOM(BOOLbEnable); void_FillScanResult(); bool_RepairSingle(intarrVulIds,T_VulListItemData*pItemData); void_EnableSelectedOpBtn(INTnMust,INTnSP,INTnOption); void_NotifyTrayIcon(LPCTSTRszText,INTnTimeOut,BOOLbDelayShow=TRUE); void_ViewDetail(INTnSelTab); void_UpdateViewDetailBtnsNumber(INTnFixed,INTnIgnored,INTnReplaced,INTnInvalid); void_PromptAutoShutdown(); void_UpdateScanResultTitle(INTnTipIcon,LPCTSTRszTips); BOOL_ExportResult(LPCTSTRszFileName,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了,它是开源卫士完整版,也就是前面的集合了!~

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

需要做网站?需要网络推广?欢迎咨询客户经理 13272073477