Windows系統函數庫
![本頁使用了標題或全文手工轉換](http://upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Zh_conversion_icon_m.svg/35px-Zh_conversion_icon_m.svg.png)
微軟視窗系統支援一種被稱為動態連結庫的共用程式庫。正如這種程式庫檔案的命名,它只需要被載入記憶體一次,即可被多於一個處理程式使用。本條目將會對以下伴隨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來建立及管理這些介面元素。
參見
[編輯]參考
[編輯]- ^ 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.
- ^ 3.0 3.1 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.
- ^ 6.0 6.1 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 (頁面存檔備份,存於互聯網檔案館)
外部連結
[編輯]- 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 (頁面存檔備份,存於互聯網檔案館)
|