编辑推荐

  

  《Windows核心编程》是一本经典的Windows核心编程指南,从第1版到第5版,引领着数十万程序员走入Windows开发阵营,培养了大批精英。Windows核心编程(第5版)针对WindowsXP,WindowsVista和WindowsServer2008全面修订。主题广泛,内容丰富,讲解深入而精辟。透过这本Windows编程经典,我们可以在专家的悉心指导下,洞悉Windows编程精华,深入了解高级编程技巧,编写出高性能的Windows应用程序。

内容简介

  《Windows核心编程(第5版)》是为打算理解Windows的C和C++程序员精心设计的,作为Windows开发人员的必备参考。第5版全面覆盖WindowsXP,WindowsVista和WindowsServer2008中的170个新增函数和Windows特性。书中还讲解了Windows系统如何使用这些特性,我们开发的应用程序又如何充分使用这些特性,如何自行创建新的特性。
  《Windows核心编程(第5版)》重要主题:
  如何为32位和64位Windows系统构建和实现应用程序;
  如何新建和处理进程与作业;
  如何调度.管理、同步和销毁线程;
  如何通过I/O完成端口执行同步和异步设备I/O操作;
  如何使用虚拟内存、内存映射文件和堆之类的各种技术来分配内存;
  如何处理默认调拨的线程栈物理存储;
  如何为延迟加载、API拦截和进程注入构建DLL;
  如何使用结构化异常处理、Windows错误恢复和应用程序重启等机制。
  《微软技术丛书》包括以下几个子系列:
  从入门到精通:适合新手程序员的实用教程;侧重于基础技术和特征;提供范例文件。
  技术内幕:专业、必备的参考大全;包含丰富、实用的范例代码;帮助读者熟练掌握微软件技术。
  高级编程:侧重于高级特性、技术和解决问题;包含丰富、适用性强的范例代码;帮助读者精通微软技术。
  精通&宝典:着重剖析应用技巧,以帮助提高工作效率;主题包括办公应用和开发工具。
  认证考试教材:完全根据考试要求来阐述每一个知识点;提供可供搜索的Ebook(英文版)和训练题;提供实际场景、案例分析和故障诊断实验。

作者简介

  JeffreyRichter是Wintellect公司的创始人之一,该公司从事培训,调试和咨询,致力于帮助其他公司以更快的速度开发出更优秀的软件。他著作颇丰,代表作有畅销书CLRviaC#。他还是MSDNMagazine的特约编辑和专栏作家。

  ChristopheNasarre是BusinessObjicts的软件架构师和开发部门领导,该公司致力于帮助其他企业更好地专注于其主营业务,通过商业智能方案来提升决策能力和业绩。他为Aiddison-Wesley,APress和MicrosoftPress出版的许多图书担任过技术审校,。此外,他还是MSDNMagazine的撰稿人。

  葛子昂,1998年毕业于南京理工大学计算机系,曾先后任职于上海育碧电脑软件有限公司和上海旭上电子有限公司,从事游戏软件的开发及图形处理器的设计。2005年加入微软中国研发集团/服务器与开发工具事业部至今,一直致力于WindowsCommunicationFoundation及相关领域的研发。代表译著有《NET设计规范》。

  周靖,1983年接触苹果机开始,“浸染”IT业数十年,涉猎广泛,具有深厚的技术功底和良好的文学素养。早期痴迷于硬件,曾担任《微型计算机》杂志特约作者多年。继而潜心钻研编程,并乐在其中,积累了丰富的经验。其翻译风格严谨、准确、朴实、流畅,深受读者欢迎。代表译著有《c++面向对象程序设计》(国内销量超过3万册)和《c#高级程序员指南》等。

  廖敏,毕业于上海交通大学软件学院并获硕士学位,目前在微软中国研发集团/服务器与开发工具事业部担任软件设计工程师。

精彩书评

  无论是Windows编程新手,还是完全用本机代码来编程或通过P/Invoke来调用,NETFramework未提供的API的老手,都会发现《Windows核心编程》的价值。
  ——MarkRussinovich,《深入解析Windows操作系统》作者

  要想在Windows编程方面更上一层楼,迟早都需要好阅读并领会《Windows核心编程》的内容。
  ——FrancisGlassborow,C/C++用户协会前主席

  搞Windows程序设计有两方面的资源是不可或缺的:一是MSDN,另一个便是《Windows核心编程》。
  ——侯捷,著名技术作家

目录

第1部分必备知识
第1章错误处理
1.1定义自己的错误代码
1.2ErrorShow示例程序

第2章字符和字符串处理
2.1字符编码
2.2ANSI字符和Unicode字符与字符串数据类型
2.3Windows中的Unicode函数和ANSI函数
2.4C运行库中的Unicode函数和ANSI函数
2.5C运行库中的安全字符串函数
2.5.1初识新的安全字符串函数
2.5.2在处理字符串时如何获得更多控制
2.5.3Windows字符串函数
2.6为何要用Unicode
2.7推荐的字符和字符串处理方式

2.8Unicode与ANSI字符串转换
2.8.1导出ANSI和UnicodeDLL函数
2.8.2判断文本是ANSI还是Unicode

第3章内核对象
3.1何为内核对象
3.1.1使用计数
3.1.2内核对象的安全性

3.2进程内核对象句柄表
3.2.1创建一个内核对象
3.2.2关闭内核对象

3.3跨进程边界共享内核对象
3.3.1使用对象句柄继承
3.3.2改变句柄的标志
3.3.3为对象命名
3.3.4终端服务命名空间

3.3.5专有命名空间
3.3.5复制对象句柄

第Ⅱ部分工作机制
第4章进程
4.1编写第一个Windows应用程序
4.1.1进程实例句柄
4.1.2进程前一个实例的句柄
4.1.3进程的命令行
4.1.4进程的环境变量
4.1.5进程的关联性
4.1.6进程的错误模式
4.1.7进程当前所在的驱动器和目录
4.1.8进程的当前目录
4.1.9系统版本

4.2CreateProcess函数
4.2.1pszApplicationName和pszCommandLine参数
4.2.2psaProcess,psaThread和bInheritHandles参数
4.2.3fdwCreate参数
4.2.4pvEnvironment参数
4.2.5pszCurDir参数
4.2.6psiStartInfo参数
4.2.7ppiProcInfo参数

4.3终止进程
4.3.1主线程的入口点函数返回
4.3.2ExitProcess函数
4.3.3TerminateProcess函数
4.3.4当进程中的所有线程终止时
4.3.5当进程终止运行时
4.4子进程

4.5管理员以标准用户权限运行时
4.5.1自动提升进程的权限
4.5.2手动提升进程的权限
4.5.3何为当前权限上下文
4.5.4枚举系统中正在运行的进程
4.5.5ProcessInformation示例程序

第5章作业
5.1对作业中的进程施加限制
5.2将进程放入作业中
5.3终止作业中的所有线程查询作业统计信息
5.4作业通知
5.6JobLab示例程序

第6章线程基础
6.1何时创建线程
6.2何时不应该创建线程
6.3编写第一个线程函数
6.4CreateThread函数
6.4.1psa参数
6.4.2cbStackSize参数
6.4.3pfnStartAddr和pvParam参数
6.4.4dwCreateFlags
6.4.5pdwThreadID7

6.5终止运行线程
6.5.1线程函数返回
6.5.2ExitThread函数
6.5.3TerminateThread函数
6.5.4进程终止运行时
6.5.5线程终止运行时
6.6线程内幕

6.7C/C++运行库注意事项
6.7.1用_beginthreadex而不要用CreateThread创建线程
6.7.2绝对不应该调用的C/C++运行库函数

6.8了解自己的身份
6.8.1将伪句柄转换为真正的句柄

第7章线程调度、优先级和关联性
7.1线程的挂起和恢复
7.2进程的挂起和恢复
7.3睡眠
7.4切换到另一个线程
7.5在超线程CPU上切换到另一个线程
7.6线程的执行时间
7.7在实际上下文中谈CONTEXT结构
7.8线程优先级
7.9从抽象角度看优先级
7.10优先级编程
7.10.1动态提升线程优先级
7.10.2为前台进程微调调度程序
7.10.3调度I/O请求优先级
7.10.4SchedulingLab示例程序
7.11关联性

第8章用户模式下的线程同步
8.1原子访问:Interlocked系列函数
8.2高速缓存行
8.3高级线程同步需要避免使用的一种方法
8.4关键段
8.4.1关键段:细节
8.4.2关键段和旋转锁
8.4.3关键段和错误处理
8.5Slim读/写锁

8.6条件变量
8.6.1Queue示例程序
8.6.2在停止线程时的死锁问题
8.6.3一些有用的窍门和技巧

第9章用内核对象进行线程同步
9.1等待函数
9.2等待成功所引起的副作用
9.3事件内核对象
9.4可等待的计时器内核对象
9.4.1让可等待的计时器添加APC调用
9.4.2计时器的剩余问题
9.5信号量内核对象

9.6互斥量内核对象
9.6.1遗弃问题
9.6.2互斥量与关键段的比较
9.6.3Queue示例程序
9.7线程同步对象速查表

9.8其他的线程同步函数
9.8.1异步设备I/O
9.8.2WaitForInputIdle函数
9.8.3MsgWaitForMultipleObjects(Ex)函数
9.8.4WaitForDebugEvent函数
9.8.5SignalObjectAndWait函数
9.8.6使用等待链遍历API来检测死锁

第10章同步设备I/O与异步设备I/O
10.1打开和关闭设备细看CreateFile函数
10.2使用文件设备
10.2.1取得文件的大小
10.2.2设置文件指针的位置
10.2.3设置文件尾

10.3执行同步设备I/O
10.3.1将数据刷新至设备
10.3.2同步I/O的取消

10.4异步设备I/O基础
10.4.1OVERLAPPED结构
10.4.2异步设备I/O的注意事项
10.4.3取消队列中的设备I/O请求

10.5接收I/O请求完成通知
10.5.1触发设备内核对象
10.5.2触发事件内核对象
10.5.3可提醒I/O
10.5.4I/O完成端口
10.5.5模拟已完成的I/O请求

第11章Windows线程池
11.1情形1:以异步方式调用函数
11.1.1显式地控制工作项
11.1.2Batch示例程序
11.2情形2:每隔一段时间调用一个函数
11.3情形3:在内核对象触发时调用一个函数
11.4情形4:在异步I/O请求完成时调用一个函数

11.5回调函数的终止操作
11.5.1对线程池进行定制
11.5.2得体地销毁线程池:清理组
第12章纤程

第Ⅲ部分内存管理
第13章Windows内存体系结构
13.1进程的虚拟地址空间
13.2虚拟地址空间的分区
13.2.1空指针赋值分区
13.2.2用户模式分区
13.3地址空间中的区域
13.4给区域调拨物理存储器
13.5物理存储器和页交换文件

13.6页面保护属性
13.6.1写时复制
13.6.2一些特殊的访问保护属性标志
13.7实例分析
13.8数据对齐的重要性

第14章探索虚拟内存
14.1系统信息
14.2虚拟内存状态
14.3NUMA机器中的内存管理
14.4确定地址空间的状态
14.4.1VMQuery函数
14.4.2示例程序:虚拟内存映射

第15章在应用程序中使用虚拟内存
15.1预订地址空间区域
15.2给区域调拨物理存储器
15.3同时预订和调拨物理存储器
15.4何时调拨物理存储器
15.5撤销调拨物理存储器及释放区
15.5.1何时撤销调拨物理存储器
15.5.2虚拟内存分配示例程序
15.6改变保护属性
15.7重置物理存储器的内容
15.8地址窗口扩展

第16章线程栈
16.1C/C++运行库的栈检查函数
16.2Summation示例程序

第17章内存映射文件
17.1映射到内存的可执行文件和DLL
17.1.1同一个可执行文件或DLL的多个实例不会共享静态数据
17.1.2在同一个可执行文件或DLL的多个实例间共享静态数据
17.1.3ApplicationInstances示例程序

17.2映射到内存的数据文件
17.2.1方法1:一个文件,一块缓存
17.2.2方法2:两个文件,一块缓存
17.2.3方法3:一个文件,两块缓存
17.2.4方法4:一个文件,零个缓存

17.3使用内存映射文件
17.3.1第1步:创建或打开文件内核对象
17.3.2第2步:创建文件映射内核对象
17.3.3第3步:将文件的数据映射到进程的地址空间
17.3.4第4步:从进程的地址空间撤销对文件数据的映射
17.3.5第5步和第6步:关闭文件映射对象和文件对象
17.6FileReverse示例程序
17.7用内存映射文件来处理大文件
17.8内存映射文件和一致性
17.9给内存映射文件指定基地址
17.10内存映射文件的实现细节

第18章堆
18.1进程的默认堆
18.2为什么要创建额外的堆
18.2.1对组件进行保护
18.2.2更有效的内存管理
18.2.3使内存访问局部化
18.2.4避免线程同步的开销
18.2.5快速释放

18.3如何创建额外的堆
18.3.1从堆中分配内存块
18.3.2调整内存块的大小
18.3.3获得内存块的大小
18.3.4释放内存块
18.3.5销毁堆
18.3.6在C++中使用堆
18.4其他堆函数

第Ⅳ部分动态链接库
第19章DLL基础
19.1DLL和进程的地址空间
19.2纵观全局
19.2.1构建DLL模块
19.2.2构建可执行模块
19.2.3运行可执行模块

第20章DLL高级技术
20.1DLL模块的显式载入和符号链接
20.1.1显式地载入DLL模块
20.1.2显式地卸载DLL模块
20.1.3显式地链接到导出符号

20.2DLL的入口点函数
20.2.1DLL_PROCESS_ATTACH通知
20.2.2DLL_PROCESS_DETACH通知
20.2.3DLL_THREAD_ATTACH通知
20.2.4DLL_THREAD_DETACH通知
20.2.5DllMain的序列化调用
20.2.6DllMain和C/C++运行库
20.3延迟载入DLL
20.4函数转发器
20.5已知的DLL
20.6DLL重定向
20.7模块的基地址重定位
20.8模块的绑定

第21章线程局部存储区
21.1动态TLS
21.2静态TLS0

第22章DLL注入和API拦截
22.1DLL注入的一个例子
22.2使用注册表来注入DLL
22.3使用Windows挂钩来注入DLL
22.4使用远程线程来注入DLL
22.4.1InjectLibrary示例程序
22.4.2ImageWalkDLL
22.5使用木马DLL来注入DLL
22.6把DLL作为调试器来注入
22.7使用CreateProcess来注入代码

22.8API拦截的一个例子9
22.8.1通过覆盖代码来拦截API0
22.8.2通过修改模块的导入段来拦截API
22.8.3LastMessageBoxInfo示例程序

第Ⅴ部分结构化异常处理
第23章终止处理程序
第24章异常处理程序与软件异常
24.1通过实例理解异常过滤程序和异常处理程序
24.1.1Funcmeister1函数
24.1.2Funcmeister2函数

24.2EXCEPTION_EXECUTE_HANDLER1
24.2.1一些有用的例子
24.2.2全局展开
24.2.3停止全局展开

24.3EXCEPTION_CONTINUE_EXECUTION
24.4EXCEPTION_CONTINUE_SEARCH0
24.5GetExceptionCode2
24.6GetExceptionInformation6
24.7软件异常

第25章未处理异常、向量化异常处理与C++异常
25.1UnhandledExceptionFilter函数详解
25.2即时调试
25.3电子表格示例程序
25.4向量化异常和继续处理程序
25.5C++异常与结构化异常的比较
25.6异常与调试器

第26章错误报告与应用程序恢复
26.1Windows错误报告控制台
26.2可编程的Windows错误报告
26.3对进程中所有的问题报告进行定制
26.4问题报告的创建与定制
26.4.1创建一个自定义的问题报告
26.4.2设置报告参数:WerReportSetParameter
26.4.3将小型转储文件放入报告:WerReportAddDump8
26.4.4将任意文件放入报告:WerReportAddFile9
26.4.5修改对话框文本:WerReportSetUIOption0
26.4.6提交错误报告:WerReportSubmit0
26.4.7关闭问题报告:WerReportCloseHandle
26.4.8CustomizedWER示例程序

26.5应用程序的自动重启与恢复
26.5.1应用程序的自动重启
26.5.2对应用程序恢复的支持
第Ⅵ部分
附录A构建环境
附录B消息处理宏、子控件宏和API宏
索引

精彩书摘

  第Ⅰ部分必备知识  第1章错误处理  1.1定义自己的错误代码  1.2ErrorShow示例程序  在深入讨论MicrosoftWindows提供的诸多特性之前,应该先理解各个Windows函数如何进行错误处理的。  调用Windows函数时,它会先验证我们传给它们的参数,然后再开始执行任务。如果传入的参数无效,或者由于其他原因导致操作无法执行,则函数的返回值将指出函数因为某些原因失败了。  ……

前言/序言

  Windows世界已经发生了许多变化,WindowsXP、Windows2003、Windowsvigta以及。WindowsServer2008相继推出。与之对应的,《Windows核心编程》(第5版)也与时俱进,针对最新的操作系统进行更新,为我们了解并发挥最新的平台特性提供了宝贵的指引。这是一本Windows系统编程的权威专著,许多年之前我就已经读过它的第4版;这是一本生动的教科书,它帮助我更深入地了解Windows系统;同时它又是一本参考书,在我开发’Windows应用程序的过程中遇到问题时,我会到《微软技术丛书:Windows核心编程(第5版)》中寻找答案。希望它同样能够为你答疑解惑,并解决你的实际问题。《微软技术丛书:Windows核心编程(第5版)》由葛子昂、周靖、廖敏共同翻译:第8~22章由葛子昂翻译,第1~6章由周靖翻译,第23~26章及附录由廖敏翻译,第7章由刘江友情客串翻译,《微软技术丛书:Windows核心编程(第5版)》由葛子昂最终审阅和统稿。鉴于时间和精力有限,一些翻译难免存在不足甚至错误之处,为此我建立了一份网上勘误表。如果读者发现任何错误,都可以通过该网页与我联系,一旦确认,我会立即将其更新到勘误表中。勘误表的网址为www.gesoftfactory.com/ge/WindowsViaCpp。
  最后,感谢Jeffrey和Christophe在《微软技术丛书:Windows核心编程(第5版)》翻译过程中不厌其烦地解答我的问题,核实并纠正英文版中发现的一些错误。感谢李劲松、王渊峰、张羿、孙展波、谭映辉以及孙祺对中文版的全部或部分章节进行了审阅并提出宝贵的意见。感谢潘爱民在百忙中抽空阅读部分译稿,并给以反馈。感谢妻儿和家人对我的理解和支持,《微软技术丛书:Windows核心编程(第5版)》的翻译工作占用了本应属于你们的时间,现在终于可以有更多时间来陪伴你们了。

其他推荐