api接口和sdk接口的区别
1. 概念和工具
在这一章中,我们会介绍全书将会用到的关键的windows操作系统概念和术语,例如Windows API、进程、线程、虚拟内存、内核模式和用户模式、对象、句柄、安全和注册表。我们也会介绍你用来探索Windows 内部机制的工具,例如内核调试器、可靠性和性能监视器、来自Windows sysinternals (www.microsoft/technet/sysinternals)主要的工具。此外,我们将解释你怎么使用Windows Driver Kit(WDK)和Windows Software development Kits(SDK)作为资源来发现Windows系统内部更多的信息。
确保你理解本章的所有东西-本书的剩余部分假定你已经理解了一切。
1.1. Windows操作系统版本
本书覆盖基于Windows NT内核的最近两个版本:Windows Vista(32位和64位版本)和Windows Server 2008(32位和64位版本)。除非特殊说明,本文适用所有的版本。作为背景信息,表1-1列出了Windows NT内核的发布版本,它们的内部版本号和外部产品名称。
1.2. 基本概念和术语
在本书的课程当中,我们将会引用一些对一些读者来说比较陌生的结构和概念。在这个部分,我们将会定义这些贯穿于全书的这些术语。
你将在进入到余下章节之前熟悉这些术语。
1.2.1. Windows API
Windows应用程序编程接口(Windows application programming interface)是对Windows操作系统家族的系统编程接口。前面介绍的Windows XP Windows Server 200364位版本,Windows操作系统的32位版本的编程接口称作Win32 API,以用来区别于原始的16Windows API16Windows API是原始的Windows16位版本的编程接口。在本书中,术语Windows API指的是Windows VistaWindows Server 200832位和64位编程接口。
注意在SDK文档中描述了Windows API(参见本章后面的Windows SDK)。这个文档可以在www.msdn.microsoft.在线免费浏览。它也包含了微软开发网络(MSDN,微软对开发者的编程支持)的所有订阅级别(subscription levels)。需要更多的信息,可以看www.msdn.microsoft。对基于Windows API编程描述的最精彩的是《Windows via C/C++》(第五版,作者Jeffrey RichterChristophe Nasarre,微软出版社2007
Windows API包数千个可调用的函数,可以分成下面主要的类别:
基础服务(Base Services
组件服务(Component Services
用户接口服务(User Interface Services
图形和多媒体服务(Graphics and Multimedia Services
消息和协作(Messaging and Collaboration
网络Networking
■ Web服务(Web Services
本书重点关注内部的关键基础服务,例如进程和线程、内存管理、IO和安全。
.Net是什么?
.Net框架包含了一个称作FCLFramework Class Library)类库和一个公共语言运行时(Common Language Runtime)(CLR),CLR提供了一个托管代码的执行环境,具有实时编译、类型校验、垃圾回收、代码访问安全等特性。CLR也提供了一个开发环境,可以提高程序员的生产率、减少通常的编程错误。对于.NET Framework出的描述和它的内核架构,可以参考《CLR via C#, Second Edition by Jeffrey Richter (Microsoft Press,2006)
CLR被实现成一个经典的代码运行在用户模式的DLL COM服务器。实际上,.NET Framework的所有组件都是在windows API基础上使用非托管代码实现成标准的用户模式windows DLL(没有任何一个.NET Framework组件运行在内核模式。图1-1说明这些组件之间的关系。
.Win32 API的历史
有趣的是,Win32 并不是最初就作为微软windows NT的编程接口的候选名单。因为windows NT项目开始是用来替代OS/2 version 2的,主要的编程接口是32OS/2 外观管理(Presentation ManagerAPI。然而,项目做了一年以后,微软windows 3.0 上市并取代了它。因此微软改变了方向并把windows NT作为将来取代windows家族的产品而不是用来取代OS/2。就是在这个时候,需要定义windows API——在此之前,windows API仅以16位接口的形式存在。
虽然windows API引入许多windows 3.1中没有提供的新函数,微软还是决定新的API要兼容16API的函数名称、语义和数据类型,目的是为了降低移植现存的16windows程序到windows NT上的负担。因此对于那些第一次看到windows API,感觉许多函数名称和接口看起来不一致的人,应该记住这种不一致是为了确保windows API16windows API的兼容。
1.2.2. 服务、函数和例程
一些windows用户和编程文档中的术语在不同的上下文有不同的意思。例如服务可以指操作系统中可调用的例程、设备驱动,或者一个服务器进程。下面列出本书中的常用术语的意思。
文档化的windows API函数、windows API中可调用的子例程,例如CreateProcess、CreateFile和GetMessage
未文档化的本地系统服务(或者执行体系统服务),操作系统底层用户模式不能调用的服务。例如NtCreateProcessEx是用来创建一个新进程的内部系统服务。(了解本地函数,参考第三章“系统服务分发”)。
在操作系统内部的内核支持函数(或者例程),只可以在内核模式调用(后面的章节会定义),例如ExAllocatePoolWithTag是设备驱动调用从windows 系统堆中分配内存的函数。
由windows服务控制管理器启动的Windows服务进程。(虽然注册变中定义设备驱动为服务,但是我们在本书中不把设备驱动作为服务)。例如任务调度服务运行在用户模式进程,来支持at commands(类似于commands at or cron)。
DLL(动态链接库):一组可调用的例程链接在一起形成一个库文件,可以被应用程序动态加载使用这些例程。例子包括msvcrt.dllC运行时库)和kernel32.dllwindows API子系统库之一)。Windows用户模式组件和应用程序广泛的使用这些库。动态链接库提供的好处在于所有引用它的应用程序共享内存中的一份拷贝。
1.2.3. 进程、线程和作业
Windows用户和编程文档中有几个术语在不同的上下文有不同的含义,例如“服务”可以指:
虽然程序和进程表面上看起来是相似的,但是他们从根本上是不同的。程序是一个静态的指令序列,而进程是一个容器,包含了一些当执行程序的一个实例后会用到的资源。在最高抽象层面上,windows进程包含下面这些:
一个私有的虚拟地址空间,是进程可以使用的一些虚拟内存地址
一个可执行程序,定义了初始的代码和数据并且被映射到进程虚拟地址空间中
一些指向不同的系统资源的打开的句柄,例如进程中的所有线程可以访问的信号量、通信端口。
称作访问令牌的安全上下文,用来标识用户、安全组、特权、用户访问控制(UAC)、虚拟化状态、会话、和进程关联的受限的用户账户状态。
一个称作进程ID的唯一标识符(内部叫做客户ID(client ID)的标识符)。
最后一个执行的线程(虽然一个空进程是可能的,但是是没有用的)
每个进程也都会执行它的父亲或者创建者金正,然而,如果父进程退出的话,这个信息是不会更新的。因此对一个进程来说,指向一个不存在的父进程是可能的。这并不是一个问题,因为没有任何东西依赖于这个信息。下面的这个实验说明了这个情况。
实验:浏览进程树
大多数工具都不会显示进程的父进程或者创建者,你可以通过性能监视器检索创建进程ID或者采用编程的方式也可以。(在windows调试工具箱)使用/t 开关可以显示进程树,这是一个从 tlist /t的输出例子:
1.  C:\>tlist /t 
2.  System Process (0) 
3.  System (4) 
4.  (480) 
5.  (548) 
6.  (612) 
7.  (656) 
8.  (848) 
9.  (880) 
10.  (924) 
11.  (980) 
12.  (1040) 
13.  (1108) 
14.  (123) 
15.  (96) 
16.  (604) 
17.  (1532) 
18.  (1814) 
19.  (2988) 
20.  (672) 
21.  (680) 
22.  (624) 
23.  (824) 
24.  (724) Program Manager 
25.  WINWORD.EXE (3512) WinInt5E_Chapter01.doc [Compatibility Mode] 
    - Microsoft Word 
26.  (3936) Command Prompt - tlist /t