金山卫士开源软件之旅(一) VS 2005环境下编译
参考文档:http://bbs.code.ijinshan.com/viewthread.php?tid=1543
http://bbs.code.ijinshan.com/viewthread.php?tid=929&extra=&page=2
1、下载代码与lib
http://code.ijinshan.com/
得到LIB4pcmanager.tbz tip.tar.bz2
2、解压文件.得到oss 与LIB4pcmanager
3、阅读\oss\Readme.txt
+-- pcmamager 110317 release:开源卫士整体 可编译学习版本!
110311 release:开源卫士整体
+-- kclear 110113 release:卫士垃圾清理
+-- ksm 101226 release:卫士主界面
+-- karpfw 101218 release:卫士ARP防火墙
+-- sysopt 101209 release:系统优化 之 开机加速器
+-- bksafevul 101201 release:漏洞扫描器
+-- ppro 101201 release:隐私保护器
阅读\oss\pcmanager\Readme.txt
外部库包:
http://code.ijinshan.com/download/LIB4pcmanager.tbz
下载后,将其中子目录覆盖pcmanager 目录;
即:LIB4pcmanager
├──lib
└──src
将lib 和src 目录,覆盖pcmanager 目录中的对应同名目录
编译
-------------------------------------------------------------------------------
按Readme.txt做吧,因为在打开\oss\pcmanager\sln\avcenter.sln后的工程avproductmgr,
从工程属性可以看到“附加库目录”为..\..\..\lib\win32d
4、
编译ksafe.sln解决方案.
对于beikesafe工程,把C++的包含文件的E:\winsdk\v6.0\Include 改为C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include
Lib的包含路径改为C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib
当然可以直接在工具->选项->VC++里去包含文件
编译后提示"提示找不到BeikeUtils.lib"
这是因为还没编译commonlib.sln,找到后改include 与lib包含路径,OK,编译通过了.
这里再编译beikesafe工程,报错:
<span style="color:#ff0000;">1>正在链接...
1>scanlib.lib(klogic.obj) : 找到MSIL .netmodule 或使用/GL 编译的模块;正在使用/LTCG 重新启动链接;将/LTCG 添加到链接命令行以改进链接器性能
1>LINK : warning LNK4075: 忽略“/INCREMENTAL”(由于“/LTCG”规范)
1>atlsd.lib(atlfuncs.obj) : error LNK2005: "void __stdcall ATL::AtlWinModuleAddCreateWndData(struct ATL::_ATL_WIN_MODULE70 *,struct ATL::_AtlCreateWndData *,void *)" (?AtlWinModuleAddCreateWndData@ATL@@YGXPAU_ATL_WIN_MODULE70@1@PAU_AtlCreateWndData@1@PAX@Z) 已经在kwslib.lib(setting_hlp.obj) 中定义
1>atlsd.lib(atlfuncs.obj) : error LNK2005: "void * __stdcall ATL::AtlWinModuleExtractCreateWndData(struct ATL::_ATL_WIN_MODULE70 *)" (?AtlWinModuleExtractCreateWndData@ATL@@YGPAXPAU_ATL_WIN_MODULE70@1@@Z) 已经在kwslib.lib(setting_hlp.obj) 中定义
1>atlsd.lib(atltime.obj) : error LNK2005: "public: static class ATL::CTime __stdcall ATL::CTime::GetTickCount(void)" (?GetTickCount@CTime@ATL@@SG?AV12@XZ) 已经在kwslib.lib(KwsSetting.obj) 中定义
1>atlsd.lib(atltime.obj) : error LNK2005: "public: __thiscall ATL::CTime::CTime(__int64)" (??0CTime@ATL@@QAE@_J@Z) 已经在kwslib.lib(KwsSetting.obj) 中定义
1>atlsd.lib(atltime.obj) : error LNK2005: "public: __int64 __thiscall ATL::CTime::GetTime(void)const " (?GetTime@CTime@ATL@@QBE_JXZ) 已经在kwslib.lib(KwsSetting.obj) 中定义
1>LINK : fatal error LNK1104: 无法打开文件“lib_jsonMT.lib”</span>
-----
我们得把commonlib.sln编译成release的。我选择的是Release ModUrl
报错:
1>d:\自己的经验总结\自己的经验总结\金山开源\oss\pcmanager\src\publish\common/registrywow.h(18) : error C2146: 语法错误: 缺少“;”(在标识符“OpenKeyEx”的前面)
1>d:\自己的经验总结\自己的经验总结\金山开源\oss\pcmanager\src\publish\common/registrywow.h(18) : error C4430: 缺少类型说明符- 假定为int。注意: C++ 不支持默认int
1>d:\自己的经验总结\自己的经验总结\金山开源\oss\pcmanager\src\publish\common/registrywow.h(19) : error C4430: 缺少类型说明符- 假定为int。注意: C++ 不支持默认int
1>d:\自己的经验总结\自己的经验总结\金山开源\oss\pcmanager\src\publish\common/registrywow.h(19) : warning C4183: “OpenKeyEx”: 缺少返回类型;假定为返回“int”的成员函数
1>d:\自己的经验总结\自己的经验总结\金山开源\oss\pcmanager\src\publish\common/registrywow.h(39) : error C2146: 语法错误: 缺少“;”(在标识符“OpenKeyEx”的前面)
1>d:\自己的经验总结\自己的经验总结\金山开源\oss\pcmanager\src\publish\common/registrywow.h(39) : error C4430: 缺少类型说明符- 假定为int。注意: C++ 不支持默认int
1>d:\自己的经验总结\自己的经验总结\金山开源\oss\pcmanager\src\publish\common/registrywow.h(40) : error C4430: 缺少类型说明符- 假定为int。注意: C++ 不支持默认int
找到出错的文件(双击就可以定位到这个文件了)
添加如下代码:
// Support Windows SDK v5.0
#ifndef LSTATUS
typedef __success(return==ERROR_SUCCESS) LONG LSTATUS;
#endif
编译commonlib.sln 提示Wow64FsEnableRedirection 好多 未知标识符?
找到出错的文件(双击就可以定位到这个文件了)和上一个的在同一个文件
添加如下代码:
WINBASEAPI
BOOLEAN
WINAPI
Wow64EnableWow64FsRedirection (
__in BOOLEAN Wow64FsEnableRedirection
);
WINBASEAPI
BOOL
WINAPI
Wow64DisableWow64FsRedirection (
__out PVOID *OldValue
);
WINBASEAPI
BOOL
WINAPI
Wow64RevertWow64FsRedirection (
__in PVOID OlValue
);
提示SHCreateDirectory 不知道是啥?
在所提示的位置上#include <shlobj.h> 把这个声明给他加进来就可以了。
5、编译主界面.
\oss\ksm\sln\KSafeMain.sln 没有出现错误.
补充:综合编程 , 安全编程 ,