« 字体勾边渲染的简单方法 | 返回首页 | skynet 的启动流程中的异步 IO 问题 »

BT 下载器下载的安装文件被杀毒软件卡住的问题

我们代理的游戏狂刃 客户端用 NSIS 制作成一个 exe 安装包,有 1G 左右。一开始,我们是购买又拍和七牛这种的云服务分发客户端。从用户的下载速度来看可以满意,但费用有点高。所以我们打算另外开发一个采用 BT 协议的下载器,这也是 MMO 客户端分发给客户的标配了。

rainfiel 同学在一个多月前主动领了这个任务,对 BT 的开源库考察一番后使用 libtorrent 开发这个下载器。

最近在测试的时候发现了一个问题,成功下载完安装包后,如果系统安装有 卡巴斯基 或 360 等杀毒软件,就会在调用 ShellExecute 第一次运行安装包时被卡住很久(长达几分钟)。用进程管理器查看,发现是杀毒软件一直在扫描刚下载的 exe 文件。

一开始怀疑是由于某些 bug 导致文件被锁死了。然后试图退出下载程序,重新启动新进程去打开安装包,这样不解决问题。但是,如果把下载文件用程序复制一遍再运行文件的拷贝却不会被卡住。

有网友说可能是 Windows 的 Alternative Data Streams 引起的。我们 google 了一下,找到了这样一篇文章 。文中提到去掉 ADS 的方法也是复制一遍文件,但是通过工具检测却没有发现 ADS 的痕迹。

最后检查 libtorrent 的配置参数才发现,原来是因为它默认把下载文件创建成了 Sparse file 。根据 wikipedia 的说法,Loading executables on Windows (exe or dll) which are sparse takes a much longer time, since the file cannot be memory mapped and not cached. 。这应该是根本原因了。

只是几分钟的扫描时间也过长了点,为什么杀毒软件需要几分钟时间才能加载分析完一个 1G 左右的 exe (远超过复制一遍文件的时间),我猜测是因为 NSIS 其实只是把一组文件打了个包,而杀毒软件期望解包分析包内的文件导致的。杀毒软件若实现的不恰当,解包过程针对 sparse file 随机读性能很低,导致了扫描时间远大于复制一遍文件再扫描的时间。

Comments

PC下的游戏可以考虑直接使用点量BT,商业级的p2p内核,目前也有android、ios等版本,征途、搜狐畅游等在使用,省心易用
我一般都不喜欢利用下载器下载,慢,并且不好,很垃圾的。
我的杀毒软也是经常卡死我表示很郁闷啊 www.haobitou.com#03
为什么用android系统的feedR订阅本站rss会出现乱码,博主能不能给处理一下
windows下就是各种深坑啊。
我是打酱油来的,问下云风好像很久没有更新东西游了。介绍下最近从事什么娱乐活动吧。
360的下载防火墙确实有这种无脑行为,以前下载过eclipse压缩包就见识过,把里面几百个jar文件都二次解压查一遍,真是让人无语. 所以还是自定义一种安装包格式吧, 这样杀软就不会解包查杀了.
那这是os的原因了?还是说打包的原因?请问你是怎么解决的呢?

Post a comment

非这个主题相关的留言请到:留言本