內部組件
這些程序庫文件通常不會被程序直接使用,不過它們卻是用來實現其他程序庫功能的重要程序庫。
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來創建及管理這些界面元素。