Windows系統函式庫

微軟視窗系統支援一種被稱為動態連結庫的共享程式庫。正如這種程式庫檔案的命名，它只需要被載入記憶體一次，即可被多於一個處理程序使用。本條目將會對以下伴隨Windows而安裝到電腦，作為Windows系統的基礎組成部份的動態連結程式庫進行介紹。 這些程式庫檔案通常不會被程式直接使用，不過它們卻是用來實現其他程式庫功能的重要程式庫。 Windows系統的硬件抽象層就是由Hal.dll實現。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和ntoskrnl.exe裡含有Windows的原生API，通常被一些必須要在Win32子系統以外的環境下執行的應用程式使用，而這些程式也被稱為原生應用程式。大部份API函式的名字通常以Nt開頭，例如NtDisplayString。Ntdll.dll除了被原生應用程式呼叫外，它還會被Kernel32.dll裡大部份API所使用。很大部份的視窗應用程式也不會直接呼叫Ntdll.dll。 原生應用程式使用Ntdll.dll裡的函式，一般需要比Win32子系統啟動成功前更早的執行。例如csrss.exe，Win32子系統的處理程序，因為Win32應用程式必須要在csrss.exe上執行，所以執行它的應用程序，smss.exe（會話管理員）必須要是原生應用程式。 儘管原生應用程序有.exe的副檔名，但它們並無法被使用者直接執行。例子如autochk.exe，一個用來在開機期間執行chkdsk進行磁碟檢查的程式。 因為原生應用程式不能依赖Win32子系统，所以它們的程式入口不是一般Win32應用程式的MainCRTStartup，而是NtProcessStartup。原生程式執行完畢後，它們會呼叫NtTerminateProcess並將執行結果返回。 以下程式庫包含Win32應用程式常用的函式。 Kernel32.dll提供應用程式一些Win32下的基底API，包括記憶體管理、輸入/輸出操作和同步函式。它們大部份函式皆由原生應用程式實現，例如Ntdll.dll。 Gdi32.dll提供跟圖形裝置界面有關的函式，例如輸出到顯示卡和列印機的原生繪圖功能。呼叫這個程式庫裡函式的應用程式通常是為了執行底層的繪圖功能、文字輸出、字型管理或其他相似功能。 初時GDI只支援16或256色的EGA/VGA顯示卡和單色列印機，不過GDI的功能已經漸漸升。直到現在它更支援TrueType字型、半透明通道和多螢幕支援。 User32.dll提供創建和管理Windows圖形界面的功能，例如桌面、視窗和功能表。裡面的函式可以讓應用程式建立及管理視窗、接收Windows訊息（諸如使用者的輸入或系統的通知）、在視窗中顯示文字，及顯示一個訊息視窗。 這個函式庫裡面大部份函式也需要倚靠Gdi32.dll提供的繪圖功能，來對使用者界面進行渲染。有些程式還會直接使用GDI函式，來對先前由User32.dll所建立的視窗進行底層繪圖。 comctl32.dll主要提供各種標準視窗界面元件。它提供對話框如開啟檔案、存檔及另存新檔，或視窗元件如按鈕和進度列。它倚靠user32.dll和Gdi32.dll來建立及管理這些界面元素。 Windows NT Windows API 動態連結庫 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.  Eilam, Eldad. Reversing: Secrets of Reverse Engineering. John Wiley & Sons. 2011: 68–69. ISBN 978-1-118-07976-8.  Inside Native Windows Applications. [2011-12-14]. （原始内容存档于2010-09-12）.  Russinovich, Mark A. & Solomon, David A. Windows® Internals. O'Reilly Media. 2009: 136. ISBN 978-0-7356-3796-2.  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.  Visual Studio Developer Center: Identifying Functions in DLLs. [2012-08-23]. （原始内容存档于2016-10-11）.  See also, the documentation for the Wine implementation of gdi32.dll: Wine API: gdi32.dll （页面存档备份，存于互联网档案馆） 維基教科書中的相關電子教程：Windows Programming/GDI and Drawing API calls list - USER32.DLL - Tips for using the User API Client Library with Visual Basic API calls list - Kernel32.dll - Tips for using the Kernel API Client Library with Visual Basic Native API reference Unofficial website that documents most of the Native API methods （页面存档备份，存于互联网档案馆） Retrieving the kernel32.dll base address （页面存档备份，存于互联网档案馆）