Windows核心编程

Jeffrey Richter

出版时间

2000-05-01

ISBN

9787111079453

评分

★★★★★
书籍介绍
Windows核心编程,ISBN:9787111079453,作者:(美)Jeffrey Richter(J.理查特)著;王建华[等]译;王建华译
AI导读
核心看点
  • 深入解析Windows内核对象机制
  • 详解进程线程创建与管理细节
  • 涵盖错误处理与跨进程通信
适合谁读
  • 从事Windows底层开发工程师
  • 希望深入理解系统原理开发者
  • 具备一定编程基础的中级读者
读前提醒
  • 内容深奥晦涩,需耐心细读
  • 建议结合操作系统理论背景阅读
  • 翻译质量一般,推荐参考原版
读者共识
  • 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"
下载
收藏