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来创建及管理这些界面元素。
上一篇: 双十一后
下一篇: C4D怎么实现实景合成的效果?