一天纪要

今天搞定了好多事情,感觉相当不错^.^

凌晨和Sandy在601聊天到4点半多,把很多的事情都好好地讨论了下,感觉下一步做什么怎么做清晰了很多。

上午睡过去的…

下午到实验室和KouPeng师兄,猜想加搜索后,终于发现ecryptfs的源码原来已经集成到了linux的源码包中,不过不知道为什么ecryptfs的官网都不提示下的。单单搜源码就耗了好长的时间。官网提供的utils包只是如何方便的使用ecryptfs的工具包而已。

回来又把windows核心编程中windows内存结构看了下。DLL到底加载到了什么位置搞明白了。我之前的《detours笔记》中写的DLL在一定程度上说也是正确的,那就是在系统分配的用户地址空间为3G的时候。在XP下的boot.ini中启动项加入/3G开关,讲会使用户空间程序的地址空间为3G,内核被压缩到剩下的1G空间中。这样会导致系统能创建线程,堆栈和其它资源数量的减少,此外,系统最多只能使用16GB的RAM,而通常情况下最多可以使用64GB的RAM,因为内存方式中没有足够的虚拟地址空间来管理更多的RAM。XP默认不开3G开关,这种情况下,DLL等加载的地址是在2G一下的。这也就解释了我之前的疑惑,为什么用IceSword看DLL的base地址时,都是0×80000000下的。

刚才和Sandy聊天,说到《c缺陷与陷阱》中提到的(*(void(*)())0)()怎么通过剥皮的方式逐步搞清楚他的真面目。比较复杂的式子在c++中也有,也需要花点功夫去搞明白。之后说,c和c++对NULL的定义是不一样的…我想了想没有想法,只知道c中的定义是 ((void *)0),c++中对NULL直接定义为0。这样子问题来了,例如在c++中重载时,两个函数:

int test(int a);

int test( char *b);

这种情况下调用test(NULL)本意是传指针但却被当做是一个普通的整数0了。

还有一点,为什么一个程序的返回值如果是BOOL型的时候为什么一般不判断是否为TRUE,而可以判断是否为FALSE,更一般的情况下市判断0或者非0。因为通常情况下,FALSE只有一个值就是0,但是其他所有的都为真。这样如果有个程序可以返回3,4,5等整型值来表示不同的返回信息,用TRUE就很难判断函数是否运行失败。恩,还有函数的返回值如果是PVOID类型的话表示是数据块的内存地址,在API中经常见到。

最觉得有收获的,是Sandy推荐的牛人的文章,也就是pongba的博客。不论是《why c++》还是《为什么你应该(从现在开始就)写博客》,还是《书写是为了更好的思考》,篇篇经典,相当值得收藏。

最后吧,Sandy推荐说没事就看下《c++标准程序库》吧,我确实也应该看了。c++相当的值得学习。另,微软俱乐部的申请写的太简略了,Sandy说别人一看还以为你在BS人家…真没那意思,本来写的比较多,考虑到怕人家看着烦,才总结成两句话的…

3 Comments are ready?

  1. candy said on: 2009年06月17日 23:32

    sandy真是一个难得的好朋友!祝福

    [回复]

    boluor 回复  于   

    是阿是阿,还有FM,etc.

    [回复]

  2. IVY said on: 2009年06月18日 00:08

    赢得了天下输了她

    [回复]

    boluor 回复  于   

    鱼和熊掌本来就难以兼得.

    [回复]

    ctqmumu 回复  于   

    [回复]

  3. nike dunk sb said on: 2010年08月31日 16:27

    我一天就想混混做自己的事情就是最好的了

    [回复]

Post a Comment

Your email is never published nor shared. Required fields are marked *

*

*