注意:Windows API 在SDK中有详细描述。SDK既可以从www.msdn.microsoft.com上看到,也可以从 msdn 光盘中直接获取。关于SDK开发,推荐jeffrey ritcher的 windows via c/c++。(本ID注:charles petzold的 programming windows 也给予严重推荐!!)
Windows API 包含数千个函数,主要可分成一下几类:
- 基础服务
- 组建服务
- UI
- 图形和多媒体
- 消息
- 网络
- Web
(本ID注:经常查看SDK的文档的人会发现这个分类是直接从SDK中获取的)
本书关注基础服务的原理,比如说 线程,进程,内存管理,io和安全。
.net
.net由 FCL 和CLR组成,为托管代码提供执行环境,并支持JIT,类型验证,垃圾收集和代码安全。通过这些措施,提高了开发效率和开发质量。相关书籍可以参考jeffrey richter的CLR via c#
CLR是一个用户态COM组件,底层调用标准的windows API来实现相关功能。所以.net不能运行在内核模式。
win32的历史
windows NT的最初目标是和OS2竞争,因此一开始选定的开发接口是 PM PAI。但是在 NT 项目启动一年后,windows 3.0已经引爆了市场,微软及时的做出了一个艰难又明智的决定:让NT沿着windows3.0的方向发展!直到这个时候,WIN32才被引入,因为3.0上只有WIN16.
虽然win32引入了很多win16没有的功能,但是为了保持兼容性,微软做了很多折中,这会导致win32中有许多接口看起来不太一致
服务 函数 例程
不同的术语,在不同的背景下,意思也各不相同,比如说:服务 既可以指操作系统中可调用的例程,也可以指驱动程序,或者是服务进程。本书的定义如下:
l window api 函数:windows API中文档化的供外界调用的子程序。比如说: CreateProcess, createfile,getmessage
l 本地系统服务(或者系统调用):
底层未文档化的服务,可从用户模式调用。比如说:CreateProess在底层调用NtCreateUserProcess 来创建进程。第三章有关于系统调用的详细定义。
l 内核支持函数(或者例程)
仅供内核模式调用的例程。比如说:驱动可以调用ExAllocatePoolWithTag从Windows系统堆(pools)分配内存。
Window 服务
通过服务控制管理器启动的进程。比如说:计划任务。
l DLLS(动态链接库)
DLL是一个二进制文件,包含了一组可供调用的子例程。DLL在windows中随处可见,比如说msvcrt.dll和kernel32.dll。相比于静态链接库,DLL的优势在于相同的代码在内存中只有一份。不可执行的.net程序集也是以DLL的形式存在,但是没有导出函数。CLR通过解析存贮器中的元数据来进行相关调用。
l 进程 线程 工作
粗看起来,程序 和 进程是一样的,其实有着本质的不同。程序是一组静态的指令,而进程包含了用于执行程序的资源。windows的进程由以下部分组成:
私有的虚拟地址空间:由一些虚拟内存地址组成。
可执行文件:定义了指令和数据,可以被映射到虚拟地址空间。
打开句柄列表:包含了各种系统资源的句柄,比如说event,mutex,file。句柄可供所有线程共享。
访问令牌:用于进程安全上下文中,可以识别用户,安全组,特权,UAC,会话。
procssID:全局唯一的标识符
线程:至少一个,0线程的进程也可以存在,但是没什么用。
进程保存了创建者的ID,但是当创建者消失是,该ID不会更新。因此,该ID很可能指向一个不存在的进程。不过目前并没有其他东西以来该ID,所以这不算严重的问题。在process explore里面,通过比较父进程的创建时间,来避免指向错误的父进程。