无名图书
收藏
Windows核心编程
Jeffrey Richter
出版社
人民邮电出版社
出版时间
2008-07-31
ISBN
9787115182128
评分
★★★★★
标签
计算机
书籍介绍
这不是一本教你如何使用Windows API的入门手册,而是一扇让你窥见操作系统内部运转机理的门。作者不满足于告诉你「怎么调函数」,而是执着地追问「函数背后发生了什么」:内核对象为何通过句柄访问、句柄表如何构成、CloseHandle忘记调用究竟会不会泄漏、命名对象为何会遭DOS劫持。正是这种追根溯源的写法,让读者产生「看透Windows」的通透感。书中大量「反直觉」的细节——返回句柄可能是NULL或INVALID_HANDLE_VALUE、真创建与仅打开可用GetLastError判断——正是它区别于其他参考书的价值所在。它适合已有一定基础、不满足于表面调用、希望理解机制的开发者;若只为速成,或许会觉得部分章节偏深。
作者简介
Jeffrey Richter全球享有盛誉的微软技术专家,著名技术咨询和培训公司Wintellect创始人之一,MSDN Magazine杂志特邀编辑。多年来,他担任微软各开发团队顾问,参与了微软的许多关键产品包括各版本Windows、Visual Studio、Microsoft Offce和.NET框架的设计和编程。他撰写了一系列著作,包括本书和《深入理解.NET》(第2版·英文版,人民邮电出版社。2008),都堪称技术图书的典范,影响了一代Windows程序员,并因此荣获微软公司杜区最高技术荣誉“微软软件传奇人物”(Software Legend)称号。
AI导读
核心看点
跨进程共享内核对象:命名、句柄复制与继承机制
Windows错误处理与字符编码转换的精要
线程与进程基础:内核对象、栈及同步技巧
读者共识
Windows编程必读经典,内容全面而深刻
多次研读方能领悟内核对象与线程奥秘
部分章节(如SEH)可选择性学习,不影响主干
精彩摘录
"
垮进程边界共享内核对象的第二个办法是为对象命名。许多(但不是全部)内核对象都可以进行命名。 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
"
目录
Part I Required Reading
1 Error Handling
Defining Your Own Error Codes
The ErrorShow Sample Application
2 Working with Characters and Strings
显示全部
用户评论
windows c/c++程序员必读
重拾童年记忆...
最初是被API Hooking吸引来的,不过坚持到最后,收获颇丰,今后可以为所欲为了
如果只保留前21章,对读者的时间效率会更友好。最后结构化异常处理的一部分,一般开发中几乎用不到,尤其是C++本身已支持异常处理。第22章关于DLL注入和API Hook的部分适合别的书来讲。然而仅冲前面21章也值得打五星的。
写的真好。
windows程序员必看
你可能会关注的书籍
CLR via C#
Jeffrey Richter
Windows核心编程(第5版)
Jeffrey Richter
人民邮电出版社的其他书籍
查看全部
历史上最美的10个实验
George Johnson
Linux程序设计
Neil Matthew
勾股定理
Eli Maor
随机过程
伊藤 清(Kiyoshi Ito)
斯图尔特微积分(第九版·下)
[加] 詹姆斯·斯图尔特(James Stewart)
一定要不停记录自己
晴叙
求书
收藏