琢石成器——Windows环境下32位彙编语言程式设计


琢石成器——Windows环境下32位彙编语言程式设计

文章插图
琢石成器——Windows环境下32位彙编语言程式设计【琢石成器——Windows环境下32位彙编语言程式设计】《琢石成器——Windows环境下32位彙编语言程式设计》是2009年由电子工业出版社出版社出版的图书,作者是罗云彬 。
基本介绍中文名:琢石成器——Windows环境下32位彙编语言程式设计
作 者:罗云彬 着
出 版 社:电子工业出版社
出版时间: 2009-6-1
页 数:756页
开 本:16开
ISBN :9787121086632 
定价:89.00元(含光碟1张)
编辑推荐本书从编写应用程式的角度,从简单的例子开始到编写多执行绪、注册表和网路通信等複杂的程式,通过70多个实例逐步深入Win32彙编语言编程的方方面面 。宣传语畅销书《Windows环境下32位彙编语言程式设计》升级版 。内 容 简 介Windows环境下32位彙编语言是一种全新的程式语言 。它使用与C++语言相同的API接口,不仅可以开发出大型的软体,而且是了解作业系统运行细节的最佳方式 。本书作者罗云彬拥有十余年彙编语言编程经验,是彙编编程网站的创办者 。本书是作者多年来编程工作的总结,适合于欲通过Win32彙编语言编写Windows程式的读者 。前言从Windows出现开始,彙编语言似乎在慢慢地销声匿迹,但本书可以让人放弃这个观点,其实在Win32环境下,彙编语言依然强大 。Why——为什幺选择Win32彙编选择Win32彙编的理由是什幺呢?在DOS时代,学习彙编就是学习系统底层编程的代名词,仅要成为一名入门级的彙编程式设计师,就需要学习从CPU结构、CPU工作方式、各种硬体的编程方法到DOS工作方式等範围很广的知识 。随着Windows时代的到来,Windows像一堵巨大的墙,把我们和计算机的硬体隔离开 。对于DOS的彙编程式设计师来说,就像在一夜之间,我们发现自己曾经学过的几乎所有的东西都被Windows封装到核心中去了,由于保护模式的存在,我们又无法像在DOS下那样闯入系统核心为所欲为 。在Windows下用任何语言编程都必须遵循Windows的规範,彙编也不例外,也就是说,彙编不再是一种“有特权”的语言 。面对汹涌而来的Visual C++,Visual Basic,PowerBuilder和Java等各个领域的猛将,从DOS时代“为所欲为”的“系统警察”岗位下岗,在其他领域又没有一技之长,彙编语言似乎失去了生存的意义,有很多人在DOS转向Windows的时候放弃了彙编语言 。但是经过短暂的失落,摆正了自己在系统中的位置,我们发现从“系统警察”转换到遵循Windows规範的“好市民”后,彙编语言又慢慢地在这个世界流行起来了 。毕竟,不能为所欲为也可以有好的一面,我们可以不必再考虑一些老大难的问题,如程式运行时会面对什幺样的显示卡,如何驱动不同的印表机,记忆体不够了如何用磁碟交换,等等 。我们也可以在了解更少硬体知识的情况下就可以掌握Win32的彙编编程 。而且,我们惊喜地发现,做了“好市民”以后,我们反而拥有了和其他语言同样的权利——为了做图形和界面等方面的功能,彙编程式设计师在DOS时代连做梦都在羡慕C语言庞大的函式馆,而现在,Windows为我们提供了比这还要多得多的函式,以至于其他大部分语言可以做出来的功能,彙编都可以做,而其他语言做不到的功能,彙编照样可以做!所以这就是理由之一:Win32彙编可以当做一种功能强大的开发语言使用,使用它完全可以开发出大型的软体来 。正因为Win32彙编看上去不再那样低级,于是有读者曾经提出:Win32彙编讲的都是用API来写程式,和高级语言差不多,以前在DOS下使用的中断什幺的都不能用,所以没有什幺新奇的了 。还有读者认为本书只不过是MSDN的彙编版本而已 。言下之意就是:学彙编就是为了了解高级语言底下一层的功能,但现在Win32彙编却使用和C++等语言相同的API接口,既然和高级语言处于同一个级别,我们为什幺还要去和机器指令打交道呢,还不如去学Visual C++方便 。但是我们可以这样问一问自己:问:在DOS彙编中我们为什幺用中断功能?答:为了使用DOS核心提供的功能 。问:在DOS中我们常常自己用操作I/O连线埠的方法读写硬碟或操作显示卡吗?答:不,我们用系统提供的int 13h和int 10h 。……同样,在Win32彙编里使用API也是为了使用Windows核心提供的功能 。只不过使用的方式不再是中断方式而已,这不是Win32彙编语言“高级化”了,而是高级语言因为使用Windows的API接口而“低级化”了,其代价就是无法移植到其他系统,用Visual C++写的程式是无法移植到其他作业系统平台上的,只有和平台无关的ANSI C++等才能算是真正意义上的高级语言 。其实,任何彙编语言都是和作业系统密切相关的,不管是DOS彙编、Win32彙编,还是Linux彙编,都是基于特定的作业系统的,如果一定要绕过作业系统,那幺就不会有DOS彙编和Win32彙编的区别了,但是这样的话我们不是在学彙编,而是在自己开发作业系统 。高级语言在不同的作业系统上看起来都差不多,但作为一种低级语言,不同作业系统上的彙编就是不同的世界 。所以,既然Windows和DOS是两个完全不同的作业系统,我们就必须抛弃DOS彙编中的大部分概念从头开始学习Win32彙编 。这就是理由之二:Win32彙编是Windows环境下一种全新的程式语言 。Win32环境下的很多高级语言,如Visual C++和Visual Basic等,一如既往地对实现的细节进行了或深或浅的封装,就连最能表现Windows特徵的部分,如讯息循环和多执行绪的处理等内容也都被隐藏封装,使我们在使用它们进行可视化编程的同时,无法全面了解Win32程式运行的具体方式 。在学习Win32彙编以后,这些隐藏在高级语言后面的细节就暴露出来了 。由于封装的关係,各种高级语言或多或少存在某种“缺陷”,比如VB不支持指针,结果很多需要使用指针的API用起来就很不方便,像多执行绪一类的特徵在VB中就无法实现,PowerBuilder也是如此;C语言已经是最灵活的高级语言了,但还是无法在代码级别处理某些需求;而彙编语言见到的是一个最真实的作业系统,它可以用最灵活的方式使用各种系统功能,第13章中有关进程隐藏的内容就是最好的写照 。所以理由之三就是:使用Win32彙编语言是了解作业系统运行细节的最佳方式 。最后的理由根本不是理由,而是必然的选择,当我们在Windows环境下进行加密解密、逆向工程,还有病毒、木马等有害代码的分析和防治工作时,Win32彙编是唯一的选择 。在任何讨论这方面内容的书籍中,彙编代码的篇幅总是很大的 。因此,要想深入了解这些内容的前提就是深入彙编编程 。How——如何学习Win32彙编以往的彙编书籍往往把重点放在硬体结构和指令上,讲述了一大堆电路框图和指令列表,把大家搞得晕晕乎乎后,再举出一些重量级的例子,不是一些像数组、矩阵计算一类的複杂运算,就是开始图形模式画图,以至于大家看完以后就再也找不到北了!实际上,这些例子不是太难了,而是太枯燥了 。有人说,学彙编就像考大学,千军万马过独木桥,太多的人中途放弃了,只有少数人坚持到最后 。笔者认为:学习彙编应该在轻鬆的环境下进行,在学习中使用的例子不一定太複杂,但一定要有吸引力 。用彙编写複杂的运算程式固然会比C更有效率,但同样的事在C中用一个表达式就全部搞定了,从这里开始学彙编,给人的感觉就像从複杂的公式开始学算术,要知道,加法还没有学会呢!而对于高级语言封装起来的系统功能,用彙编解释起来就非常直接,非常自然,也更容易懂 。以笔者自己学彙编的过程来说,那时候是1990年,刚好是中国第一次病毒大流行,大家的计算机上都是那个病毒的开山鼻祖——桌球病毒,在流行DOS的时期,看着在萤幕上蹦的小球,心中就有一个问题:如何编出这样一个玩意来呢?要知道DOS是单任务的,而那个球在别的程式运行的时候照样蹦!这用当时流行的FORTRAN、C等课程中学到的任何知识都无法解释,因为这些课程中不可能有TSR、中断、引导区等内容 。带着这样一个疑问学习彙编,在分析桌球病毒的过程中啃一条条不懂的指令,病毒分析完了,彙编课也学完了,而且反过来看那些複杂的计算程式都是那幺顺理成章,不攻自破了 。实际上,从一些实用的系统功能开始学习彙编远比学矩阵计算容易理解 。正如最经典的C程式就是那个“Hello,World!”一样,这个程式的有名并不是因为它用高深複杂的语句放倒了一大批人,而是它以最简单易懂的方式让人们走入C语言的大门 。对于Win32彙编也是如此,从最简单的例子开始总是没错的,笔者建议读者跟随本书中从简到繁的例子,努力做到理解并灵活引用这些例子中的各种功能,正如“熟读唐诗三百首,不会写诗也会吟”,最后能够熟练地使用Win32彙编来解决各种编程需求就是最大的胜利 。另外,正如前面讲到的,彙编语言的学习必须和作业系统紧密结合 。经过简单的调查,笔者发现很多高校使用的彙编教程还是停留在清华91版《IBM-PC彙编语言程式设计》之类的教材上,虽然这些教材中基础知识部分永远不会过时,但涉及作业系统的部分还是停留在DOS阶段 。随着DOS作业系统的悄然引退,继续把精力花在上面是一种浪费,因为任何语言都必须有套用的平台,否则课程学完之后会尴尬地发现没有地方可以套用 。笔者认为,在《IBM-PC彙编语言程式设计》之类传统教材中的基础部分学习完毕以后,重点就应该转向Win32彙编,以及保护模式方面的知识 。关于本书的内容本书尝试从编写应用程式的角度,从“Hello,World”这个简单的例子开始到编写多执行绪、注册表和网路通信等複杂的程式,通过70多个从简单到複杂的例子,逐步深入Win32彙编编程的方方面面 。笔者从事彙编编程已经有十几年的历史了,从8086时代的DOS彙编编程开始到当前的Win32彙编编程,从一个初学者到现在能利用Win32彙编来解决大部分编程需求,中间也经过了很长时间的摸索和大量的挫折,所以笔者很清楚初学者在哪些地方会遇到问题,但是涉及Win32彙编的书籍却实在太少了 。正是因为如此,笔者决心把本书的目标定为:能让读者入门并在最后能熟练掌握Win32彙编编程,而不是那种深入系统奥秘一类的书籍 。从这个目标出发,本书的选材中儘量去掉已经有其他书籍详细讨论的部分,因为要一本书涉及全部方面是不现实的 。内容全面就必然不精,内容深刻就必须围绕一个中心点,所以本书的内容并不详细讨论一般彙编教材的基础部分,如处理器结构和保护模式等,也不準备涉及Windows驱动程式、COM编程或者其他能够冠以“密技”头衔的内容 。本书主要的内容将放在32位宏彙编对比DOS彙编所不同的部分,以及Win32应用程式的彙编实现上 。不求全面,只求精也!(说句老实话,也不敢对自己不精通的地方妄加评论,以免破坏自己的良好形象 。? )在一些彙编编程论坛上,经常有初学者问到MASM和TASM有什幺不同,用哪个比较好,@@标号是什幺意思,为什幺用下载的彙编编译器无法编译程式等问题,虽然这些都属于最基本的问题,但是以前的确没有一个地方或者有一本书能系统全面地讲解这些问题 。本书的基础篇就是因此而设,它们是:● 第1章 背景知识● 第2章 準备编程环境● 第3章 使用MASM当搭建编译环境和对编译器的使用不再成为绊脚石的时候,初学者的问题往往集中在对Windows程式结构的迷惑上,讯息驱动体系、视窗过程、与硬体隔绝的图形接口及资源档案等相对于DOS程式来说都是全新的内容 。接下来的4章将深入讨论这些内容,通过这几章,读者应该开始习惯以Windows的方式考虑问题了(脑海中的DOS逐渐远去……),这就是本书的初级篇: ● 第4章 第一个视窗程式● 第5章 使用资源● 第6章 定时器和Windows时间● 第7章 图形操作Windows系统不像DOS系统,它的应用程式界面是规範化的,统一的界面来自大量统一的界面控制项,学习这些控制项就等于学习如何编写Windows界面 。下面的界面篇中的两章将探讨这方面的内容:● 第8章 通用对话框● 第9章 通用控制项学到这里为止,读者应该可以写出界面规範的标準的Win32程式了 。但还是无法用这些程式来解决一些具体问题,因为有关Windows系统的高级特徵的介绍还没有开始,如记忆体管理、档案操作和多执行绪等 。这些就是本书系统篇中将要介绍的内容,通过这些内容,读者将比较深入地了解Windows的工作方式:● 第10章 记忆体管理和档案操作● 第11章 动态程式库和钩子● 第12章 多执行绪● 第13章 进程控制● 第14章 异常处理相信到这里为止,读者对Windows的了解已经比较系统了 。虽然Windows中还存在其他很多方面的内容,如管道,邮件槽,如何写控制台程式、萤幕保护程式和驱动程式等 。但是有了前面的基础以后,读者自己去了解这些内容就不成问题了,因为掌握了“渔”,得到“鱼”又有什幺困难呢?在最后的几章中,本书将从套用的角度再补充介绍一些常用的网路编程、注册表、PE档案和资料库操作方面的内容,这就是套用篇:● 第15章 注册表和INI档案● 第16章 WinSock接口和网路编程● 第17章 PE档案● 第18章 ODBC资料库编程在本书中,笔者特别以显着的方式标出了一些经验之谈,这些是笔者在长期的彙编编程中得到的体会,可能是任何一本教科书或者手册里都没有的 。希望这些能给读者带来帮助!用“灯泡”标出的部分表示一些小技巧,可以对编程的理解有促进作用 。用“惊叹号”标出的部分表示容易出错的部分,可以帮助读者避免一些难以理解的错误 。对读者的假设有了内容的定位,读者的定位也就比较清楚了,本书适合于以下读者:● 想用Win32彙编写Windows应用程式的读者 。● 想从DOS下的16位彙编转向Windows下32位彙编的读者 。● 欲了解Win32彙编,以便为Windows下的加密解密、系统安全、逆向工程等方面打基础的读者 。● 欲了解Win32彙编,以便为用彙编写Windows驱动程式打基础的读者 。● 正在学习彙编课程,需要补充彙编课程中Win32部分的学生 。在开始本书之前,读者应该有以下的基础知识:● 计算机的基础知识,如进制转换、逻辑运算、变数类型和指针的概念等 。● 数据结构的基础知识,因为Win32编程涉及大量的数据结构 。● C语言的基础知识,因为Win32编程的绝大部分参考资料都是以C的格式出现的 。● Intel 80x86处理器的基础知识,如定址方式和指令的使用等 。本书并不是为以下读者準备的:● 欲详细了解保护模式的读者——因为Windows并不是一个开放的平台,Windows的开放只限于应用程式接口,所以要用Windows做背景研究保护模式只能是自讨苦吃,如果读者需要深入了解这方面的内容,最好的方法就是去研究Linux的核心代码并在Linux上实验 。● 欲了解Windows核心“机密”的读者——彙编并不等同于深入作业系统的内部,所以本书不是《Windows核心分析》 。而真正意义上的《Windows核心分析》除了Microsoft,恐怕谁也写不出来 。● 欲了解Windows驱动程式编写的读者——要介绍清楚Windows驱动程式,需要的篇幅绝不会亚于本书的篇幅,本书不打算涉及这方面的内容,读者有兴趣的话,可以阅读《Programming WDM》和《System Programming for Windows 95》等书,前者讲述的是Windows 2000/Windows NT下的WDM驱动程式,后者讲述的是Windows 9x下的VxD驱动程式 。第3版有什幺新的内容本书第1版出版至今已经6年多了,第2版出版至今也已经3年了,期间笔者收到了大量的读者来信,对本书提出了各种意见和建议,综合各种方面的考虑,本书的第3版做了以下改进 。● 对第2版中已知的错误进行了修正,包括一些排版错误、错别字和例子中的Bug 。● 对一些过时的内容进行了更新或者删除 。● 根据读者的反馈,对部分章节进行了重写 。关于附书代码和读者反馈为了更好地说明Win32彙编的编程方法,本书附带了70多个例子,这些例子的原始码全部可以在附书光碟中找到,代码全部採用MASM格式编写,推荐使用的编译软体为MASM32 SDK软体包 。本书中的例子代码已经经过了严格的防病毒测试,绝对不含任何病毒,但第11章的例子涉及钩子技术,第17章的例子涉及对PE档案进行操作,其中的小段代码与一些木马和病毒的特徵码类似,以至于被一些防毒软体误认为有未知病毒,请读者放心使用,不必顾虑 。虽然本书中所有的例子代码都已经在Windows 98、Windows 2000、Windows XP和Windows Vista下测试通过,但也有存在Bug的可能,如果发现代码存在错误或者发现书中有其他问题,请告知作者,以便在下一个版本中改进 。如果读者有任何的反馈意 见——不管是批评还是鼓励,都请和作者联繫,请访问作者网站获取最新有效的E-mail地址 。罗云彬致谢首先感谢我的父母亲,如果没有你们从小到大对我的培养,就没有这一切 。也感谢我的妹妹,在很多关键的时候,你总是给予我很多的帮助 。感谢我的妻子小猪猪,在本书创作的时候,没有你的理解和支持,我不可能完成这样一部作品;在本书发行后的日子里,要不是你将逛街、买衣服、旅游的时间慷慨地贡献出来,并盯紧四处乱跑的小宝宝,本书就不会有多次再版的机会 。感谢我的母校浙江大学,浙大“求是创新”的校训,“实事求是、严谨踏实、奋发进取、开拓创新”的校风让我能够有一个好的学习习惯,让我在毕业以后的这幺多年里能够始终有一种动力去学习最新的知识 。感谢电子工业出版社博文视点资讯有限公司的郭立老师和李冰编辑,你们的支持、鼓励和专业的指点使本书能够按照进度按时完成 。非常高兴看到本书的再版,本书的前2个版本取得了累计销量达到40000册的好成绩,从本书的第1版发行到现在,我收到了很多读者和网友的反馈,使本书更加完善 。在第3版发行之际,再次感谢你们对我的关心和爱护,也感谢你们为我提了很多宝贵的意见和建议 。罗云彬目 录基础篇第1章 背景知识 11.1 Win32的软硬体平台 11.1.1 80x86系列处理器简史 11.1.2 Windows的历史 31.1.3 Win32平台的背后——1.1.3 Wintel联盟 51.2 Windows的特色 61.3 必须了解的基础知识 71.3.1 80x86处理器的工作模式 71.3.2 Windows的记忆体管理 91.3.3 Windows的特权保护 17第2章 準备编程环境 212.1 Win32执行档的2.1 开发过程 212.2 编译器和连结器 232.2.1 MASM系列 232.2.2 TASM系列 272.2.3 其他编译器 282.2.4 MASM,TASM还是2.2.4 NASM 292.2.5 我们的选择——MASM322.2.5 SDK软体包 302.3 创建资源 312.3.1 资源编译器的使用 312.3.2 所见即所得的资源编辑器 322.4 make工具的用法 342.4.1 make工具是什幺 342.4.2 nmake的用法 352.4.3 描述档案的语法 362.5 获取资料 392.5.1 Windows资料的来源 402.5.2 Intel处理器资料 422.6 构建编程环境 422.6.1 IDE还是命令行 422.6.2 本书推荐的工作环境 432.6.3 尝试编译第一个程式 44第3章 使用MASM 463.1 Win32彙编源程式的结构 463.1.1 模式定义 483.1.2 段的定义 503.1.3 程式结束和程式入口 533.1.4 注释和换行 533.2 调用API 543.2.1 API是什幺 543.2.2 调用API 563.2.3 API参数中的等值定义 603.3 标号、变数和数据结构 623.3.1 标号 623.3.2 全局变数 643.3.3 局部变数 653.3.4 数据结构 683.3.5 变数的使用 703.4 使用子程式 743.4.1 子程式的定义 753.4.2 参数传递和堆叠平衡 763.5 高级语法 793.5.1 条件测试语句 793.5.2 分支语句 803.5.3 循环语句 823.6 代码风格 853.6.1 变数和函式的命名 853.6.2 代码的书写格式 873.6.3 代码的组织 88初级篇第4章 第一个视窗程式 894.1 开始了解视窗 894.1.1 视窗是什幺 89 4.1.2 视窗界面 904.1.3 视窗程式是怎幺工作的 924.2 分析视窗程式 984.2.1 模组和句柄 984.2.2 创建视窗 1004.2.3 讯息循环 1074.2.4 视窗过程 1094.3 视窗间的通信 1144.3.1 视窗间的讯息互发 1144.3.2 在视窗间传递数据 1174.3.3 SendMessage和4.3.3 PostMessage函式的区别 118第5章 使用资源 1195.1 选单和加速键 1205.1.1 选单和加速键的组成 1205.1.2 选单和加速键的资源定义 1215.1.3 使用选单和加速键 1265.2 图示和游标 1385.2.1 图示和游标的资源定义 1395.2.2 使用图示和游标 1395.3 点阵图 1435.3.1 点阵图简介 1435.3.2 在资源中定义点阵图 1445.4 对话框 1455.4.1 对话框简介 1455.4.2 对话框的资源定义 1475.4.3 使用对话框 1495.4.4 在对话框中使用子5.4.4 视窗控制项 1525.5 字元串资源 1745.6 版本信息资源 1765.6.1 版本信息资源的定义 1765.6.2 在程式中检测版本信息 1795.7 二进制资源和自定义资源 1805.7.1 使用二进制资源 1805.7.2 使用自定义资源 181第6章 定时器和Windows时间 1836.1 定时器 1836.1.1 定时器简介 1836.1.2 定时器的使用方法 1846.2 Windows时间 1886.2.1 Windows时间的获取和6.2.1 设定 1886.2.2 计算时间间隔 189第7章 图形操作 1917.1 GDI原理 1917.1.1 GDI程式的结构 1927.1.2 设备环境 1957.1.3 色彩和坐标 2017.2 绘製图形 2037.2.1 画笔和画刷 2117.2.2 绘製像素点 2147.2.3 绘製图形 2147.2.4 绘图模式 2187.3 创建和使用点阵图 2207.3.1 一个使用点阵图的时钟例子 2207.3.2 创建和使用点阵图 2307.3.3 使用设备无关点阵图 2317.4 块传送操作 2337.4.1 块传送方式 2337.4.2 块传送函式 2347.5 区域和路径 2397.5.1 使用区域 2397.5.2 使用路径 241界面篇第8章 通用对话框 2438.1 通用对话框简介 2438.2 使用通用对话框 2508.2.1 “打开”档案和“保存” 8.2.1 档案对话框 2508.2.2 字型选择对话框 2528.2.3 “颜色选择”对话框 2548.2.4 “查找”和“替换”文本8.2.4 对话框 2558.2.5 “页面设定”对话框 2588.2.6 “浏览目录”对话框 259第9章 通用控制项 2609.1 通用控制项简介 2609.1.1 通用控制项的分类 2609.1.2 使用通用控制项 2629.2 使用状态栏 2669.2.1 创建状态栏 2719.2.2 状态栏的控制讯息 2729.2.3 在状态栏上显示选单9.2.3 提示信息 2749.3 使用工具列 2759.3.1 创建工具列 2829.3.2 工具列的控制讯息 2859.3.3 工具列的通知讯息 2889.4 使用Richedit控制项 2919.4.1 创建Richedit控制项 3039.4.2 Richedit控制项的控制讯息 3059.4.3 Richedit控制项的通知讯息 3149.5 视窗的子类化 3159.5.1 什幺是视窗的子类化 3159.5.2 视窗子类化的实现 3169.6 控制项的超类化 3229.6.1 什幺是控制项的超类化 3229.6.2 控制项超类化的实现 323系统篇第10章 记忆体管理和档案操作 32710.1 记忆体管理 32710.1.1 记忆体管理基础 32710.1.2 记忆体的当前状态 32810.1.3 标準记忆体管理函式 33010.1.4 堆管理函式 33510.1.5 虚拟记忆体管理函式 33910.1.6 其他记忆体管理函式 34410.2 档案操作 34510.2.1 Windows的档案I/O 34510.2.2 创建和读写档案 34610.2.3 查找档案 35710.2.4 档案属性 36410.2.5 其他档案操作 36610.3 驱动器和目录 36710.3.1 逻辑驱动器操作 36810.3.2 目录操作 37110.4 记忆体映射档案 37310.4.1 记忆体映射档案简介 37410.4.2 使用记忆体映射档案 376第11章 动态程式库和钩子 38411.1 动态程式库 38411.1.1 动态程式库的概念 38411.1.2 编写动态程式库 38511.1.3 使用动态程式库 39111.1.4 动态程式库中的数据11.1.4 共享 40011.1.5 在VC++中使用动态11.1.5 程式库 40111.2 Windows钩子 40411.2.1 什幺是Windows钩子 40411.2.2 远程钩子的安装和使用 406 11.2.3 日誌记录钩子 414第12章 多执行绪 41812.1 进程和执行绪 41812.2 多执行绪编程 41912.2.1 一个单执行绪的“问题12.2.1 程式” 41912.2.2 多执行绪的解决方法 42312.2.3 与执行绪有关的函式 42712.3 使用事件对象控制执行绪 43112.3.1 事件 43212.3.2 等待事件 43312.3.3 进一步改进计数程式 43412.4 执行绪间的同步 43712.4.1 产生同步问题的原因 43712.4.2 各种用于执行绪间同步12.4.2 的对象 442第13章 过程控制 45013.1 环境变数和命令行参数 45013.1.1 环境变数 45013.1.2 命令行参数 45313.2 执行执行档 45813.2.1 方法一:Shell调用 45813.2.2 方法二:创建进程 46013.3 进程调试 46913.3.1 获取运行中的进程句柄 46913.3.2 读写进程的地址空间 47513.3.3 调试API的使用 48013.4 进程的隐藏 48913.4.1 在Windows 9x中隐藏13.4.1 进程 48913.4.2 Windows NT中的远程13.4.2 执行绪 491第14章 异常处理 50314.1 异常处理的用途 50314.2 使用筛选器处理异常 50414.2.1 注册回调函式 50414.2.2 异常处理回调函式 50614.3 使用SEH处理异常 51014.3.1 注册回调函式 51214.3.2 异常处理回调函式 51314.3.3 SEH链和异常的传递 51614.3.4 展开操作(Unwinding) 518套用篇第15章 注册表和INI档案 52215.1 注册表和INI档案简介 52215.2 INI档案的操作 52315.2.1 INI档案的结构 52315.2.2 管理键值 52515.2.3 管理小节 53215.2.4 使用不同的INI档案 53315.3 对注册表的操作 53415.3.1 注册表的结构 53415.3.2 管理子键 53615.3.3 管理键值 54715.3.4 子键和键值的枚举 54815.3.5 注册表套用举例 551第16章 WinSock接口和网路编程 55516.1 Windows Socket接口简介 556 16.2 Windows Socket接口的16.2 使用 55916.2.1 IP位址的转换 55916.2.2 套接字 56316.2.3 网路应用程式的一般16.2.3 工作流程 56616.2.4 监听、发起连线和16.2.4 接收连线 56916.2.5 数据的收发 57216.2.6 一个最简单的TCP服务16.2.6 端程式 57516.3 TCP应用程式的设计 58116.3.1 通信协定和工作执行绪16.3.1 的设计 58116.3.2 TCP聊天室例子——16.3.2 伺服器端 59116.3.3 TCP聊天室例子——16.3.3 客户端 59816.3.4 以非阻塞方式工作的16.3.4 TCP聊天室客户端 60616.3.5 其他常用函式 617第17章 PE档案 62117.1 PE档案的结构 62117.1.1 概论 62117.1.2 DOS档案头和DOS块 62217.1.3 PE档案头(NT17.1.3 档案头) 62417.1.4 节表和节 62917.2 导入表 64417.2.1 导入表简介 64417.2.2 导入表的结构 64617.2.3 查看PE档案导入表举例 64917.3 导出表 65117.3.1 导出表的结构 65217.3.2 查看PE档案导出表举例 65517.4 资源 65817.4.1 资源简介 65817.4.2 资源的组织方式 65917.4.3 查看PE档案中的资源17.4.3 列表举例 66217.5 重定位表 66717.5.1 重定位表的结构 66717.5.2 查看PE档案的重定17.5.2 位表举例 67017.6 套用实例 67217.6.1 动态获取API入口地址 67217.6.2 在PE档案上添加执行17.6.2 代码 679第18章 ODBC资料库编程 68818.1 基础知识 68818.1.1 资料库接口的发展历史 68818.1.2 SQL语言 69118.1.3 ODBC程式的流程 69318.2 连线资料库 69418.2.1 连线和断开资料库 69418.2.2 连线字元串 70018.3 数据的管理 70318.3.1 执行SQL语句 70318.3.2 执行结果的处理 70818.3.3 获取结果集中的数据 71018.3.4 事务处理 71518.4 资料库操作的例子 71718.4.1 结果集处理模组 71818.4.2 例子的原始码 723参考文献 734