工作七周年志(11) – 第一个任务
因为我已经有一定的编程功底,所以经过一周的时间熟悉产品之后,我就接到一个任务,基于公司的USB Token独立开发一款实用的小程序,用于加密保护用户的数据文件。
没有人告诉我从何入手,做成什么样子。接到这样的任务,首先第一点就是上网找资料。不过那时候Google还没有现在这么出名,找资料也没有现在这么方便。还好以前自己在研究系统的“回收站”的工作机理时,了解了一些系统Shell扩展方面的知识,觉得可以用这种方式来实现数据文件的加密保护。
基本的思想就是实现一个类似于“回收站”这样的东东,可以集成到资源管理器中,用户可以打开资源管理器来操作自己要加密保护的文件。我将其取名叫“我的保险箱”,文件被拖放到“我的保险箱”中,就会自动加密,要想使用被加密保护的文件,必须先将其从“我的保险箱”中拖放到一个普通的目录下,则会自动解密还原。当然,无论是加密还是解密,都需要事先认证用户的身份,也就是公司的硬件产品:USB Token。
这是我第一次接触到COM编程,很多东西都不懂,也没有什么现成的资料可以参阅,唯一的文档就是MSDN中对于Shell Extension的各个接口的说明,至于各个接口之间如何配合,就语焉不详了。我只能一边学习,一边写些代码来验证自己的想法。所用的开发工具当然是最熟悉的C++ Builder了。
等我把要用到的一些接口如IDragSource/IDropTarget/IStream等等了解得七七八八之后,已经过了两个多星期了。好在C++ Builder开发COM程序还是相当方便的,剩下要做的就是细致的活了,把各个接口都实现并配合好,做一个安装程序,就应该可以了,但是又开发了两个星期之后,遇到了一个大麻烦。
资源管理器老是会在某个时刻崩溃,其罪魁祸首自然就是我写的扩展了,但是跟踪来跟踪去,最后发生崩溃的都是在C++ Builder提供的库里面,是内存分配/释放的部分。经过几天的调试,我实在是没有招儿了,只好求助研发经理(嘿嘿,就是我的技术面试官)。他在我的电脑上调试了几个小时,最后跟踪到C++ Builder的库里面进行反汇编调试(没办法,我可不懂汇编,到现在都没有学会),得出的结论是:C++ Builder编译的二进制中内存管理部分存在问题,要么等C++ Builder升级看看能否解决,要么换用Visual C++。
我还从来没有用过VC。不过没有关系,语法都是一样的,工具嘛,多用一下就熟练了。而且其他同事基本上都是用VC开发,这样也更好交流不是么。于是从那时开始,我就基本上不再使用C++ Builder了,陪伴我至今的最主要的开发工具就是VC,从当时的Visual C++ 6.0一直到现在的Visual Studio 2008。
有了前期的铺垫工作,换用VC之后,经过几天的时间对VC IDE的熟悉后,开发工作又走向了正轨。不过系统外壳扩展这种程序调试起来还是比较的麻烦(当时不知道可以將资源管理器单独关闭来重新加载系统外壳扩展),稍不注意就把资源管理器搞死了,只能重新启动计算机。不过看着这个小程序一天天的完善,心中还是挺美的。
但是又一个意外发生了。大概在换用VC进行开发的两周之后,“我的保险箱”的开发已经接近特性冻结的时候,硬盘坏了--更糟糕的是,我发觉硬盘坏掉之后,就將硬盘低级格式化了,这样一来,虽然坏掉的磁道被低格程序标记成坏道从而不再使用,硬盘又可以使用了,但是我的源代码,全没了。
当时公司还很小,并没有上什么源代码控制之类的系统,每个开发人员就是各自为政,需要备份代码的时候就將整个代码目录复制一份,再加上一个日期作为目录名的后缀就算完事,同事之间需要共享代码也是直接將代码发到对方的共享目录中。而“我的保险箱”是纯粹的独立开发,所有的代码都在我一个人的硬盘上,而且因为开发比较顺利,也没有备份。现在硬盘坏了,近两个月的工作算是白费了,记得当时自己直接就傻眼了,恨不得以头抢地。想想都快到了交活的时候了,自己要是说“啊呀,我的硬盘坏掉了,现在交不了活了”这样的话,谁知道上头怎么想啊,谁知道你是不是完成不了任务,就找这样的借口呢。
怎么办?想起以前有搞过硬盘文件系统的分析,知道所谓的格式化什么的不一定会將所有数据抹去,那么有可能能够通过分析硬盘扇区的方式找到原来的分区表然后将数据恢复回来的。想到就做,于是用光盘启动到DOS,用Debug来调用INT 13中断直接读扇区,果然低格程序并没有將所有数据抹去。然后就是手工计算偏移,再读取另一块扇区的数据进行分析,就这样折腾了三天,我终于还是放弃了。我靠,这真不是人干的活儿啊,计算量太大,全部都是16进制的计算,还只能手写在纸上来算。我想,还不如重新来过,多熬几个夜,损失几天时间,应该不会太严重的,毕竟公司并没有强制我一定要在什么时候完成啊。而且要用到的技术都已经在心中,熟门熟路的,肯定很快。
于是乎我將硬盘重新分区,安装好操作系统。在等待操作系统安装过程的时候,我就在想:我现在是手工分析,是否会有人曾经遇到这种问题,并开发了自动分析的程序呢?抱着试一试的想法,系统安装完后,我又到网上去寻找,果然,让我找到一个数据恢复软件,名叫FinalData。现在也只有死马当作活马医了,装上FinalData,让其分析硬盘,经过一个多小时的等待,我终于找到了被删除的文件,记得当时激动不已啊,呵呵~~~最后的结果是,除了两三个文件无法完全恢复外,其他源代码都成功恢复了。嗯嗯,FinalData真的很强大啊,不过已经好几年没有用到这个软件了,不知道发展得怎么样了。
这件事给了我极其深刻的教训,这也是我后来在公司极力推广使用源代码控制系统的原因之一。后来我在公司专门搞了一台服务器做CVS服务,又过了两年切换到SVN。服务器使用SCSI硬盘做RAID 1,并且每周將源代码刻录光盘做定期备份。
目前有 3 个评论!
![Apex[有所思,有所志]](http://apex.ncksoft.com/wp-content/themes/deepwater/images/dw_site_logo.png)
人见人爱,花见花开 说:
佩服死了,我永远是你忠实的学生,希望自己将来也能像刘老师一样优秀!
牧狼羊 说:
呵呵,曾经我也幻想成为编程强人,现在只有敬仰的份了,嘿…
N668 说:
故地重游了