一天纪要
今天搞定了好多事情,感觉相当不错^.^
凌晨和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?
sandy真是一个难得的好朋友!祝福
[回复]
boluor 回复 于 六月 17th, 2009 at 23:50
是阿是阿,还有FM,etc.
[回复]
赢得了天下输了她
[回复]
boluor 回复 于 六月 18th, 2009 at 22:24
鱼和熊掌本来就难以兼得.
[回复]
ctqmumu 回复 于 六月 22nd, 2009 at 19:07
…
[回复]
我一天就想混混做自己的事情就是最好的了
[回复]