如何编译truecrypt mac7.0a源码

TrueCrypt中文教程
如果你也有什值得加密的文件,或者还在为硬盘中的数据担心,哪么你是时候了解TrueCrypt了,TrueCrypt,被称作全球最好的加密软件。它是一款免费开源的加密软件,同时支持Windows
Vista,7/XP, Mac OS X, Linux 等操作系统。
TrueCrypt有什么用?
TrueCrypt是一款免费开源的绿色虚拟加密盘加密软件,不需要生成任何文件即可在硬盘上建立虚拟磁盘,用户可以按照盘符进行访问,所有虚拟磁盘上的文件都被自动加密,需要通过密码来进行访问。TrueCrypt
提供多种加密算法,包括:AES-256, Blowfish (448-bit key), CAST5, Serpent, Triple
DES, and Twofish,其他特性还有支持FAT32和NTFS分区、隐藏卷标、热键启动等。
TrueCrypt下载
官方简体中文语言包:
你需要TrueCrypt吗?
每个人都有见得人的文件,呵呵。也许是你的日记,也许是你的公司绝密文件,也许是你的私人照片,也许是一些乱七八糟的影片……
这些都是你的隐私。但是这些隐私需要满足下列条件:
1、不让其它人非法打开;
2、自己能够足够方便的打开;
3、不会出现自己也打不开的情况。
网上这么多加密软件。相当多的加密软件根本没有加密,叧是隐藏而已。稍微懂一点的人都可以轻易打开。今后我们会给大家演示怎么打开那些一般加密文件加密的文件以告诉大家它们是多么的不安全。用这些软件加密,你根本不安心。假设哪天你电脑丢了,你会很不安心,因为你担心别人会非法访问你的这些文件。这些加密软件不满足第一个条件。不够安全。
再就是有些加密软件,虽然很安全,但是加密速度太慢,比如我们常用的winrar
压缩文件就是一个很好的加密软件,但是你加密压缩一个1G
的文件需要半个小时。你下次打开这个加密文件查看又要花费半个小时,你能忍受吗?很多真正加密而不是采取隐藏办法的加密软件都很慢。这些不满足第二个条件,那就是自己不足够方便的打开它们。
另外很多人寻求安全,但是终极安全的同时你有没有意识到有一天自己也可能打不开呢?加密的文件都是最重要的文件,一旦自己也打不开,多难受啊!很多电脑很安全,装有安全芯片,但是你不了解,有一天你叧是重装了一下系统,你的文件连你自己都打不开了。这不满足第三条。有一天你自己也可能会打不开你加密的文件会让你不安。
今天的软件是从上百个加密软件中挑选出来的,经过长期测试后才拿出来推荐给大家的。我们多圈网叧推荐精品的东西。
这个软件具有很多特点,有些加密软件加密了,但是下次重装系统后所有文件都无法解密了,但是这个不会,它是绿色不依赖操作系统的。有些软件在
XP 下加密了一个文件,在 XP 下可以解密,但文件在 Vista
系统下软件就无法使用了,导致无法解密,但是这个不会,XP、Vista、win7 都可以使用,加密的文件甚至在 Linux
里面也可以解密。有的加密文件加密个文件慢得要命,但是这个加密速度非常快。这个加密软件的加密属于真实的加密,而不是简单的隐藏文件。它可以使用文件(比如你电脑里面的一首歌曲)作为密码,让你的加密文件无人能破解。即使你的电脑丢了你都很安心,因为没有人能够破解他们。同时它很稳定,叧要你记住密码,并且记住是什么文件作为密码的就不会出现很多不可遇见因素导致的自己也无法打开。(很多加密软件加密的文件最终用户自己也无法打开这些文件,但原因都不是因为忘记了密码,而是其它不可遇见因素,比如不小心重装系统了、软件出现故障了等)。这个软件就是TrueCrypt。
TrueCrypt怎么使用?TrueCrypt教程
先看看下面这张图,你就可以了解它大致是如何工作的了。
通过这个软件你可以在你电脑的一个地方(比如E 盘)创建一个指定大小的
“文件保险柜” (请容许我这样称呼)。在你打开E 盘时这个文件保险柜叧是显示成一个普通的文件的样子(比如图中一个 5G
的seven.rmvb
的电影文件,当然啦,你可以给他取任何名字及扩展名),但是你无法直接打开他,因为这叧是他外表的隐饰(如图二)。你可以把它看成是一个5G
大小(大小也可以自己设定)的文件保险柜。需要通过这个TrueCrypt
软件来打开它。加密软件可以将这个文件保险柜加载到我的电脑中变成一个盘符,比如J 盘。之后你可以通过访问其它盘(C 盘、D
盘等)一样访问它及往它里面放入文件。一旦在这个软件中关闭这个文件保险柜(也者设定一定时间不访问它会自动关闭),就不能访问这个文件保险柜的文件了。你可以把这个TrueCrypt
加密软件看成是它生成的加密保险柜的大门。叧有通过这个软件,并知道密码,才可以查看保险柜中的文件。
也许你要问,要是没有了这个加密软件岂不是打不开这个保险柜了吗?是的,叧要你记住保险柜的密码,你可以随便到网上下载一个TrueCrypt
软件来打开它。也许你又问,这个保险柜变成一个文件,别人确实打不开,要是被别人也自己不小心删掉怎么办,因为变成了一个文件,很容易被误删啊。是的,后面我会讲解如果放置被误删的。你也许又问,别人打不开,直接给你把整个保险柜拷贝走慢慢研究怎么办?我告诉你,如果你设置的密码不是太简单,无法破解。就连编写这个软件的人也无法破解。如果你结合文件作为密码,那就根本是不可能破解的。
OK。看了上面的图一,你应该清楚大致的情况了。那么现在我们讲解的思路就很清楚了。分成几个部分讲解。
第一部分:怎么得到这个软件;
第二部分:怎么生成一个文件保险柜;
第三部分:怎么打开保险柜以及怎么放入文件;
第四部分:怎么防止被误删除;
第五部分:一些注意事项。
别看这么多部分,跟着我的讲解,你会发现其实很简单的。相信你会喜欢这个软件的。
第一部分:怎么得到这个软件
软件共1.33M。绿色软件。解压开就可以直接使用。支持Win7、Vista、XP。win7 下加密的文件可以到XP
下解密(很多加密软件跨操作系统就不行了)。加密的文件可以脱离操作系统存在。不用担心重装系统后会打不开以前的加密文件。其它更多优点在这里不说了。你们慢慢体会。
如图三。TrueCrypt.exe 文件是主程序文件。
第二部分:怎么生成一个文件保险柜
使用这个软件加密文件就先要生成一个一定大小的文件保险柜。这个文件保险柜可以你自己取个名字,比如叨”保险箱.rm”,也可以叨“safe.iso”,名字你可以任意取。你可以把这个保险柜放在任何地方,当然不建议放在系统盘C
盘啦,因为重装系统会格式化导致你的文件丢失。当然建立好了也是可以移动它的,因为在外表看来,他叧是一个普普通通的文件。
下面我们就来建立一个文件保险柜吧:
1、打开软件文件夹里面的TrueCrypt.exe,这个就是这个程序的主程序文件,我们反复会用到它,你可以将它创建一个桌面快捷方式以便亍我们方便的打开它。如图五。
在打开的程序窗口中,选择菜单“加密卷”“创建加密卷”。(软件中将我前面说的文件保险柜叨“加密卷”的。我觉得文件保险柜更容易理解。所以我称之为“文件保险柜”。不过你为了适应软件,你要知道软件中所谓的加密卷是什么哦。)如图六。
接着连续两次点击下一步,(因为按照软件的默认设置就可以了)。
接下来的如图九的是要注意的。询问你将要生成的加密卷(即要生成的文件保险柜)的位置。点击后面的“选择文件”,然后找到你想放置文件保险柜的文件夹。然后在下方文件名的地方,写入你想给你生成的文件保险柜取的名字。我这里取个名字叨“文件保险箱.rar“,你可以任意取名及扩展名。注意:由于窗口中按钮文字是“选择文件“,所以你很可能会打开我的电脑选择一个文件,实际上是软件本身翻译有问题,实际上是让你自己找个地方,然后新建一个文件。所以你不要在文件夹里面单击选择文件,那样,那个文件会被生成的文件替换掉的。你应该自己写入一个文件夹里没有的文件名。
接下来图十,让你选择加密算法。直接点击下一步就可以了。不需要选择其它算法。这种就够安全了。
这一步问你这个加密卷(文件保险柜)要设置多大。你要注意选择后面的单位哦。我这里选择生成1G 的保险柜。然后点击下一步。
注意:很多加密软件是直接将文件加密,文件是多大就生成大致多大的加密文件。但是这个软件是先生成一个空的加密的文件保险柜。大小需要你先设置好。开始你也许感觉这样挺浪费空间,时间久了你就会反而很喜欢这种方式了。大小设置多大呢?那就看你需要放置什么东西到里面了。不过现在硬盘都很大了,设置大一点吧,那样加密文件相对不容易被人拷贝走,不是吗?
这一步让你设置加密卷(文件保险柜)的密码了,如图十二。
你可以叧是设置单纯的密码。也可以同时勾选下方的“使用密钥文件“并选择一个电脑里面的文件作为密码。这是这个软件很特殊的地方哦。如果同时选择文件作为密码的话,你的文件保险柜基本上是无人能破解的。至于采用文件作为密码的原理,我在图十三中有说明。选择好文件密钥后,依次点击确定,并点击下一步。注意,使用文件作为密码只是可供选择的,而不是必须选择的哦。你可以只用常规的比如123sasw
等作为密码。如果你同时选择文件作为密码。那么这个文件的类型是很有讲究的哦。在文章最后的注意事项中我会详细说明该用什么类型的文件作为密钥文件。
这一步询问你要将这个文件保险柜使用什么样的文件系统。这里不细节的讲解了,全部选择NTFS
吧。然后点击“格式化“。如图十四。很多人看到格式化选项就害怕,害怕把电脑里面的文件弄丢失。实际上是这样的,由于前面我们指明了要建立一个1G
的加密卷(文件保险柜),那么这个1G 的空间就从硬盘上划分出来了,但是这个1G 的空间怎么利用呢,软件要求将这个1G
的空间先按照这个软件要求的格式加密格式化一下才可以使用。所以尽管点击吧,不会出问题的。格式化过程如图十五。
格式化完毕后加密卷就已经创建好了。点击退出。如图十六。
这里需要注意。这里不要点击下一步了。我开始使用这个软件的时候看到“下一步“就一直点击,结果永进都无法点击完的。
好了,加密保险箱生成了,看上去就像个普通文件,可以将它剪切到硬盘的任何地方。如图十七。你一定再想怎么打开它。直接用播放电影的软件是不能打开它的哦。怎么打开它,以及怎么往里面放文件我们下一部分讲解。
第三部分:怎么打开保险柜以及怎么放入文件
打开程序文件TrueCrypt.exe。如果你的程序窗口已经打开了就不需要执行这一步了。
这一步是关键。程序界面打开后。这个界面就是通向那个文件保险箱的大门哦。按照如图十九的方式加载这个文件保险箱。加载后,这个保险箱会以一个盘符的形式显示。比如我选择了
J 盘盘符。你可以像打开D 盘,E 盘那样打开J
盘这个文件保险箱,迚入它的内部。(注意哦一定要先选择一个盘符哦。选择的盘符就是后面这个保险箱显示的盘符)
2、点击载入后,要求你输入密码。如果你使用了文件作为密钥文件,则要求选中你的那个密钥文件,如图二十。
一次点击确定后就将保险箱加载好了。如图二十一是加载好之后的样子。可以看出“我的电脑”内部多出了一个J 盘。在TrueCrypt
软件中可以显示(黄色高亮部分)大小为1023MB。
盘,迚入这个保险柜看看。当然是空的啦。我们尝试复制一个文件迚去吧。如图二十二。速度31.8MB/秒。速度挺不错吧。要知道,文件只要存放进去就整个加密了哦。同样文件只要从内部拷贝出来就同时完成解密操作。所以这个软件的加密解密速度是很快的
当你将文件放入这个保险柜之后,你想关闭它,只需要点击软件下方的卸载也者全部卸载,就可以将它从盘符中退出来。如图二十三。再了解一下保险柜及软件之间的关系吧。
关于怎么打开这个保险柜及关闭这个保险柜应该知道了吧。有一种情况就是我害怕我自己加载这个盘符后自己忘记了。我想它半个小时不读取内部的数据后就自动关闭,是否可以呢?是可以的。你自己去软件的-“设置”-“参数选择”-中设置吧。
第四部分:怎么防止被误删除
就像对于使用钱包,有两种态度,一种人说:方便,一种人说:不安全,因为一旦丢掉,就丢了所有东西。对于这个保险柜也有人这么想。一旦自己不小心将整个文件删除,那岂不是麻烦了。是的,我们考虑到了。于是教你如何防止误删除。我们还是以这个生成的1G
的文件保险柜来说。实际上我要讲的方法适合于任何文件。是利用NTFS
文件系统的权限来实现的。原理是通过建立一个文件夹,并将这个不想删除的文件夹放入这个文件夹,然后通过设置文件夹的权限,让所有人不能删除这个文件夹。
1、 选择一个是NTFS 文件系统的盘。(盘符右键属性中可以查看)如图二十四
建立一个文件夹safe(图二十五),并将文件保险柜文件移动进去。
然后在文件夹safe
上点击右键-属性-安全。图二十六。(XP
用户需要打开“我的电脑”-工具-文件夹选项-查看-确保去掉“使用简单文件夹共享”前面的√,否则属性中没有“安全”标签)
点击“编辑”,出现的如图二十七的界面点击“添加”,然后在跳出的窗口输入“everyone”不带引号,并点击确定回到safe
的权限的窗口,继续点击确定。回到图二十八的界面。
&图二十八实际上就回到了safe
文件夹的属性页面。我们前面的操作实际上叧是添加了一个everyone
用户。意思就是电脑上的“每个用户”的意思。我们接下来就要设置让每个用户都不能删除这个safe
文件夹包括文件夹里面的内容。操作:选中Everyone
用户(图二十八)点击下方的“高级”(设置不能删除需要到高级权限中去设置)
点击“高级”后,进入如下图二十九的文件夹高级安全设置窗口。选择Everyone
用户,并单击下面的 “更改权限”表示我们要更改everyone 用户的高级权限,让每个人不能删除这个文件夹啦。
点击更改权限后出现图三十窗口。继续选择Everyone
用户,并点击下面的“编辑”
接下来图三十一是关键,前面设置那么多,就是要弄出这样一个设置Everyone
用户权限的窗口。这里注意看,“应用亍”后面有“此文件夹、子文件及文件”,表示一旦设置就应用到safe
这个文件夹以及文件夹中的所有内容。一旦设置了对亍everyone 用户不能删除,那么这个safe
文件夹及它内部的文件都不能被删除。下面的权限怎么设置呢?
其实很简单。注意按照我的顺序操作
1、先勾选”允许“下面的”完全控制“的框。(表示对所有用户来说,对于这个文件夹什么操作都可以做。);
2、勾选”拒绝“后面的”删除子文件夹及文件“的两个勾(表示什么都可以做,但是就是不能删除他们。)
设置好后画面及下图相同。”
完全控制“后面的“允许”下的勾会被自动去掉,这很好理解。不要再强行将他勾上,否则拒绝删除的勾就会被去掉的哦。
接下来一直点击“确定”,直到把所有的属性窗口都关掉。中途跳出的提示也都点击确定,不要理会那些错误提示。我们来看看接下来我们尝试删除保险柜文件试试吧,图三十二。当你不小心删除的时候会跳出错误。不让你删除。但是其它的读取操作都是可以的。
也许你自己操作的时候总会出现问题,实际上,你只要记住了原理是通过更改某个用户的权限,让这个用户不能删除。所以如果你设置不成功就分别选择每个用户(图三十三),然后点击“高级”,将里面的权限设置成不能删除。肯定是可以成功的。多尝试吧。NTFS
的权限问题是挺有用的,也是大家都不明白的。
哪天你自己故意要删除他们的时候只需要设置“属性”-“安全”标签,并将你设置的权限后面的拒绝删除后面的勾去掉就可以了。很少有人知道这个知识的,所以可以很大程度上防止你的文件被删除掉。当然绝大部分都是为了防止被误删除的,因为别人真的想给你销毁一个文件时很容易的,它可以给你整个硬盘格式化。多圈网·多易事
第五部分:一些注意事项。
1、保险柜建立的地方不要放在系统盘。因为那样重装系统格式化系统盘(如C
盘)就会丢失这个保险柜。
2、如果是XP
的操作系统,需要打开“我的电脑“-工具-文件夹选项-查看-去掉“使用简单文件夹共享”前面的勾。否则文件夹属性窗口找不到”安全“标签,就无法设置放置删除的权限。
3、可以设置让加载的加密卷(文件保险柜)一定时间不读写后自动退出。在程序的-“设置“-“参数选项”-里面有这样的设置。
4、如果使用密钥文件的话,必须要考虑这个密钥文件是否容易丢失,更改。丢失了必须要可以自己创建一个。否则是很危险的。比如你使用一个WORD
文件作为密钥文件。但是有一天你修改了这个WORD
文件,那么对亍这个软件来说,这个文件已经不是以前的那个文件了,不能作为打开的密钥了。建议使用不容易更改的文件,及自己可以重新创建的文件。比如记事本文件。你可以使用一段话也者一句话写入一个记事本,并把这个记事本文件作为密钥文件。那么哪天即使你这个密钥文件丢失,你也可以再新建一个记事本文件,将那句话写迚去(注意多一个空格少一个空格都不行哦)。这个文件就可以重新作为密钥文件了。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。加密软件TrueCrypt受到争议 有人怀疑它是NSA的蜜罐
流行的加密软件TrueCrypt最近因为开发者来历不明而受到争议,有人甚至怀疑它是NSA的蜜罐。安全研究人员已经提出对它进行完整安全审计的计划,安全审计计划的集资目标已经达成。
现在,加拿大Concordia大学信息系统安全专业研究生Xavier de Carn& de Carnavalet用TrueCrypt编译出二进制版的TrueCrypt 7.1a(以及v7.0a和v6.3a) for Win32,然后与官方的二进制程序进行对比,发现他的编译版本和官方版本虽然存在细微差异,但根据反汇编的结果,这些差异都可以用文件创建日期和时间等因素合理进行解释。
如果TrueCrypt有后门,那么至少它的编译过程没发现什么问题。
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。posts - 135,&
comments - 265,&
trackbacks - 0
#ifndef&_PROTO_H_#define&_PROTO_H_/**//**&TCP/IP&协议类型*/#define&IPPROTO_IP&&&&&&&&0&&&&&&&&&&&&&&//&IP#define&IPPROTO_ICMP&&&&1&&&&&&&&&&&&&&//&ICMP#define&IPPROTO_TCP&&&&&&&&6&&&&&&&&&&&&&&//&TCP#define&IPPROTO_UDP&&&&&&&&17&&&&&&&&&&&&&//&UDP/**//**&常见端口*/#define&PORT_DNS&&&&&&&&53&&&&&&&&&&&&&&&&//&DNS/**//**&其它定义*/#define&ETH_ALEN&&&&&&&6&&&&&&&&&&&&&&//&以太网地址大小#define&ETH_HLEN&&&&&&&14&&&&&&&&&&&&&//&以太网头部大小#define&ETH_DATA_LEN&&&1500&&&&&&&&&&&//&最大帧负载数据大小#define&ETH_FRAME_LEN&&1514&&&&&&&&&&&//&最大帧大小,头部+负载数据/**//**&*&常见协议定义**/#pragma&pack(push,&<span style="COLOR: #)/**//**14字节的以太网包头*/typedef&struct&_ETHDR&&&&&&&&&{&&&&UCHAR&&&&eh_dst[ETH_ALEN];&&&&&&&&&&&&//&目的MAC地址&&&&UCHAR&&&&eh_src[ETH_ALEN];&&&&&&&&&&&&//&源MAC地址&&&&USHORT&&&&eh_&&&&&&&&&&&&&&&&&&&&//&下层协议类型,如IP(ETHERTYPE_IP)、ARP(ETHERTYPE_ARP)等}&ETHDR,&*PETHDR;/**//**28字节的ARP头*/typedef&struct&_ARPHDR&&&&{&&&&USHORT&&&&ar_&&&&&&&&&&&&&&&&//&&&&硬件地址类型,以太网中为ARPHRD_ETHER&&&&USHORT&&&&ar_&&&&&&&&&&&&&&&&//&&协议地址类型,ETHERTYPE_IP&&&&UCHAR&&&&ar_&&&&&&&&&&&&&&&&//&&&&硬件地址长度,MAC地址的长度为6&&&&UCHAR&&&&ar_&&&&&&&&&&&&&&&&//&&&&协议地址长度,IP地址的长度为4&&&&USHORT&&&&ar_&&&&&&&&&&&&&&&&//&&&&ARP操作代码,ARPOP_REQUEST为请求,ARPOP_REPLY为响应&&&&UCHAR&&&&ar_sha[ETH_ALEN];&&&&//&&&&源MAC地址&&&&ULONG&&&&ar_&&&&&&&&&&&&&&&&//&&&&源IP地址&&&&UCHAR&&&&ar_tha[ETH_ALEN];&&&&//&&&&目的MAC地址&&&&ULONG&&&&ar_&&&&&&&&&&&&&&&&//&&&&目的IP地址}&ARPHDR,&*PARPHDR;/**//**20字节的IP头*/typedef&struct&_IPHDR&&&&&&&&{&&&&UCHAR&&&&h_&&&&&&&&&&&&//&版本号和头长度(各占4位)&&&&UCHAR&&&&&&&&&&&&&&&&&&&&//&服务类型&&&&&USHORT&&&&total_&&&&&&&&&&&&//&封包总长度,即整个IP报的长度&&&&USHORT&&&&&&&&&&&&&&&&&&&&//&封包标识,惟一标识发送的每一个数据报&&&&USHORT&&&&frag_and_&&&&&&&&//&标志&&&&UCHAR&&&&&&&&&&&&&&&&&&&&//&生存时间,就是TTL&&&&UCHAR&&&&&&&&&&&&&&&&//&协议,可能是TCP、UDP、ICMP等&&&&USHORT&&&&&&&&&&&&&&&&//&校验和&&&&ULONG&&&&&&&&&&&&&&&&&&&&//&源IP地址&&&&ULONG&&&&&&&&&&&&&&&&&&&&//&目标IP地址}&IPHDR,&*PIPHDR;&/**//**20字节的TCP头*/typedef&struct&_TCPHDR&&&&{&&&&USHORT&&&&&&&&&&&&&&&&//&16位源端口号&&&&USHORT&&&&&&&&&&&&&&&&//&16位目的端口号&&&&ULONG&&&&&&&&&&&&&&&&&&&&//&32位序列号&&&&ULONG&&&&&&&&&&&&&&&&&&&&//&32位确认号&&&&UCHAR&&&&&&&&&&&&&&&&//&高4位表示数据偏移&&&&UCHAR&&&&&&&&&&&&&&&&&&&&//&6位标志位&&&&//FIN&-&0x01&&&&//SYN&-&0x02&&&&//RST&-&0x04&&&&&//PSH&-&0x08&&&&//ACK&-&0x10&&&&//URG&-&0x20&&&&//ACE&-&0x40&&&&//CWR&-&0x80&&&&USHORT&&&&&&&&&&&&&&&&&&&&//&16位窗口大小&&&&USHORT&&&&&&&&&&&&&&&&//&16位校验和&&&&USHORT&&&&&&&&&&&&&&&&&&&&//&16位紧急数据偏移量&}&TCPHDR,&*PTCPHDR;/**//**伪TCP头,计算校验和时使用*/typedef&struct&_PSDTCPHDR{&&&&ULONG&&&&&&&&ULONG&&&&&&&&char&&&&&&&&char&&&&&&&&USHORT&&&&}&PSDTCPHDR,&*PPSDTCPHDR;/**//**8字节的UDP头*/typedef&struct&_UDPHDR{&&&&USHORT&&&&&&&&&&&&&&&&//&源端口号&&&&&&&&&&&&USHORT&&&&&&&&&&&&&&&&//&目的端口号&&&&&&&&&&&&USHORT&&&&&&&&&&&&&&&&&&&&//&封包长度&&&&USHORT&&&&&&&&&&&&&&&&//&校验和}&UDPHDR,&*PUDPHDR;/**//**伪UDP头,计算校验和时使用*/typedef&struct&_PSDUDPHDR{&&&&ULONG&&&&&&&&ULONG&&&&&&&&char&&&&&&&&char&&&&&&&&USHORT&&&&}&PSDUDPHDR,&*PPSDUDPHDR;/**//**12字节的ICMP头*/typedef&struct&_ICMPHDR{&&&&UCHAR&&&&&&&&&&&&&&&&&&&//类型&&&&UCHAR&&&&&&&&&&&&&&&&&&&//代码&&&&USHORT&&&&&&&&&&&&&&//校验和&&&&USHORT&&&&&&&&&&&&&&&&&&&&&&//标识符&&&&USHORT&&&&&&&&&&&&&&//序列号&&&&ULONG&&&&&&&&&&&&&&&//时间戳}&ICMPHDR,&*PICMPHDR;/**//**6字节的PPPOE头+2字节协议*/typedef&struct&_PPPOEHDR{&&&&UCHAR&&&&ver_&&&&&&&&&&&&//版本+类型&一般为0x11&&&&UCHAR&&&&&&&&&&&&&&&&&&&&//编码&&&&USHORT&&&&&&&&&&&&&&&&//session&id&&&&USHORT&&&&&&&&&&&&&&&&&&&&//长度&&&&USHORT&&&&&&&&&&&&&&&&//协议}&PPPOEHDR,&*PPPPOEHDR;/**//**&dns包头*/typedef&struct&_DNSHDR&{&&&&USHORT&&&&&USHORT&&&&&USHORT&&&&&USHORT&&&&&USHORT&&&&&USHORT&}&DNSHDR,&*PDNSHDR;/**//*&*&dns查询包,query*/typedef&struct&_DNSQUERY{&&&&/**//*UCHAR **/&&&&//查询的域名,这是一个大小在0到63之间的字符串&&&&/**//*该域名的获取方法如下:&&&&*&长度:udp包总长度-sizeof(UDPHDR)-sizeof(DNSHDR)-sizeof(DNSQUERY)&&&&*&内容在dns头后面&&&&*/&&&&USHORT&&&&&&&&&&&&&&&&//查询类型,大约有20个不同的类型&&&&USHORT&&&&&&&&&&&&//查询类,通常是A类既查询IP地址}&DNSQUERY,&*PDNSQUERY;/**//*&*&dns响应包*/typedef&struct&_DNSRESPONSE{&&&&USHORT&&&&&&&&&&&&//&查询的域名&&&&USHORT&&&&&&&&&&&&//&查询的类型&&&&USHORT&&&&&&&&//&类型码&&&&UINT&&&&&&&&&&&&//&生存时间&&&&USHORT&&&&&&&&&&&&//&资源数据长度&&&&UINT&&&&&&&&&&&&//&资源数据}&DNSRESPONSE,&*PDNRESPONSE;#pragma&pack(pop)#endif
阅读(3048)
2930312345679111213141617181920212223242526272830123456789
留言簿(16)
随笔分类(136)
随笔档案(135)
C++基础知识
积分与排名
阅读排行榜
评论排行榜truecrypt 编译 源码 - 下载频道
- CSDN.NET
&&&&truecrypt 编译 源码
truecrypt 编译 源码
truecrype 是个加密软件,可以分区加密。这是在linux下编译所要用到的源代码。
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
您可能还需要
安全技术下载排行输入您需解决的
软件开发问题并开始搜索,
IT异常查询网可以方便地提供各类
程序错误解决方案。
TCPMP之旅(2)
TCPMP 在win32下的编译过程+插件的加载过程(VS2005+XP) - VSTS
&&&发布于: 21:54:54&&&
TCPMP之旅(二)
TCPMP 在win32下的编译过程+插件的加载过程(VS2005+XP)转载请标明是引用于 http://blog.csdn.net/chenyujing1234&
欢迎大家提出意见,一起讨论!
TCP的码源框架介绍可以参考我的文章: TCPMP之旅(一) TCPMP整体软体框架
最近因为在WINCE播放视频文件,画面很不流畅, 于是想弄个TCPMP来试下效果. 没想到这个X86 平台上的TCPMP网络上还真的是找不到, 只能找到ARM平台的, 一打开就提示不是有效的WINCE应用程序.& 于是便自己编译. 说到这个编译过程那可也是一波三折, 具体不再多说啦, 下面我列出所有我在编译过程中的遇到的错误.
1、 首先是是编译common工程
报以下错误
1&'yasm' 不是内部或外部命令,也不是可运行的程序
解决方法:
从 http://yasm.tortall.net/Download.html&下载得到yasm-1.2.0-win32.exe文件 (我的电脑是32位的,根据实际情况)
然后把yasm-1.2.0-win32.exe 名字改为 yasm.exe,并把它复制到你VS2005的安装路径下,
之后再编译可能报以下错误:
1&yasm: FATAL: Could not open input file
原因可能有两个:
(1)是不是有中文路径
(2)路径中是否有空&#26684;。
2、 编译其它工程
2、1& 在其它工程出现链接时提示找不到标识符时,在链接lib中加入我们刚刚编译的common.lib。(当然也得加入链接目录)
2、2 在编译player时会报错:
1&正在链接...
1&main.obj : error LNK2001: 无法解析的外部符号 __tcscpy_s
1&../debug/player.exe : fatal error LNK1120: 1 个无法解析的外部命令
解决方法是将main.c中的& 第122行改为 123行.
& 以下是目标文件:
三、插件的加载过程
补充:附后了interface.plg插件外的插件加载方法。
加载方法同样通过DLLRegister接口。加载插件的过程是在Context_Init函数中的Plugins_Init函数完成的。
void Plugins_Init()
tchar_t Path[MAXPATH];
array List = {NULL};
// 查找所有的插件,放到List里
FindPlugins(&List);
for (i=ARRAYBEGIN(List,int);i!=ARRAYEND(List,int);++i)
int Class = *i;
tchar_t Base[256];
NodeBase(Class,Base,TSIZEOF(Base));
if (RegOpenKeyEx(HKEY_ROOT, Base, 0, KEY_READ, &Key) == ERROR_SUCCESS)
if (LoadValue(Key,NODE_MODULE_PATH,Path,sizeof(Path),TYPE_STRING) && NodeFindModule(Path,0))
memset(&Def,0,sizeof(Def));
Def.Class = C
Def.Flags = 0;
Def.ParentClass = 0;
Def.Priority = PRI_DEFAULT;
LoadValue(Key,NODE_PARENT,&Def.ParentClass,sizeof(int),TYPE_INT);
LoadValue(Key,NODE_PRIORITY,&Def.Priority,sizeof(int),TYPE_INT);
LoadValue(Key,NODE_FLAGS,&Def.Flags,sizeof(int),TYPE_INT);
LoadValueString(Key,Class,NODE_NAME);
LoadValueString(Key,Class,NODE_CONTENTTYPE);
LoadValueString(Key,Class,NODE_EXTS);
LoadValueString(Key,Class,NODE_PROBE);
NodeLoadClass(&Def,Path,0);// 把插件节点注册
RegCloseKey(Key);
ArrayClear(&List);
(1) Plugins_Init先通过FindPlugins(&List);查找exe目录中的所有插件,找到即调用AddModule将
&&&&&&&&&&& 此节点存到Context& p-&NodeModule(用于管理外部插件模块数组)中去。
&&&&&&&&&&& 并根据注册表判断是否要加载此插件。
(2) 从common.dll目录下增加插件,从注册表中增加插件。
static void FindPlugins(array* List)
tchar_t Name[64];
tchar_t Path[MAXPATH];
tchar_t Path2[MAXPATH];
DWORD RegSize,RegType,NameSize,D
HKEY Key,KeyS
NodeBase(0,Path,TSIZEOF(Path));
tcscat_s(Path,TSIZEOF(Path),T(&\DLLStamp&));
if (RegCreateKeyEx(HKEY_ROOT, Path, 0, NULL, 0, KEY_READ|KEY_WRITE, NULL, &KeyStamp, &Disp) != ERROR_SUCCESS)
KeyStamp = NULL;
// 在exe目录中增加插件
GetModulePath(Path,NULL);
FindFiles(Path,T(&*.plg&),AddModule,&KeyStamp);
// 可能exe是在和common.dll 不同的目录,所以去common.dll目录下查找其他插件
GetModulePath(Path2,T(&common.dll&));
if (tcsicmp(Path2,Path)!=0)
FindFiles(Path2,T(&*.plg&),AddModule,&KeyStamp);
// additional plugins
NodeBase(0,Path,TSIZEOF(Path));
tcscat_s(Path,TSIZEOF(Path),T(&.Plugins&));
if (RegOpenKeyEx(HKEY_ROOT, Path, 0, KEY_READ, &Key) == ERROR_SUCCESS)
for (No=0;;++No)
NameSize = TSIZEOF(Name);
RegSize = sizeof(Path);
if (RegEnumValue(Key,No,Name,&NameSize,NULL,&RegType,(LPBYTE)Path,&RegSize)!=ERROR_SUCCESS)
if (RegType == REG_SZ)
AddModule(Path,&KeyStamp);
RegCloseKey(Key);
if (KeyStamp)
// delete unused stamps
ArrayClear(List);
RegSize = TSIZEOF(Path);
for (No=0;RegEnumValue(KeyStamp,No,Path,&RegSize,NULL,NULL,NULL,NULL)==ERROR_SUCCESS;++No)
if (!NodeFindModule(Path,0))
ArrayAppend(List,Path,(tcslen(Path)+1)*sizeof(tchar_t),256);
RegSize = TSIZEOF(Path);
for (s=ARRAYBEGIN(*List,tchar_t);s!=ARRAYEND(*List,tchar_t);s+=tcslen(s)+1)
RegDeleteValue(KeyStamp,s);
RegCloseKey(KeyStamp);
ArrayClear(List);
NodeBase(0,Path,TSIZEOF(Path));
if (RegOpenKeyEx(HKEY_ROOT, Path, 0, KEY_READ, &Key) == ERROR_SUCCESS)
RegSize = TSIZEOF(Name);
for (No=0;RegEnumKeyEx(Key,No,Name,&RegSize,NULL,NULL,NULL,NULL)==ERROR_SUCCESS;++No)
if (tcslen(Name)==4)
Class = StringToFourCC(Name,0);
ArrayAppend(List,&Class,sizeof(Class),128);
RegSize = TSIZEOF(Name);
RegCloseKey(Key);
(3) 把插件节点注册。即把节点加入到Context p-&NodeClass中
void NodeLoadClass(const nodedef* Def,const tchar_t* Module,int ModuleId)
context* p = Context();
int ModuleNo = FindModule(p,Module,ModuleId);
if (ModuleNo&=0)
Register(p,Def,0,ModuleNo); // 注册节点
四、Interface工程源码解读
&&& Interface插件功能模块包含在interface文件夹下,其中的interface.c实现图形界面的大部分功能,
还有小部分功能在win_win32.c文件中实现.程序运行过程基本有下面几个步骤:
&&1.& 多媒体播放器运行程序为player.exe,工程中main.c文件的WinMain函数为程序开始的第一步。
它先加载e:Au1380_forVolo cpmp_from_xianshengWin32debugilayer.exe& ,假如它不存在就加载 interface.plg。
然后转到interface.plg的main函数中。
#if !defined(TARGET_WINCE) && defined(UNICODE)
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hParent,LPSTR CmdA,int CmdShow)
WCHAR Cmd[2048];
mbstowcs(Cmd,CmdA,sizeof(Cmd)/sizeof(WCHAR)); //!!!
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hParent,TCHAR* Cmd,int CmdShow)
#ifndef NDEBUG
// DLLTest(); // just to help debugging plugins. comment out if not needed
Context();
#if defined(TARGET_WINCE) && defined(ARM)
if (ProgramId == 2)
OSVERSIONINFO V
Ver.dwOSVersionInfoSize = sizeof(Ver);
GetVersionEx(&Ver);
if (Ver.dwMajorVersion*100 + Ver.dwMinorVersion &= 421)
// old shell menu not supported after WM2003SE
MessageBox(NULL,T(&This ARM_CE2 version of the player is not compatible with this device. Please install ARM_CE3 version.&),NULL,MB_OK|MB_ICONERROR);
#ifdef NDEBUG
if (!FindRunning(Cmd))
HANDLE Handle = CreateMutex(NULL,FALSE,ProgramName);
if (GetLastError() != ERROR_ALREADY_EXISTS)
#ifndef NO_PLUGINS
SetCursor(LoadCursor(NULL, IDC_WAIT));
Module = Load(T(&interface.plg&));
if (Module)
void (*Main)(const tchar_t* Name,const tchar_t* Version,int Id,const tchar_t* CmdLine);
*(FARPROC*)&Main = GetProcAddress(Module,TWIN(&Main&));
if (!Main)
*(FARPROC*)&Main = GetProcAddress(Module,TWIN(&_Main@16&));
Main(ProgramName,ProgramVersion,ProgramId,Cmd);
FreeLibrary(Module);
Main(ProgramName,ProgramVersion,ProgramId,Cmd);
#ifdef NDEBUG
CloseHandle(Handle);
SetCursor(LoadCursor(NULL, IDC_ARROW));
#ifdef NDEBUG
&&&2.& common工程是核心模块
是一个开放的集数据输入、转换、音/视频解码、信号输出等功能为一体的完整的多媒体播放框架。WinMain后调用 common.dll中的Contxt_Init函数,完成各个功能模块ID的注册工作.除Interface功能外,其他功能模块的注册基本在 Contxt_Init中完成.
DLLEXPORT void Main(const tchar_t* Name,const tchar_t* Version,int Id,const tchar_t* CmdLine)
SAFE_BEGIN
// 完成各个功能模块ID的注册工作.除Interface功能外,其他功能模块的注册基本在 Contxt_Init中完成.
if (Context_Init(Name,Version,Id,CmdLine,NULL))
WaitEnd();
// 在这里才把界面显示出来
WinPopupClass(INTERFACE_ID,NULL);
Context_Done();
&&&3.&& 在调用完Context_Init后调用了WinPopupClass(INTERFACE_ID,NULL);
int WinPopupClass(int Class,win* Parent)
int Result = 0;
// 创建节点
node* p = NodeCreate(Class);
// 是WIN_CLASS类
if (p && NodeIsClass(p-&Class,WIN_CLASS))
// 创建窗口
Result = ((win*)p)-&Popup((win*)p,Parent);
NodeDelete(p);
NodeCreate完成创建节点功能,它是common.lib中的接口。此接口不仅被interface模块调用,也被很多模块调用。
node* NodeCreate(int ClassId)
context* p = Context();
// 从类中创建节点
return NodeCreateFromClass(p,FindClass(p,ClassId));
NodeCreateFromClass调用interface.plg中DLLRegister函数。
通过DLLRegister函数对INTREFACE_ID对象进行注册,对象注册完成创建和内存分配等功能.
====================补充&& start& ==================================================
interface插件的注册过程( 其实与其它插件的注册过程一致,都是通过调用common.dll库完成的):
(1)NodeCreateFromClass中有LoadModule,LoadModule中有NodeLoadModule,
&&&&&&&&& 它寻找对应于ID为INTREFACE_ID的插件对应的plg,从plg中找到DLLRegister接口,来注册自己。
void* NodeLoadModule(const tchar_t* Path,int* Id,void** AnyFunc,void** Db)
int Error = 0;
#if !defined(TARGET_WINCE)
int OldMode = SetErrorMode(SEM_NOOPENFILEERRORBOX| SEM_FAILCRITICALERRORS);
Module = LoadLibrary(Path);
if (!Module)
Error = GetLastError();
if (Error == ERROR_NOT_ENOUGH_MEMORY || Error == ERROR_OUTOFMEMORY)
NodeHibernate();
Module = LoadLibrary(Path);
if (!Module)
Error = GetLastError();
Context()-&LoadModule = M
#if !defined(TARGET_WINCE)
SetErrorMode(OldMode);
if (Module)
FARPROC Func = GetProcAddress(Module,TWIN(&DLLRegister&));
if (!Func)
Func = GetProcAddress(Module,TWIN(&_DLLRegister@4&));
if (AnyFunc)
*(FARPROC*)AnyFunc = F // set before calling DLLRegister
// DLLRegister注册自己.
Result = ((int(*)(int))Func)(CONTEXT_VERSION);
if (Result != ERR_NONE)
Func = NULL;
if (AnyFunc)
*(FARPROC*)AnyFunc = NULL;
if (Result == ERR_NOT_COMPATIBLE)
PluginError(Path);
if (!Func)
FreeLibrary(Module);
Module = NULL;
if (Error == ERROR_NOT_ENOUGH_MEMORY || Error == ERROR_OUTOFMEMORY)
ShowOutOfMemory();
PluginError(Path);
====================补充&& end==================================================
static node* NodeCreateFromClass(context* p, nodeclass* Class)
node **Empty = NULL;
nodemodule* M
nodeclass *j;
if (!Class || (Class-&Def.Flags & CF_ABSTRACT))
return NULL;
for (j=Cj;j=j-&Parent)
if (Size & (j-&Def.Flags & CF_SIZE))
Size = (j-&Def.Flags & CF_SIZE);
if (!Size)
return NULL;
LockEnter(p-&NodeLock);
if ((Class-&Def.Flags & CF_GLOBAL) &&
(Module = LoadModule(p,Class-&ModuleNo))!=NULL &&
(Node = NodeEnumObject(NULL,Class-&Def.Class))!=NULL)
++Module-&ObjectC
LockLeave(p-&NodeLock);
for (i=ARRAYBEGIN(p-&Node,node*);i!=ARRAYEND(p-&Node,node*);++i)
if (!Empty)
if (!ArrayAppend(&p-&Node,NULL,sizeof(node**),256))
LockLeave(p-&NodeLock);
return NULL;
Empty = ARRAYEND(p-&Node,node*)-1;
*Empty = Node = (node*) malloc(Size);
memset(Node,0,Size);
Node-&Class = Class-&Def.C
// 创建 Node节点
if (CallCreate(p,Node,Class,(Class-&Def.Flags & CF_GLOBAL)!=0) != ERR_NONE)
for (i=ARRAYBEGIN(p-&Node,node*);i!=ARRAYEND(p-&Node,node*);++i)
if (*i == Node)
*i = NULL;
free(Node);
Node = NULL;
#ifndef REGISTRY_GLOBAL
if (Class-&Def.Flags & CF_GLOBAL)
NodeRegLoad(Node);
Node-&Set(Node,NODE_SETTINGSCHANGED,NULL,0); // should be after NodeRegLoad
LockLeave(p-&NodeLock);
上面的代码主要调用CallCreate函数.
4.& 注册后interface.c中Create函数对INTREFACE_ID对象intface* p进行初始化,完成界面状态的最初设置.
WinPopupClass(INTERFACE_ID,NULL);
&5.主窗口创建与弹出,win_win32.c文件中WinPopupClass函数调用Popup函数,Popup实现窗口创建功能.
// 创建窗口
Result = ((win*)p)-&Popup((win*)p,Parent);
&6.Popup函数中调用HandleMessage(p,&Msg),该函数为消息响应函数,Popup完成主窗口创建的后给HandleMessage函数发送WM_CREATE消息.
static int Popup(win* p,win* Parent)
int Style = WS_VISIBLE;
int ExStyle = 0;
int Width,H
// we need higher priority in main window for better user interface responses
// but open dialog and other parts can't have that, because of some buggy keyboard drivers...
Priority = ThreadPriority(NULL,Parent?0:-1);
p-&Result = 0;
p-&Parent = P
p-&BitmapNo = 0;
p-&AygShellTB = 0;
#if defined(TARGET_WINCE)
if (AygShell && Parent)
ExStyle |= WS_EX_CAPTIONOKBTN;
if (Parent)
Style |= WS_POPUP;
GetWorkArea(p,&r);
Width = r.right - r.
Height = r.bottom - r.
Style |= WS_OVERLAPPEDWINDOW;
y = x = CW_USEDEFAULT;
Width = WinUnitToPixelX(p,p-&WinWidth);
Height = WinUnitToPixelY(p,p-&WinHeight);
// 创建窗口
Wnd = CreateWindowEx(ExStyle,WinClass.lpszClassName,LangStr(p-&Node.Class,NODE_NAME),Style,x,y,Width,Height,
Parent?Parent-&Wnd:NULL,NULL,WinClass.hInstance,p);
if (p-&Parent)
p-&Parent-&Child =
EnableWindow(p-&Parent-&Wnd,0);
while (p-&Wnd && GetMessage(&Msg, NULL, 0, 0))
HandleMessage(p,&Msg);// HandleMessage(p,&Msg),该函数为消息响应函数,Popup完成主窗口创建的后给HandleMessage函数发送WM_CREATE消息
if (Main == p)
Main = NULL;
ThreadPriority(NULL,Priority);
return p-&R
&7.&& WM_CREATE消息响应
分两部分:
&&&win_win32.c中的CALLBACK Proc首先响应,完成窗口工具栏的创建;
static LRESULT CALLBACK Proc(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
int Result = 0;
win* p = (win*)GetWindowLong(Wnd,GWL_USERDATA);
switch (Msg)
#if defined(TARGET_WINCE)
case WM_HOTKEY:
if (p-&Parent && HIWORD(lParam)==VK_ESCAPE)
HWND Focus = GetFocus();
wincontrol* i = (wincontrol*)GetWindowLong(Focus,GWL_USERDATA);
if (FuncSHSendBackToFocusWindow && ((VALIDCONTROL(i) && i-&Editor) || (!VALIDCONTROL(i) && i)))
FuncSHSendBackToFocusWindow(Msg,wParam,lParam);
p-&HotKeyEscape = !p-&HotKeyE
if (!p-&HotKeyEscape)
PostMessage(p-&Wnd,WM_CLOSE,0,0);
// 完成工具栏中系统菜单,进度条,播放控件和声音控制的创建
case WM_CREATE:
p = (win*)((CREATESTRUCT*)lParam)-&lpCreateP
p-&Wnd = W
p-&Module = ((CREATESTRUCT*)lParam)-&hI
p-&Result = 1;
p-&Focus = NULL;
p-&Closed = 0;
UpdateDPI(p);
#if defined(TARGET_WINCE)
p-&Activate = malloc(sizeof(SHACTIVATEINFO));
if (p-&Activate)
memset(p-&Activate,0,sizeof(SHACTIVATEINFO));
((SHACTIVATEINFO*)p-&Activate)-&cbSize = sizeof(SHACTIVATEINFO);
if (p-&Proc)
p-&Proc(p,MSG_PREPARE,0,0,&Result);
CreateToolBar(p);
SetWindowLong(Wnd,GWL_USERDATA,(LONG)p); // only after CreateToolBar (WM_MOVE)
if (p-&Flags & WIN_DIALOG)
GetClientRect(p-&Wnd,&r);
CreateWindow(DialogClass.lpszClassName,NULL,WS_CLIPCHILDREN|WS_CHILD|WS_VISIBLE,
0,p-&ToolBarHeight,r.right,r.bottom-p-&ToolBarHeight,p-&Wnd,NULL,DialogClass.hInstance,p);
if (p-&Init)
p-&Init(p);
if (!p-&Focus)
WinNext(p,0);
&&& 然后interface.c中的bool_t Proc函数再响应完成工具栏中系统菜单,进度条,播放控件和声音控制的创建.
8.& MSG_INIT消息响应
&&&& 主要是在interface.c中的Proc 函数中.
&&&&&& TCPMP包含的内容比较丰富,要研究透彻还需要花很多功夫,继续努力中...
相关解决方法
你也许会喜欢
Web前端&&热门解决方法
Web前端&&最新解决方法
Web前端&&随机解决方法
诚心交换友情链接:qq:

我要回帖

更多关于 truecrypt 源码 的文章

 

随机推荐