source insight分析WRK源码

来源:互联网 发布:香水时代淘宝店 编辑:程序博客网 时间:2024/05/16 03:25

 source insight是一个出色的程序编辑器和代码浏览器,利用好它会给编写和阅读源代码带来极大的方便。想要配置好source insight可不是一件轻松的事,我比较喜欢深色背景有利于保护眼睛,但同时也必须更改代码颜色来匹配背景色,source insight的很多窗口、选项都可以指定字体、颜色,实在让人犯晕!最麻烦的是源码窗口的配置了,这里简单提一下,source insight的最终配色是由Style Properties决定的(右键菜单-->Style Properties)

左边一栏是风格名,选中的是当前光标下的风格名,这些风格之间是有继承关系的,可以看到有很多=号,这代表继承了父风格(Parent Style),pick则是让你单独设置,最右边还可以导入、导出、添加风格等。所有风格最终由Default Text继承而来的,Font Name是灰的,它由Document Options(Alt+T)中的当前文档类型 Screen Fonts决定的(所以不同的文件类型,如C,Python,Java它们的字体可以不同的)。Background是由Options-->Preferences-->Colors中的Window Background决定的,其实Default Text的背景就是源码窗口的背景。Foreground也一样,pick了它等于设置了Options-->Preferences-->Colors中的Default Text。我也晕了,汗……

正是这些风格让source insight五彩缤纷:

SI

还要提一句,source insight中还有一个Draft View(Alt+F12),在这个模式中会忽略Style Properties中字体部分设置,统一改用Draft View(见左边栏)中设置的字体。我制作了一个背景为深黑色,字体为Fixdays的配置文件(包含其它设置)让大家下载:http://download.csdn.net/source/2480193

罗嗦了半天,WRK还没说呢,关于如何使用请看中文官网的文章 。source insight分析完WRK后大家肯定会发现连IRP、DEVICE_OBJECT这样的结构都没法解析,其实罪魁祸首就是那些函数宏,比如_IRP前面的DECLSPEC_ALIGN(),如果用我前面的配置文件调过颜色的话一眼就可以看出,source insight把它当成了Declare Function了,这些宏大多起修饰作用并无实质影响,但一样的宏在MS的代码中数不胜数(如非vc6的crt,头文件,连printf都解析不来)。可以看看这个帖子http://topic.csdn.net/u/20100613/16/b32fc799-c7f2-4648-9d91-cc933f9ffeb8.html ,我一开始以为是BUG,但source insight提供了解决方案,那就是Token Macro。Token Macro就是source insight的预处理器,它可以像C预处理器那样展开宏,正是为了对抗那些混淆source insight的宏而设计的。Token Macro是一个以.tom结尾的文件,对C/C++来说是C.tom,只要把它放在source insight创建工程的目录下,就可以立马起作用(不用重新parse一遍,不过有些时候还是parse一遍好),它会跟程序目录下的全局C.tom结合去展开宏。Token Macro编写非常简单,跟#define语法差不多(但没它强大)。大家看看我针对WRK做的C.tom就明白了,由于大多数函数宏只起修饰作用不会影响代码的解析,所以我把大多数宏做成了空宏。

下载:http://download.csdn.net/source/2480426

另外条件编译也是一个可能让source insight分析出错的地方,默认它会分析所有的条件分支。但碰到这样的情形就糟糕了:

 

view plaincopy to clipboardprint?
  1. void MyFunc  
  2. #ifdef XYZ  
  3.     (int param1, int param2)  
  4. #else  
  5.     (long param1, long param2)  
  6. #endif  
  7. {  
  8.     …  
  9. }  
  10. void DoThing(  
  11.     int param1,  
  12. #ifdef ABC  
  13.     int param2)  
  14. #else  
  15.     int param2, param3)  
  16. #endif  

 

很不幸,WRK中也有这样的问题,这个可以通过添加Condition的方法解决。

我在Global Conditons中添加了;

  • MIDL_PASS    0
  • __midl    0

Project-Specific conditions添加了:

  • _AMD64_    0
  • _MSC_VER    1300
  • _NDIS_    1
  • _NTDDK_    1
  • _NTIFS_    1
  • _WIN64    0
  • _X86_    1

这样不符合条件的分支代码会不进行解析,用灰色表示。

另外,source insight还有一个小BUG,用typedef定义函数指针类型时,当函数指针返回类型(也用typedef定义)和函数指针类型定义在同一行时,函数指针返回类型无法解析。如:

 

view plaincopy to clipboardprint?
  1. typedef   
  2. NTSTATUS (*WMIENTRY)(  
  3. ……);//NTSTATUS无法解析  
  4. typedef NTSTATUS  
  5. (*WMIENTRY)(  
  6. ……);//NTSTATUS可以解析  

 

还有typedef定义函数指针类型时,函数的参数也都是不染色!这个问题似乎没有什么解决方法,用Custom Parsing也无济于事。

还有一种情况会让source insight解析出错,比如IopfCompleteRequest、NtQueryEaFile函数,在函数名和{之间有一段多行宏,这样source insight就解析的有问题了。这应该是个BUG,不知道大家有什么解决办法,我迫不得已只好挪动一下宏的位置!

现在几乎所有的问题都解决了,代码中都染上颜色了吧,呵呵……

SI

SI

SI

SI

原创粉丝点击