Windows核心编程(第5版)

Jeffrey Richter

出版时间

2008-09-01

ISBN

9787302184003

评分

★★★★★
AI导读
核心看点
  • 经典Windows编程指南,深入解析内核对象与API
  • 全面覆盖XP至Server 2008特性,讲解进程线程机制
  • 澄清线程实质与消息循环原理,连接理论与底层实现
适合谁读
  • 具备C/C++基础,希望深入理解Windows底层机制的开发者
  • 有一定操作系统基础,需解决复杂Windows编程问题的工程师
  • 对Windows系统原理感兴趣,能接受高密度技术内容的读者
读前提醒
  • 内容深奥且翻译一般,建议配合英文原版或APUE对照阅读
  • 需具备OS理论基础,部分底层知识初读可能晦涩难懂
  • 部分API示例较旧,建议结合微软最新官方文档查证更新
读者共识
  • 被誉为Windows编程圣经,是排查疑难问题的必备参考书
  • 阅读门槛极高,需耐心慢读,第一遍通读往往难以完全消化
  • 虽部分版本内容显旧,但对理解系统核心原理仍有巨大价值

本导读基于书籍简介、目录、原文摘录、短评和书评生成,不等同于全文精读。

精彩摘录
  • "垮进程边界共享内核对象的第二个办法是为对象命名。许多(但不是全部)内核对象都可以进行命名。 CreateMutex,CreateEvent,CreateSemaphore,CreateWaitableTimer,CreateFileMapping,CreateObject这些API都可以创建命名的内核对象。 用于创建内核对象的函数总是返回具有完全访问权限的句柄。如果想限制一个句柄的访问权限,可以使用这些函数带Ex后缀的扩展版本。 通过名称来创建内核对象共享时,请注意:进程B调用CreateMutex时,它向函数传递安全属性信息和第二个参数。如果已经存在一个指定名称的对象,这些参数就会被忽略。事"
  • "在正在运行终端服务的计算机中,有多个用于内核对象的命名空间。其中一个是全局命名空间,所有客户端都能访问的内核对象要放在这个命名空间中。这个命名空间主要由服务使用。此外每个客户端会话(Client Session)都有自己的一个命名空间 一个服务的命名内核对象始终位于全局命名空间内的。默认情况下,在终端服务中,引用程序自己的命名内核对象在会话的命名空间内。我们可以强制把一个命名对象放入全局命名空间,做法是在其名称前加入“Global\”前缀,同理,可以把一个命名对象放入当前会话的命名空间,做法是在其名称前加入“Local\”前缀。 CreateEvent(NULL,FALSE,FALSE,TEX"
  • "创建一个内核对象时,可以传递一个安全描述符指针,从而保护该对象的访问。不过在windows Vista以前,不可能防止一个共享对象的名称被“劫持”。任何进程,即使是最低权限的进程都能用任何指定的名称来创建一个对象。这样就很容易另外写一个应用程序来创建一个同名的内核对象。如果它先于单实例应用程序启动,那么单实例的应用程序就变成了无实例的应用程序-------始终一启动就退出,错误地认为它自己的另一个实例已经在运行。这就是DOS攻击的基本机制。但是注意,未命名的内核对象不会遭到DOS攻击。未命名的对象是不能在进程之间共享的。 CreatePrivateNamespace创建一个专有的命名空间。"
  • "跨进程边界共享内核对象的最后一招是使用DuplicateHandle,简单的说,这个函数获得一个进程的句柄表中的一个记录项,然后在另一个进程的句柄表中创建这个记录的一个副本。"
  • "第1章 错误处理 P3 常见Windows函数返回值数据类型:VOID, BOOL, HANDLE, PVOID, LONG/DWORD P4 DWORD GetLastError(); 返回由上一个函数调用设置的线程的32位错误代码 (WinError.h) 在Visual Studio 的Watch窗口中使用$err,hr来查看当前线程的“上一个错误代码” P6 FormatMessage 第2章 字符和字符串处理 P21 _countof //errno_t result = _tcscpy_s(szBuffer, _countof(szBuffer), TEXT("0123456789"
  • "P36 进程内核对象句柄表:只是由数据结构组成的数组,每个数据结构包含指向一个内核对象的指针,一个访问掩码和一些标志。 P38 注意创建一个新内核对象后返回的句柄,有可能是NULL,也有可能是INVALID_HANDLE_VALUE P40 假定忘记调用CloseHandle,会发生对象泄漏的情况吗?嗯,不一定。 P42 3种不同的机制允许进程共享内核对象:1使用对象句柄继承,2为对象命名,3复制对象句柄 P44 对象句柄的继承只会在生成子进程的时候发生。之后父进程又有什么新的句柄被创建跟子进程无关,不会被继承。 子进程并不知道自己继承了任何句柄。 P46 改变句柄的标志 SetHandleI"
  • "P101 调用ExitProcess或ExitThread会导致进程或线程直接终止运行——再也不会返回当前函数调用。 P101 只有在无法通过其他方法来强制进程退出时,才应使用TerminateProcess 一旦进程终止,系统会保证不留它的任何部分。绝对没有任何办法知道那个进程是否运行过。进程在终止后绝对不会泄漏任何东西。 P104 Windows提供了几种方式在不同进程之间传递数据,DDE,OLE,管道,邮件槽;共享数据最方便的方式之一就是使用内存映射文件。 P105 独立的进程:一旦进程创建并开始执行,父进程就不再与新进程通信,或者不用等它完成工作之后才继续自己的工作。 P111 Cre"
  • "P131 作业中的进程可以调用QueryInformationJobObject获得其所属作业的相关信息 第6章 线程基础 理解线程跟进程的区别( 进程:一个内核对象,一个地址空间 ) 理解如何用线程内核对象来管理线程 P140 每个进程至少都有一个线程 线程也有2个部分组成:1线程的内核对象,2线程栈。几乎不涉及记录活动,不需要占用多少内存 线程要在其进程的地址空间内执行代码和处理数据。共享内核对象句柄 P144 创建新线程CreateThread"
作者简介
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是Business Objects的软件架构师和开发部门领导,该公司致力于帮助其他企业更好地专注于其主营业务,通过商业智能方案来提升决策能力和业绩。他为Addison-Wesley,APress和Microsoft Press出版的许多图书担任过技术审校,此外还是MSDN Magazine的撰稿人。
目录
第1部分 必备知识
第1章 错误处理
1.1 定义自己的错误代码
1.2 ErrorShow示例程序
第2章 字符和字符串处理

显示全部
用户评论
和APUE对照着看效果好, 觉得APUE写得更专业,更结合实际,只得还不够深入(只怪Windows是商业软件,有着太多的商业秘密)。
看了前两章,没勇气了。
东西讲得很细,有一些底层的知识目前还看不懂,我也不打算现在就深究。 我终究还是对win下的dev缺乏兴趣阿……个人感觉Windows下的接口设计没有*nix简洁好用阿
速度看掉!!
在前台开发混了一年多,终于对windows编程有了点理解,回头再看这本书,已经觉得不那么难懂了。书中的知识点都狠精彩,不过还是感概一下:windows编程好难。
已经是三刷了。经典。
很多细节,记不住
很不错
和APUE 一个级别的
windows系统是无法被忽略掉,不喜欢却很无奈。
下载
收藏