/**************************************
/* 作者:半斤八兩
/* 博客: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相关推荐

  1. OSChina 周二乱弹 ——寡人不是程序员,不去写bug。

    2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单(2017)请戳(这里) [今日歌曲] @焕焕 :一根冰棍分两半分享FLOW的单曲<Sign> &l ...

  2. 学习C语言的教材、如何成为一名优秀的C程序员、激发程序员创意的6本书、国外程序员推荐:每个程序员都应读的书

    学习C语言的教材 我的C语言是自学的,这些年看过不少教材. 下面,我对其中一些教材做个点评. 1. How to Think Like a Computer Scientist: C version ...

  3. 国外程序员推荐:每个程序员都应读的书(作为一个码奴,这个也留着)(转)

    国外程序员推荐:每个程序员都应读的书(作为一个码奴,这个也留着)(转)来源: 方健的日志 国外程序员推荐:每个程序员都应读的书 来自:http://www.williamlong.info/archi ...

  4. python程序员搞笑段子_程序员才能看得懂的段子,内含表情包,吃饭的时候别点!...

    原标题:程序员才能看得懂的段子,内含表情包,吃饭的时候别点! 很多网友都认为程序员必定是非常古板,整天只会敲键盘的码农.其实这种看法是非常片面的.真正优秀的程序员,不仅精通程序的编写,还是某些领域的专 ...

  5. 新手程序员如何让他快速成长?一名老程序员,谈谈对程序员的培养

    我很自豪我就是一名程序员,也希望给程序员或者前程序员们带来一点启发.纯粹个人一些想法,也许你认可我的言辞,也许你不屑我的观点,无论如何,欢迎谈谈你的看法. 让程序员做更多种类的事 为什么有人说小公司锻 ...

  6. 优秀的程序员VS糟糕的程序员

    优秀的程序员和一般的程序员差别在哪里?怎么才能成为优秀的程序员?我们选择了这个职业就要把他做好! 优秀的程序员: 1.逻辑能力很强,这也是解决问题的关键. 2.分析能力.可以很好的解决复杂问题. 3. ...

  7. python程序员幽默段子_程序员的十个段子,能看懂的都是深有同感!

    作为程序员那么久,总结了如下10个段子,能看懂的,背后应该都有着不为人知的故事~~~~ 一:程序员最痛苦的莫过于两件事,第一件就是要给别人写文档......第二件就是别人遗留的产品为什么没有文档~!! ...

  8. Java程序员情人节_关于程序员:一封来自Java程序员的情书

    简介: 面向对象编程. 始终以来程序员都给大家以高智商低情商,不懂得浪漫不会哄女生开心的形象.然而,我感觉程序员都是浪漫的.对于这种错误观念,只能用一首歌来表白宽广程序员的心声:程序员的好,只有他身边 ...

  9. 程序员开发什么小程序挣钱_作为程序员赚钱的5种独特方式

    程序员开发什么小程序挣钱 1.赚钱报告错误 (1. Make money reporting bugs) You can earn money by helping other companies f ...

最新文章

  1. java sqlite使用小记
  2. 你训练的神经网络不对头的37个原因
  3. 深入理解JVM之JIT编译器(二)
  4. 程序员应该了解的几个接单平台,私活,码农!
  5. ${oid?c}的使用
  6. struts2 poi excel 导出
  7. MYSQL 源代码编绎脚本
  8. OceanBase 十年:一群追梦人的成长史
  9. 单片机c语言中void key(void),单片机C语言编程
  10. 前端json编辑器和富文本编辑器的使用
  11. pdf文件过大如何缩小?
  12. 【华为编程大赛】投票问题
  13. Java 后端不懂 GC 调优很丢脸吗?
  14. 光流传感器 定位精度_光流传感器其它方面的应用
  15. c语言阿拉伯数字转大写,c++阿拉伯数字转化为中文大写
  16. CPU内部结构及工作原理
  17. 基本风速或者震级选取—重现期与超越概率
  18. 《微波原理与技术》学习笔记1绪论-微波的概念
  19. 打胜仗:常胜团队的成功密码
  20. 专业分析远离社死!如何看待QQ出现大面积盗号?

热门文章

  1. Android基础常用日期操作工具类
  2. 一篇文章让你理解面试难点:执行上下文(干货满满(附面试题))
  3. EL表达式(web作业)
  4. redis在php中的应用(string篇)
  5. Linux——通配符
  6. SQLServer 行转列,统计,二次分组
  7. 数据库管家----ADODB类库.
  8. 《又见一帘幽梦》高清视频
  9. 图片保存到数据库以及从数据库中Load图片
  10. 带你学习ES5中新增的方法