自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(4)
  • 资源 (1)
  • 收藏
  • 关注

原创 汇编语言学习笔记4(王爽)

[BX]和Loop BX [bx]类似[0]也表示一个内存单元,偏移地址默认在ds中。eg:mov ax,[bx]表示将长度为2个字节的内存单元内容送人ax, mov al,[bx]表示将长度为1个字节的内存单元内容送人ax。 Loop loop指令格式:CPU执行到loop指令时,要进行两步:cx中值减一;判断cx值,不为零则转至编号处执行。eg:s为标志  ass

2018-01-24 11:25:26 216 1

原创 汇编语言学习笔记3(王爽)

内存字的储存 一个字=两个字节,即一个字需要两个内存单元储存。高地址放高位字节,低地址放低位字节。8086CPU为16位结构,有16位数据线,一次性可传输16位数据,也就是说对内存一次性操作两内存单元即为一个字。 DS寄存器 DS寄存器通常用来存放CPU要访问数据的段地址,[...](eg:[0])表示内存单元的偏移地址。 mov bx,1000H mov ds,bx mov

2017-11-18 12:42:50 319

原创 汇编语言学习笔记2(王爽)

概述 一个典型的CPU由运算器、控制器、寄存器等器件构成。 运算器进行信息处理; 寄存器进行信息存储; 控制器控制各种器件进行工作; 通用寄存器 8086CPU的所有寄存器都是16位的,AX、BX、EX、DX四个寄存器通常用来存放一般性的数据, 被称为通用寄存器。 8086CPU的AX、BX、EX、DX四个寄存器都可分为两个可独立使用的8位寄存器来用:AX可分为AH(高位)和AL

2017-11-14 10:08:22 263

原创 汇编语言学习笔记1(王爽)

基础知识 汇编产生 机器语言使用难以辨认和记忆,汇编指令相对来说更容易记忆。 CPU和储存器 一个CPU要能工作,则必须要向他提供指令和数据。指令和数据在储存器中存放,也就是内存。 储存器被划分为若干储存单元,每个单元从0开始编号,这些编号可以看作为储存单元在储存器中地址。CPU对储存器读写要考虑1:储存单元的地址(向哪里操作);2:读取还是写入(做什么);3:数据信息(要读取或写入的信

2017-11-13 15:05:02 198

windows核心编程带目录可复制电子版

windows核心编程电子版 可复制非扫描 原书名: Windows via C/C++ 原出版社: Microsoft Press 作者: (美)Jeffrey Richter Christophe Nasarre 译者: 葛子昂 周靖 廖敏 丛书名: 微软技术丛书 出版社:清华大学出版社 ISBN:9787302184003 上架时间:2008-9-23 出版日期:2008 年9月 开本:16开 页码:770 版次:5-1 编辑推荐   权威力作 再度新鲜亮相.    名著名 译 彰显经典魅力    中英联动 丰富阅读体验..    深刻剖析底层实现机理    直击Windows编程精髓... 内容简介   这是一本经典的windows核心编程指南,从第1版到第5版,引领着数十万程序员走入windows开发阵营,培养了大批精英。   作为windows开发人员的必备参考,本书是为打算理解windows的c和c++程序员精心设计的。第5版全面覆盖windows xp,windows vista和windows server 2008中的170个新增函数和 windows特性。书中还讲解了windows系统如何使用这些特性,我们开发的应用程序又如何充分使用这些特性,如何自行创建新的特性。 作译者 作者: Jeffrey Richter Jeffrey Richter是一位在全球享有盛誉的技术作家,尤其在Windows/.NET领域有着杰出的贡献。他的第一本Windows著作Windows 3: A Developer's Guide大获好评,从而声名远扬。之后, 他又推出了经典著作《Windows 高级编程指南》和《Windows核心编程》。如今这两本书早已成为Windows程序设计领域的颠峰之作,培育了几代软件开发设计人员。他的每一本新作问世,我 们都有理由相信这是一本巨著,我们想要的一切尽在其中。Jeffery 是Wintellect公司的创始人之一,也是MSDN杂志.NET专栏的特邀编辑。现在他正领导开发该公司的.NET程序设计课程,向 大众推广.NET技术。因为他自1999年开始就参与了微软.NET框架开发组的咨询工作,与这些一线人员一起经历了.NET的孕育与诞生,所以他对.NET思想的领悟、对.NET的细节熟稔,是其他任 何作家难以企及的。他是.NET著作领域中当之无愧的一面旗帜。 作者: Christophe Nasarre Christophe Nasarre是Business Objects的软件架构师和开发部门领导,该公司致力于帮助其他企业更好地专注于其主营业务,通过商业智能方案来提升决策能力和业绩。他为Addison- Wesley,APress和Microsoft Press出版的许多图书担任过技术审校,此外还是MSDN Magazine的撰稿人。 译者: 周靖 周靖 资深译者,在计算机行业“浸染”近二十年,涉猎广泛,具有深厚的技术功底和良好的文学素养。早期痴迷于硬件,曾多次被《微型计算机》杂志聘为特约作者。继而潜心钻研程序设计 ,并在这方面积累了丰富的经验。此后专职从事翻译。其翻译风格严谨、准确、朴实、流畅,深受读者欢迎。代表译著有《Windows Server 2003技术内幕》、《PC性能优化与升级技术》和《 Unix技术内幕》等。.. 目录 第ⅰ部分 必备知识  第1章 错误处理   1.1 定义自己的错误代码   1.2 errorshow示例程序  第2章 字符和字符串处理   2.1 字符编码   2.2 ansi字符和unicode字符与字符串数据类型   2.3 windows中的unicode函数和ansi函数   2.4 c运行库中的unicode函数和ansi函数   2.5 c运行库中的安全字符串函数    2.5.1 初识新的安全字符串函数    2.5.2 在处理字符串时如何获得更多控制    2.5.3 windows字符串函数   2.6 为何要用unicode   2.7 推荐的字符和字符串处理方式   2.8 unicode与ansi字符串转换    2.8.1 导出ansi和unicode dll函数    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.2 createprocess函数    4.2.1 pszapplicationname和pszcommandline参数    4.2.2 psaprocess,psathread和binherithandles参数    4.2.3 fdwcreate参数    4.2.4 pvenvironment参数    4.2.5 pszcurdir参数    4.2.6 psistartinfo参数    4.2.7 ppiprocinfo参数   4.3 终止进程    4.3.1 主线程的入口点函数返回    4.3.2 exitprocess函数    4.3.3 terminateprocess函数    4.3.4 当进程中的所有线程终止时    4.3.5 当进程终止运行时   4.4 子进程   4.5 管理员以标准用户权限运行时    4.5.1 自动提升进程的权限    4.5.2 手动提升进程的权限    4.5.3 何为当前权限上下文    4.5.4 枚举系统中正在运行的进程    4.5.5 process information示例程序  第5章 作业   5.1 对作业中的进程施加限制   5.2 将进程放入作业中   5.3 终止作业中的所有线程查询作业统计信息   5.4 作业通知   5.6 job lab示例程序  第6章 线程基础   6.1 何时创建线程   6.2 何时不应该创建线程   6.3 编写第一个线程函数   6.4 createthread函数    6.4.1 psa参数    6.4.2 cbstacksize参数    6.4.3 pfnstartaddr和pvparam参数    6.4.4 dwcreateflags    6.4.5 pdwthreadid7   6.5 终止运行线程    6.5.1 线程函数返回    6.5.2 exitthread函数    6.5.3 terminatethread函数    6.5.4 进程终止运行时    6.5.5 线程终止运行时   6.6 线程内幕   6.7 c/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.4 scheduling lab 示例程序   7.11 关联性  第8章 用户模式下的线程同步   8.1 原子访问:interlocked系列函数   8.2 高速缓存行   8.3 高级线程同步需要避免使用的一种方法   8.4 关键段    8.4.1 关键段:细节    8.4.2 关键段和旋转锁    8.4.3 关键段和错误处理   8.5 slim读/写锁   8.6 条件变量    8.6.1 queue示例程序    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.3 queue示例程序   9.7 线程同步对象速查表   9.8 其他的线程同步函数    9.8.1 异步设备i/o    9.8.2 waitforinputidle函数    9.8.3 msgwaitformultipleobjects(ex)函数    9.8.4 waitfordebugevent函数    9.8.5 signalobjectandwait函数    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.1 overlapped结构    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.4 i/o完成端口    10.5.5 模拟已完成的i/o请求  第11章 windows线程池   11.1 情形1:以异步方式调用函数    11.1.1 显式地控制工作项    11.1.2 batch示例程序   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.3 numa机器中的内存管理   14.4 确定地址空间的状态    14.4.1 vmquery函数    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.1 c/c++运行库的栈检查函数   16.2 summation示例程序  第17章 内存映射文件   17.1 映射到内存的可执行文件和dll    17.1.1 同一个可执行文件或dll的多个实例不会共享静态数据    17.1.2 在同一个可执行文件或dll的多个实例间共享静态数据    17.1.3 application instances示例程序   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.6 file reverse示例程序   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.1 dll和进程的地址空间   19.2 纵观全局    19.2.1 构建dll模块    19.2.2 构建可执行模块    19.2.3 运行可执行模块  第20章 dll高级技术   20.1 dll模块的显式载入和符号链接    20.1.1 显式地载入dll模块    20.1.2 显式地卸载dll模块    20.1.3 显式地链接到导出符号   20.2 dll的入口点函数    20.2.1 dll_process_attach通知    20.2.2 dll_process_detach通知    20.2.3 dll_thread_attach通知    20.2.4 dll_thread_detach通知    20.2.5 dllmain的序列化调用    20.2.6 dllmain和c/c++运行库   20.3 延迟载入dll   20.4 函数转发器   20.5 已知的dll   20.6 dll重定向   20.7 模块的基地址重定位   20.8 模块的绑定  第21章 线程局部存储区   21.1 动态tls   21.2 静态tls0  第22章 dll注入和api拦截   22.1 dll注入的一个例子   22.2 使用注册表来注入dll   22.3 使用windows挂钩来注入dll   22.4 使用远程线程来注入dll    22.4.1 inject library示例程序    22.4.2 image walk dll   22.5 使用木马dll来注入dll   22.6 把dll作为调试器来注入   22.7 使用createprocess来注入代码   22.8 api拦截的一个例子9    22.8.1 通过覆盖代码来拦截api0    22.8.2 通过修改模块的导入段来拦截api    22.8.3 last messagebox info示例程序 第ⅴ部分 结构化异常处理  第23章 终止处理程序  第24章 异常处理程序与软件异常   24.1 通过实例理解异常过滤程序和异常处理程序    24.1.1 funcmeister1函数    24.1.2 funcmeister2函数   24.2 exception_execute_handler1    24.2.1 一些有用的例子    24.2.2 全局展开    24.2.3 停止全局展开   24.3 exception_continue_execution   24.4 exception_continue_search0   24.5 getexceptioncode2   24.6 getexceptioninformation6   24.7 软件异常  第25章 未处理异常、向量化异常处理与c++异常   25.1 unhandledexceptionfilter函数详解   25.2 即时调试   25.3 电子表格示例程序   25.4 向量化异常和继续处理程序   25.5 c++异常与结构化异常的比较   25.6 异常与调试器  第26章 错误报告与应用程序恢复   26.1 windows错误报告控制台   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.8 customized wer示例程序   26.5 应用程序的自动重启与恢复    26.5.1 应用程序的自动重启    26.5.2 对应用程序恢复的支持 第ⅵ部分 附录a 构建环境 附录b 消息处理宏、子控件宏和api宏 索引 译者序   Windows编程之道   ——译 序 1      你是否在Windows平台上开发应用程序?你是否希望对Windows提供的各项服务有更深入的理解?你是否需要使用Windows提供的高级功能?你是否在找寻一些Windows实用技术来解决项目 中的难题?如果对上述问题的回答是肯定的,那么你绝对不应该错过本书。   自这本《Windows核心编程(第4版)》出版至今,转眼间已经过去了八年。在这八年期间,Windows世界已经发生了许多变化,Windows XP、Windows 2003、Windows Vista以及Windows Server 2008相继推出。与之对应的,《Windows核心编程》(第5版)也与时俱进,针对最新的Windows操作系统进行更新,为我们了解并发挥最新的平台特性提供了宝贵的指引。   这是一本Windows系统编程的权威专著,许多年之前我就已经读过它的第4版;这是一本生动的教科书,它帮助我更深入地了解Windows系统;同时它又是一本参考书,在我开发Windows应 用程序的过程中遇到问题时,我会到本书中寻找答案。希望它同样能够为你答疑解惑,并解决你的实际问题。   本书由葛子昂、周靖、廖敏共同翻译:第8~22章由葛子昂翻译,第1~6章由周靖翻译,第23~26章及附录由廖敏翻译,第7章由刘江友情客串翻译,全书由葛子昂最终审阅和统稿。鉴于 时间和精力有限,一些翻译难免存在不足甚至错误之处,为此我建立了一份网上勘误表。如果读者发现任何错误,都可以通过该网页与我联系,一旦确认,我会立即将其更新到勘误表中。勘 误表的网址为www.gesoftfactory.com/ge/WindowsViaCpp。   最后,感谢Jeffrey和Christophe在本书翻译过程中不厌其烦地解答我的问题,核实并纠正英文版中发现的一些错误。感谢李劲松、王渊峰、张羿、孙展波、谭映辉以及孙祺对中文版的全 部或部分章节进行了审阅并提出宝贵的意见。感谢潘爱民在百忙中抽空阅读部分译稿,并给以反馈。感谢妻儿和家人对我的理解和支持,本书的翻译工作占用了本应属于你们的时间,现在终 于可以有更多时间来陪伴你们了。         继往开来创新高,推陈出新品佳酿   ——译 序 2      1993年,本书第1版Advanced NT出版的时候,我和三个朋友一起成立了一个“四喜工作室”。由于四个人只有一台计算机,所以我们几个每天一睁眼,第一件事情便是抢占计算机,这台 286配置简单,根本无法与现在的计算机相提并论,而且当时也没有网络,所以计算机的用途非常有限,主要也就是文字处理,玩游戏,编简单程序等,但它带给我们的乐趣至今难以忘怀。受 限于当时的环境,数据和游戏的交换也基本上在圈内好友之间进行,就像搞地下活动一样约好时间地点碰头。幸运的是,由此结交了一大批计算机爱好者,后来他们大多成为IT届的领军人物 。   其时,从大环境看,我国网络也开始悄然起步。1993年年初,中国科学院高能物理研究所接入斯坦福大学线性加速器中心的64K专线开通,国内科学家开始在国内使用电子邮件。随后几个 月的时间,金桥工程和域名体系的确立和部署,三大院校网的连接,最终将我国带入信息高速公路,推动我国IT业的迅猛发展。   由此而来的便是计算机类图书和报纸期刊的炙手可热,《电脑报》等IT媒体相继崛起,计算机图书更是出现供不应求的现象,在当时,即便是国外引进翻译出版的图书,也能轻松突破几 万册的销量,计算机图书的发展达到全盛时期。   在这个时期,国内开发人员先后成为Jeffrey和McConell等大师的拥趸。因为在IT界,虽然资深程序员不胜枚举,但同时又是深受程序员喜爱的技术图书作家的乏善可陈。而像他们那样, 曾经写过多部书,部部都引人入胜,令人醍醐灌顶,就更是凤毛麟角。他们是Windows编程世界中的中流砥柱,也是Windows技术当之无愧的布道者。曾有不少读者放言,只要是Jeffrey的书, 他们必定会花时间研读,并加以收藏。这一点都不夸张,我们同时代的很多人都是在这批书的滋润下成长起来的。他们熟读了Advanced NT之后,又如痴如狂地捧起了Advanced Windows和 Programming Application for Microsoft Windows等续作。他们是Jeffrey的粉丝,同时也是微软开发阵营的主力军。   随着微软宣布放弃对Windows XP以及以前版本的支持,Windows Vista的普及势在必行,迟早会安装到普通用户的计算机上。Windows Vista有很多吸引人的新特性,相信大家不用不知道 ,一用忘不了。(在翻译Microsoft Press的Windows Vista Inside Out一书的过程中,我已经深切体会到她的妙处)。作为一名程序员,有必要在第一时间适应在新的操作系统下的编程。历经 15年,本书也随着Windows操作系统的“改朝换代”,升级到第5版,即Windows via C/C++。如果您要用C/C++开发Windows应用程序,那就不要走弯路,直接让Jeffrey告诉您如何利用Windows 的新特性和新函数来编写出高效、优美的Windows应用程序。   对于本书的学习,谨以《史记 孔子世家》中孔子学琴一文与大家共勉(请原谅,这里引用了我另一本书的译序,因其寓意深刻,故忍不住又拿出来与大家分享?):    .  孔子学鼓琴师襄子,十日不进。师襄子曰:“可以益矣。”孔子曰:“丘已习其曲矣,未得其数也。”有间,曰:“已习其数,可以益矣。”孔子曰:“丘未得其志也。”有间,曰:“ 已习其志,可以益矣。”孔子曰:“丘未得其为人也。”有间,有所穆然深思焉,有所怡然高望而远志焉。曰:“丘得其为人,黯然而黑,几然而长,眼如望羊,如王四国,非文王其谁能为 此也!”师襄子辟席再拜,曰:“师盖云文王操也。”      期望读者朋友也能达到学习的三大境界:学习掌握演奏(编程)的技巧;领会其中的志趣;熟悉乐曲(程序)的作者。   翻译过程中,感谢我的家人和朋友的诸多帮助和理解,他们是文天山、曹伟、文娟、马文喜、张旭等。尤其要感谢我的乖女儿。这个暑假,她的成长令人激赏!   同时,还要感谢其他几名译者以及微软公司的技术专家们,感谢他们为本书的质量进行了严格的把关。最后,欢迎读者指出本书的疏漏和不足之处 ,如果对我翻译的部分(第1~6章)有什 么意见和建议,请访问我的博客(transbot.blog.163.com),在此留言指出。这里我为自己翻译的图书开辟了专栏,专门用于和读者们分享勘误和其他有用的信息。      周 靖 前言   前 言      Microsoft Windows是一个复杂的操作系统。它提供的特性非常丰富,对任何个人而言,要想完全透彻地理解整个系统几乎不可能。其复杂性也使我们很难确定应该把主要精力集中在哪些 地方。万丈高楼平地起,就我个人而言,我始终倾向于从最底层开始,深刻理解系统的基本构件。一旦掌握了最基本的东西,就很容易向自己的知识库中逐步添加更多高层的东西。所以本书 将集中介绍Windows的基本构件和基础概念,对于构架和实现Windows应用程序来说,这些都是必须掌握的。简而言之,本书是向读者介绍各个Windows特性,并介绍如何通过C和C++语言来了解 并使用这些特性。   虽然本书不会涵盖某些Windows概念,比如组件对象模型(Component Object Model ,后面简称为COM),但COM是在进程、线程、内存管理、DLL、线程本地存储区以及Unicode等基本构件 的基础上构建的。如果了解了这些基本构件,那么要理解COM就相当于理解如何使用这些基本构件。对于那些试图跳过这些基本构件,悉心钻研COM体系结构的朋友,我深表同情。要完善知识 库,他们还有很长一段路要走,这必然会对他们的代码和软件开发进度产生很大的负面影响。   Microsoft .NET Framework的公共语言运行时(Common Language Runtime,CLR)是本书未涉及的另一种技术(感兴趣的朋友可以阅读我的另一本专著《框架设计:CLR via C#》)。不过, CLR是作为动态链接库(dynamic link library,DLL)中的一个COM对象来实现的,它需要被载入到进程中,它需要使用线程来执行代码,它需要处理Unicode字符串,它还需要在内存中对这些 字符串进行管理。因此,本书所介绍的基本构件仍然有助于软件开发人员编写托管代码。此外,借助于CLR的平台调用(Platform Invocation,P/Invoke)技术,我们可以调用本书所介绍的各 种Windows API。   如此一来,本书的宗旨是介绍每一个Windows开发人员都应该掌握的基本的Windows构件(至少在我看来如此)。在介绍每一个构件的时候,我还会描述系统是如何使用这些构件的,我们自 己的应用程序如何充分利用这些构件。在很多章中,我会介绍如何创建自己的构件。我们自己的构件一般都实现为普通函数或C++类,它们把一些Windows构件组合在一起,从而创造出一个整 体,其结果远远大于各部分之和。   64位Windows操作系统   Microsoft发售支持x86 CPU体系结构的32位Windows操作系统已经有多年的历史。如今,Microsoft还提供支持x64和IA-64 CPU体系结构的64位Windows操作系统。基于这些64位CPU体系结 构的计算机迅速为市场所接受。事实上,在不远的将来,所有台式机和服务器都将使用64位CPU。为此,Microsoft已发表声明,Windows Server 2008将是最后一款32位版本的Windows操作系 统!对于开发人员而言,现在是时候集中精力让自己的应用程序能在64位Windows操作系统上正常运行了。贯穿本书,将全面覆盖相关的知识,让开发人员的应用程序能够在64位Windows操作 系统(同时也包括32位Windows)上正常运行。   应用程序从64位地址空间所获得的最大的好处是,能够轻松处理大量数据,因为应用程序的进程不再受限于2GB可用地址空间。即使应用程序并不需要所有这些空间,Windows本身也可以 利用这个显然大得多的地址空间(约8TB)来加快运行速度。   对于64位Windows操作系统,我们需要了解哪些呢?下面简单看一看。    64位Windows内核是32位Windows内核的移植版本。这意味着以前所学的32位Windows所有细节和难点均适用于64位Windows。事实上,Microsoft已经修改了32位Windows的源代码,使其既 可以编译生成32位系统,也可以编译生成64位系统。两个系统使用同一个源代码库,所以新的特性和缺陷的修复会同时应用于这两个系统。    因为内核使用相同的代码和基本概念,所以在两个平台上的Windows API是一样的。这意味着我们不必重新设计或实现应用程序,就能让它在64位Windows操作系统上运行。我们只需要对 源代码做少许改动,然后重新构建应用程序即可。    为了保持向后兼容性,64位Windows操作系统是可以执行32位应用程序的。但是,如果应用程序是作为64位应用程序来生成的,那么它的性能会有显著的提高。    因为移植32位代码非常容易,所以64位Windows操作系统中已经有很多的设备驱动程序、工具和应用程序了。遗憾的是,Visual Studio是32位的,而且Microsoft似乎还并不急于将其移 植为64位的。不过,好消息是32位的Visual Studio在64位Windows操作系统上的确运行得非常好,只不过其数据结构的地址空间有限。而且,我们还可以用Visual Studio来调试64位应用程序 。    并不需要学习太多新知识。大多数数据类型仍然保持32位宽度,这是很多读者很高兴看到的。它们是INT,DWORD,LONG和BOOL等。事实上,大多数情况下我们只需要担心指针和句柄,因 为它们现在变成64位了。   对于如何将现有源代码修改为64位,Microsoft已经提供了相当丰富的信息,所以我们不打算在本书中深入这些细节。不过,在我写每一章的时候,我都会考虑到64位Windows操作系统。 在适当的时候,我会加入64位Windows的特定信息。同时,我还在64位Windows中编译和测试了本书中的所有示例程序。所以,如果读者效仿书中的示例程序和我的做法,那么创建一个能够为 32位或64位Windows编译的源代码库应该完全不成问题。   《Windows核心编程(第5版)》中有哪些新内容   在过去,本书曾经被冠以“Advanced NT”,“Advanced Windows”和“Programming Application for Microsoft Windows”等名字。为保持这个传统,本书的第5版也有一个新的书名, 即Windows via C/C++。新的书名表示本书是为打算理解Windows的C和C++程序员设计的。第5版全面覆盖了Windows XP,Windows Vista和Windows Server 2008中的170个新增函数和Windows特 性。   有些章已经全部重写,比如第11章,这一章解释了如何使用新的线程池API。第4版原有的各章都已经大幅修订,以突出介绍新的特性。例如,在第4章,现在已经包含了用户账户控制 (User Account Control)的介绍,第8章现在介绍了新的同步机制。   同时,我还更全面地介绍了C/C++运行库如何与操作系统交互,特别强调安全性和异常处理。最后,第5版新增了两章内容,解释了I/O操作的工作原理以及如何深入理解新的Windows Error Reporting系统,此系统改变了我们必须考虑应用程序错误报告和应用程序恢复的方式。 .  除了新的结构和更深入的介绍,我还增加了大量新的内容。第5版着重在以下几个方面进行了更深入的讲解。    Windows Vista和Windows Server 2008新增特性 当然,除非本书涵盖了Windows XP,Windows Vista,Windows Server 2008和C/C++运行库的所有新特性,否则它就算不上是真正的修订 。第5版着重强调安全字符串函数、内核对象变化(比如名称空间和边界描述符)、线程和进程属性列表、线程和I/O优先级安排、取消同步I/O、向量异常处理等方面的最新信息。    64位Windows 支持 本书旨在解决64位Windows的特定问题,所有示例程序都在64位Windows上生成并测试过。    使用C++语言 示例程序使用C++语言,所需要的代码更少,而且C++的逻辑更清楚,也更容易理解。    可重用的代码 我尽可能让源代码既通用,又可重用。这样一来,读者只需对单独的函数或者整个C++类稍作改动或根本无须做改动,就可以在自己的应用程序中使用它们。C++语言的使 用进一步增强了代码的可重用性。    ProcessInfo实用工具 前几版中一直都有的这个特殊示例程序已经被增强,可以显示进程拥有者、命令行和UAD相关详情。    LockCop实用工具 这个示例程序是新增的。它显示了系统中有哪些进程正在运行。一旦选定了一个进程,这个工具就会列出进程中的所有线程,以及每个线程是被哪种同步机制阻塞,同 时明确地指出死锁的情况。    API拦截 我介绍了一些更新后的C++类,这些类使得对进程中的一个或所有模块进行API拦截变得相当简单。我的代码甚至拦截了应用程序在运行的时候对LoadLibrary和GetProcAddress 的调用,这进一步加强了对API的拦截。    结构化异常处理有所增强 我重写并重新组织了结构化异常处理的内容。我进一步介绍了未处理异常,并针对如何根据自己的需求自定义Windows Error Reporting系统。   示例代码和系统需求   本书的示例程序可以从本书配套网页下载,网址如下:   http://www.wintellect.com/books.aspx   为了构建示例程序,读者朋友需要安装Visual Studio 2005或更新版本,Microsoft Platform SDK for Windows Vista和Windows Server 2008(有些版本的Visual Studio自带这个SDK)。 此外,要运行示例程序,还需要一台已安装Windows Vista(或更新的版本)的计算机(或虚拟机)。   本书支持   我们已经尽力确保本书及其配套内容的准确性。我们会将收集到的勘误或改动添加到一个勘误表中,读者可以从以下网址下载这个勘误表:   http://www.wintellect.com/books.aspx   问题和评论   有关本书或者网络配套内容的任何评论、问题或想法,或者通过访问上述网址仍然未能解决的疑惑,请通过电子邮件发送给Microsoft Press:   [email protected]   或者将信件寄到以下地址:   Microsoft Press   Attn:Windows via C/C++ Edition   One Microsoft Way   Redmond,WA 98052-6399   请注意,上述地址并不提供对Microsoft软件产品的支持。            玉不琢,不成器   ——《Windows核心编程(第5版)》出版前言      在刚刚过去的第29届奥运会上,气势恢弘、美轮美奂的开幕式,精彩纷呈、欢呼不断的赛场,让我们度过了多少个激动人心的不眠之夜!开幕式上,以宏伟气势演绎的各种形式的“和” 给人留下深刻的印象,同时也凸现了我们这个时代的主旋律。是的,“事成于和睦,力生于团结。”电影《赤壁》中,饰演周瑜的梁朝伟同样也以一个简单的动作强调了“和”的重要作用。   值此《Windows核心编程(第5版)》出版之际,心里也同样洋溢着一样的情结。作为此书的出版者,我们得到了很多方面的支持,从拿到选题、遴选译者,再到后期的反复审稿,来自社内 领导和同仁、来自兄弟出版社、来自微软公司、来自译者、来自读者的支持和热情,大大增强了我们出好书,出精品书的信心和决心,能得到这么多的支持和关注,实乃三生有幸!在此特别 向各位表示由衷的感谢!   正所谓“玉不琢,不成器“,一本经典著作,不仅要内容精确,还少不了版式和其他细节的精心编排。    优秀译者是高品质译著的源泉 甄选译者的时候,很多读者朋友踊跃报名,他们都希望能参与此书的工作,为Windows编程领域做出贡献。在此,向他们表示由衷的感谢。他们当中,有70 后的资深程序员,也有80后的高手程序员,也有朝气蓬勃的在校学生。考虑到质量和时间的因素,最后确定由微软中国研发集团服务器及开发工具事业部的葛子昂主译,周靖和廖敏参与。优 秀译者是高品质译著的源泉,这一点在本书上得以充分的验证。他们在翻译过程中,秉承一贯的严谨风格,在字里行间进行认真的推敲,并认真对代码进行了相应的调试和实践。葛子昂作为 主译,不仅精心规划进度,还牺牲了休息时间主动承担了大部分工作,责无旁贷地对全书进行统稿,他对本书的认真程度,让人钦佩。兄弟出版社朋友对本书翻译的参与,也使我大受鼓舞。 从他们身上,能够深切地体会到他们的敬业精神,他们是真正的爱书人,全心全意为读者着想的人。为读者奉献更丰盛的技术图书盛宴,促进技术图书的健康发展,这是我们共同的心愿。    来自微软的支持 微软出版社和微软最有价值专家(MVP)项目组对本书给与大力支持,特别是陈芃和Sisley,他们组织相关技术专家对本书进行审阅,刘彦博、蒋晟和王涛等MVP在第一 时间给与我们最宝贵的意见。    大人物的推荐序 本书由Windows Internals(深入解析Windows操作系统)作者提笔所写,他对本书的内容和结构给与了充分的肯定。    精美、雅致的版式 在版式设计方面,我们突破技术类图书的常规,精心设计了页眉和章首页,为读者提供更赏心悦目的阅读感受。    Jeffrey照片和亲笔签名 Microsoft Press的陈 帮我们穿针引线,引入Jeffrey的“大头照”、家庭照和亲笔签名,这些都会在书中呈现出来。此外,Jeffrey还计划在2009年4月访问中 国,届时欢迎读者朋友参与他的见面会,与他一起探讨和体验Windows编程乐趣。    索引 为方便读者查阅,我们在译文相应部分添加了原书页码,同时保留原书索引,并将其附于书后。    读后感分享 对于一本好书,很多读者都有自己的心得和感想,并希望和同道中人切磋,这一点,我们将成立一个专门的书友会,读者可以在其中畅所欲言,在《Windows核心编程》书友 会这个大家庭中共同成长。详情请关注我社网站首页上的公告。   作为出版工作者,我们要感谢来自译者和读者的支持和鼓励,没有他们,就没有佳作的诞生。关于本书的任何意见和建议,欢迎发送邮件到[email protected],我们一直在聆听 大家的心声。      清华大学出版社     序言   推 荐 序      当Jeffrey请我为本书写一篇序的时候,我爽快地答应了。我还记得在上个世纪90年代早期寻找本书第1版《高级Windows NT编程》(Advanced Windows NT)时的情形。那时我刚刚开始开发 Windows应用程序。在我开发诸如Filemon,Regmon以及HandleEx(现在叫Process Explorer)之类的应用程序时,它既是一本指南,又是一本参考手册。本书第1版面向Windows系统编程,而 Charles Petzold的《Windows编程》(Programming Windows)则面向用户界面编程。   在过去的几年中,Jeffrey已经将他关注的重点转向了托管代码,这使得为本书作序对我来说大有意义。Jeffrey已经成为.NET CLR和C#系统编程的权威,当Microsoft还在设计.NET的时候 ,他的这种转换就已经开始了。他还不时地“嘲弄”我和我的搭档David Solomon——我们合著了《深入解析Windows操作系统》(Windows Internals)系列,说本机代码编程(native code programming)已经日暮西山。我和David始终坚信本机代码编程由于具有不同的API、不同的失败语义(failure semantics)、不同的部署方式以及不同的运行时特征,因此将继续满足某一类应 用程序的需求,或者至少是满足部分应用程序的需求。相当一部分Windows客户端应用程序仍然是用本机代码编写的,甚至Microsoft的旗舰服务器端应用程序,包括IIS、SQL Server以及 Exchange,几乎完全是用本机代码编写的,或者使用了用本机代码编写的组件。因此,我将本书视作Jeffrey对我们这种信念的无言的肯定。   Windows一直在演化,本书亦是如此。它之前已经经历了许多个版本,甚至书名也一变再变。比如,本书上一版名为Programming Applications for Microsoft Windows。但无论书名如何 改变,它的每一版在我的书架上都占有一席之地。(这与Jeffrey给我在书上签名不无关系,不仅如此,而且所签的内容还是我选的,比如“我从Mark那里学到了一切”之类可供炫耀的话。)这 一个版本不仅只是换了一个新的书名,它还介绍了Windows Vista和Windows Server 2008中引入的最新API,包括线程、安全、异常处理以及I/O。   本书提供了大量的编程实例,既紧凑又有效地展示了各种关键概念,这使得它尤其有用。许多作者在将代码与读者分享的时候,并没有认识到许多开发人员会直接将代码复制和粘贴到将 要发行的应用程序中去。但与我们在互联网上搜索到的代码不同,Jeffrey和Christophe已经确保书中的代码在编写时兼顾了高质量和高准确性。   我相信,无论您是Windows应用程序编程的新手,还是完全用本机代码来编写应用程序或通过P/Invoke来调用.NET Framework未提供的API的老手,都会发现本书的价值。它将有助于发挥 强大的平台特性并降低其复杂度,帮助开发人员开发伸缩性更好、更可靠、更安全以及性能更高的应用程序。显然,它依旧会出现在我的书架上,希望这一次Jeffrey和Christophe都能为我签 上“我从Mark那里学到了一切”。   Mark Russinovich   (Windows Internals作者)   Technical Fellow   Microsoft Corporation         媒体评论   无论是Windows编程新手,还是完全用本机代码来编程或通过P/Invoke来调用,NET Framework未提供的API的老手,都会发现本书的价值。   ——Mark Russinovich,《深入解析Windows操作系统》作者   要想在Windows编程方面更上一层楼,迟早都需要好阅读并领会本书的内容。   ——Francis Glassborow,C/C++用户协会前主席   搞Windows程序设计有两方面的资源是不可或缺的:一是MSDN,另一个便是本书。   ——侯捷,著名技术作家 书摘   第Ⅰ部分必备知识   第1章 错误处理   1.1 定义自己的错误代码   1.2 ErrorShow示例程序   在深入讨论Microsoft Windows提供的诸多特性之前,应该先理解各个Windows函数如何进行错误处理的。   调用Windows函数时,它会先验证我们传给它们的参数,然后再开始执行任务。如果传入的参数无效,或者由于其他原因导致操作无法执行,则函数的返回值将指出函数因为某些原因失败 了。

2018-01-26

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除