Windows系统库

维基媒体列表条目

微软视窗系统支持一种被称为动态链接库的共享程序库。正如这种程序库文件的命名,它只需要被加载存储器一次,即可被多于一个进程使用。本条目将会对以下伴随Windows而安装到电脑,作为Windows系统的基础组成部分的动态链接程序库进行介绍。

内部组件

编辑

这些程序库文件通常不会被程序直接使用,不过它们却是用来实现其他程序库功能的重要程序库。

Hal.dll

编辑

Windows系统的硬件抽象层就是由Hal.dll实现[1]。HAL提供很多函数,而这些函数在不同的硬件平台(以下皆指晶片组)皆有不一样的实现方式。因为Windows提供HAL这一个功能,所以大部分程序可以随意调用这些函数,而不需要顾及程序在何种平台上执行。举个例子,回应一个中断要求的方法在一台有或没有高级可编程中断控制器(APIC, Advanced Programmable Interrupt Controller)的电脑是可以有很大分别的,但HAL却提供了便利,使程序不需要顾及这一个分别。

因为HAL是被加载到核心存储器,并且在核心模式执行,所以HAL里的函数是无法被应用程式直接调用的,并且HAL没有提供任何用户模式的API。因此HAL的主要服务对像是Windows核心和核心模式的驱动程式。虽然大部分驱动程式也是存放在独立的.sys文件,但有些核心的驱动程式却是被直接编译到Hal.dll里。

一些核心模式的驱动程式为了对I/O端口和装置的寄存器进行直接的存取,所以需要直接调用Hal.dll里的函数。因为正如上面提到,在不同的平台做一样的事情是有不同的实行方法,所以使用Hal.dll的函数可以确保一份驱动程式能在不同的平台和架构上被使用。

Windows x86的安装媒体上一般存放着不同版本的HAL文件,在安装Windows时会根据现时电脑的平台而把恰当的版本安装进去。判断的条件一般包括BIOS类型,或是否有多个处理器。

Ntdll.dll

编辑

Ntdll.dll和ntoskrnl.exe里含有Windows的原生API,通常被一些必须要在Win32子系统以外的环境下执行的应用程式使用,而这些程序也被称为原生应用程式。大部分API函数的名字通常以Nt开头,例如NtDisplayString。Ntdll.dll除了被原生应用程式调用外,它还会被Kernel32.dll里大部分API所使用[2][3][4]。很大部分的视窗应用程式也不会直接调用Ntdll.dll[5]

原生应用程式使用Ntdll.dll里的函数,一般需要比Win32子系统启动成功前更早的执行。例如csrss.exe,Win32子系统的进程,因为Win32应用程式必须要在csrss.exe上执行,所以执行它的应用程式,smss.exe(会话管理员)必须要是原生应用程式。 尽管原生应用程式有.exe的扩展名,但它们并无法被用户直接执行。例子如autochk.exe,一个用来在开机期间执行chkdsk进行磁碟检查的程序。

因为原生应用程式不能依赖Win32子系统,所以它们的程序入口不是一般Win32应用程式的MainCRTStartup[3],而是NtProcessStartup。原生程序执行完毕后,它们会调用NtTerminateProcess并将执行结果返回。

Win32 API

编辑

以下程序库包含Win32应用程式常用的函数。

Kernel32.dll

编辑

Kernel32.dll提供应用程式一些Win32下的基底API,包括存储器管理、输入/输出操作和同步函数。它们大部分函数皆由原生应用程式实现,例如Ntdll.dll[6]

Gdi32.dll

编辑

Gdi32.dll提供跟图形装置界面有关的函数,例如输出到显卡打印机的原生绘图功能。调用这个程序库里函数的应用程式通常是为了执行底层的绘图功能、文字输出、字体管理或其他相似功能[6][7]

初时GDI只支持16或256色的EGA/VGA显卡和单色打印机,不过GDI的功能已经渐渐升。直到现在它更支持TrueType字体、半透明通道和多屏幕支持。

User32.dll

编辑

User32.dll提供创建和管理Windows图形界面的功能,例如桌面视窗功能表。里面的函数可以让应用程式建立及管理视窗、接收Windows消息(诸如用户的输入或系统的通知)、在视窗中显示文字,及显示一个消息视窗。

这个库里面大部分函数也需要倚靠Gdi32.dll提供的绘图功能,来对用户界面进行渲染。有些程序还会直接使用GDI函数,来对先前由User32.dll所建立的视窗进行底层绘图。

Comctl32.dll

编辑

comctl32.dll主要提供各种标准视窗界面组件。它提供对话框如开启文件、存档及另存新档,或视窗组件如按钮和进度列。它倚靠user32.dll和Gdi32.dll来建立及管理这些界面元素。

参见

编辑

参考

编辑
  1. ^ Blunden, Bill. The Rootkit Arsenal: Escape and Evasion in the Dark Corners of the System. Jones & Bartlett Learning. 2009: 101. ISBN 978-1-59822-061-2. 
  2. ^ Eilam, Eldad. Reversing: Secrets of Reverse Engineering. John Wiley & Sons. 2011: 68–69. ISBN 978-1-118-07976-8. 
  3. ^ 3.0 3.1 Inside Native Windows Applications. [2011-12-14]. (原始内容存档于2010-09-12). 
  4. ^ Russinovich, Mark A. & Solomon, David A. Windows® Internals. O'Reilly Media. 2009: 136. ISBN 978-0-7356-3796-2. 
  5. ^ Marceau, Carla & Stillerman, Matt. Modular behavior profiles in systems with shared libraries. Neng, Peng et al. (编). Information and communications security: 8th international conference, ICICS 2006 [...] proceedings. Springer. 2006: 371. ISBN 978-3-540-49496-6. 
  6. ^ 6.0 6.1 Visual Studio Developer Center: Identifying Functions in DLLs. [2012-08-23]. (原始内容存档于2016-10-11). 
  7. ^ See also, the documentation for the Wine implementation of gdi32.dll: Wine API: gdi32.dll页面存档备份,存于互联网档案馆

外部链接

编辑