著名程序员刘涛涛WinMount程序BUG
/**************************************
/* 作者:半斤八兩
/* 博客:http://cnblogs.com/bjblcracked
/* 日期:2013-08-12 22:44
/**************************************
只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
听同事说win也有mount工具,好奇心驱使就搜了一下.
发现国内的著名程序员刘涛涛写了一款免费的win mount工具.
于是下载了一份就开始玩起来了.安装后发现winmount程序的界面非常漂亮友好,而且广告也很少.
甚是喜欢.图1
0x1 bug
只可惜我在使用的过程中,程序会占用100%CPU :(
0x2 BUG重现(如何产生).
首先弄个压缩软件,我当前用的是 7z 加密压缩任意一个文件.(不加密文件名).
然后用mount工具双击打开.这个时候就可以看到mount创建了一个新窗口.(输入密码框)
此时我无意中点到父窗口,发现程父窗口也是活动窗口. (原来是非模态窗口,有点意思)图2
知道是非模态窗口后,我就下意识的关闭了父窗口,有意思的事情发生了,CPU就跟打了鸡血一样,一个劲猛彪~图3
一开始我不相信自己的眼睛,我在心里想,肯定是系统或者其他什么软件出了问题了.
不可能是mount自身的问题.为了搞清楚到底是什么原因导致的CPU占用100,我决定分析它.
OD载入后,自己能想到的所有断点,都试了一遍,都没有断下来.
在一阵狂试都没有断下后,终于放弃下断点的方法了.
找了几首经典歌曲,边听边想思路.
mount占CPU的时候,操作系统虽然有点卡,但并没有卡死.
说明至少不是
for(true){;}
while(true){;}
这一类的死循环导致的卡死.
所有自己已知的如等待类函数也都下断点测试过了.
最后想就从线程下手吧.
打开线程窗口,可以看到有四个线程在拼命工作,(为了方便查看,我们可以点一下user time)图4
现在终于知道了,是这四个线程导致的,那么从entry处分析就行了.
最终分析得知导致卡死的是 kernel32.GetQueuedCompletionStatus 这个函数.
我们来看一下函数原型和介绍.
1 GetQueuedCompletionStatus 2 The GetQueuedCompletionStatus function attempts to dequeue an I/O completion packet from a specified I/O completion port. If there is no completion packet queued, the function waits for a pending I/O operation associated with the completion port to complete. 3 4 BOOL GetQueuedCompletionStatus( 5 HANDLE CompletionPort, // handle to completion port 6 LPDWORD lpNumberOfBytes, // bytes transferred 7 PULONG_PTR lpCompletionKey, // file completion key 8 LPOVERLAPPED *lpOverlapped, // buffer 9 DWORD dwMilliseconds // optional timeout value 10 );
1 6B1192E0 $ 55 push ebp 2 6B1192E1 . 8BEC mov ebp, esp 3 6B1192E3 . 83EC 0C sub esp, 0C 4 6B1192E6 . 56 push esi 5 6B1192E7 . 8B35 4870126B mov esi, dword ptr ds:[<&KERNEL32.GetQue>; kernel32.GetQueuedCompletionStatus 6 6B1192ED . 8D49 00 lea ecx, dword ptr ds:[ecx] 7 6B1192F0 > 6A FF push -1 8 6B1192F2 . 8D45 FC lea eax, dword ptr ss:[ebp-4] 9 6B1192F5 . 50 push eax 10 6B1192F6 . 8B47 08 mov eax, dword ptr ds:[edi+8] 11 6B1192F9 . 8D4D F4 lea ecx, dword ptr ss:[ebp-C] 12 6B1192FC . 51 push ecx 13 6B1192FD . 8D55 F8 lea edx, dword ptr ss:[ebp-8] 14 6B119300 . 52 push edx 15 6B119301 . 50 push eax 16 6B119302 . FFD6 call near esi 17 6B119304 . 8B45 FC mov eax, dword ptr ss:[ebp-4] 18 6B119307 . 85C0 test eax, eax 19 6B119309 .^ 74 E5 je short WMCore.6B1192F0 ; // 这里导致死循环了~ 20 6B11930B . 8B55 F8 mov edx, dword ptr ss:[ebp-8] 21 6B11930E . 8B40 14 mov eax, dword ptr ds:[eax+14] 22 6B119311 . E8 EAF7FFFF call WMCore.6B118B00 23 6B119316 .^ EB D8 jmp short WMCore.6B1192F0
通过帮助文档介绍我们知道 kernel32.GetQueuedCompletionStatus 这个函数
的意思是从指定的IOCP获取CP,当CP队列为空时.对此函数的调用将被阻塞.
阻塞?没错,阻塞就不会占用CPU100%,但是他的IO句柄是父窗口创建的 父窗口关闭了,也把句柄析构了.
他的逻辑写的是"死循环",所以句柄不存在了,就会不停的重复调用.也就会CPU占用100%了.
0x3 修复方案
1) 那个窗口改成模态窗口
2) 父窗口关闭时,应该先提前关闭非模态窗口.
这个应该也不能算是BUG吧,只能算是我误操作.
而且一般人应该也不会像我那样操作.直接关闭父窗口的
--==mount英文官方==--
--==mount中文官方==--
--==mount官方招聘==--
才发现,英文版的是PAGE是2011更新的.
中文版的PAGE是2010更新的
转载于:https://www.cnblogs.com/BjblCracked/p/3269132.html
著名程序员刘涛涛WinMount程序BUG相关推荐
- OSChina 周二乱弹 ——寡人不是程序员,不去写bug。
2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单(2017)请戳(这里) [今日歌曲] @焕焕 :一根冰棍分两半分享FLOW的单曲<Sign> &l ...
- 学习C语言的教材、如何成为一名优秀的C程序员、激发程序员创意的6本书、国外程序员推荐:每个程序员都应读的书
学习C语言的教材 我的C语言是自学的,这些年看过不少教材. 下面,我对其中一些教材做个点评. 1. How to Think Like a Computer Scientist: C version ...
- 国外程序员推荐:每个程序员都应读的书(作为一个码奴,这个也留着)(转)
国外程序员推荐:每个程序员都应读的书(作为一个码奴,这个也留着)(转)来源: 方健的日志 国外程序员推荐:每个程序员都应读的书 来自:http://www.williamlong.info/archi ...
- python程序员搞笑段子_程序员才能看得懂的段子,内含表情包,吃饭的时候别点!...
原标题:程序员才能看得懂的段子,内含表情包,吃饭的时候别点! 很多网友都认为程序员必定是非常古板,整天只会敲键盘的码农.其实这种看法是非常片面的.真正优秀的程序员,不仅精通程序的编写,还是某些领域的专 ...
- 新手程序员如何让他快速成长?一名老程序员,谈谈对程序员的培养
我很自豪我就是一名程序员,也希望给程序员或者前程序员们带来一点启发.纯粹个人一些想法,也许你认可我的言辞,也许你不屑我的观点,无论如何,欢迎谈谈你的看法. 让程序员做更多种类的事 为什么有人说小公司锻 ...
- 优秀的程序员VS糟糕的程序员
优秀的程序员和一般的程序员差别在哪里?怎么才能成为优秀的程序员?我们选择了这个职业就要把他做好! 优秀的程序员: 1.逻辑能力很强,这也是解决问题的关键. 2.分析能力.可以很好的解决复杂问题. 3. ...
- python程序员幽默段子_程序员的十个段子,能看懂的都是深有同感!
作为程序员那么久,总结了如下10个段子,能看懂的,背后应该都有着不为人知的故事~~~~ 一:程序员最痛苦的莫过于两件事,第一件就是要给别人写文档......第二件就是别人遗留的产品为什么没有文档~!! ...
- Java程序员情人节_关于程序员:一封来自Java程序员的情书
简介: 面向对象编程. 始终以来程序员都给大家以高智商低情商,不懂得浪漫不会哄女生开心的形象.然而,我感觉程序员都是浪漫的.对于这种错误观念,只能用一首歌来表白宽广程序员的心声:程序员的好,只有他身边 ...
- 程序员开发什么小程序挣钱_作为程序员赚钱的5种独特方式
程序员开发什么小程序挣钱 1.赚钱报告错误 (1. Make money reporting bugs) You can earn money by helping other companies f ...
最新文章
- java sqlite使用小记
- 你训练的神经网络不对头的37个原因
- 深入理解JVM之JIT编译器(二)
- 程序员应该了解的几个接单平台,私活,码农!
- ${oid?c}的使用
- struts2 poi excel 导出
- MYSQL 源代码编绎脚本
- OceanBase 十年:一群追梦人的成长史
- 单片机c语言中void key(void),单片机C语言编程
- 前端json编辑器和富文本编辑器的使用
- pdf文件过大如何缩小?
- 【华为编程大赛】投票问题
- Java 后端不懂 GC 调优很丢脸吗?
- 光流传感器 定位精度_光流传感器其它方面的应用
- c语言阿拉伯数字转大写,c++阿拉伯数字转化为中文大写
- CPU内部结构及工作原理
- 基本风速或者震级选取—重现期与超越概率
- 《微波原理与技术》学习笔记1绪论-微波的概念
- 打胜仗:常胜团队的成功密码
- 专业分析远离社死!如何看待QQ出现大面积盗号?