2011-05-15 154 views
3

與WDK一起編寫的Windows內核驅動程序是什麼?什麼是Windows內核驅動程序?

與普通應用程序或服務有什麼不同?

+0

請閱讀[內核維基百科條目](http://en.wikipedia.org/wiki/Kernel_(computing))。這應該使差異非常明顯。 – DarkDust 2011-05-15 07:53:45

回答

10

內核驅動程序是針對Windows NT本地API(而不是Win32子系統的API)編寫的程序,以及在內核模式下在底層硬件上執行的程序。這意味着驅動程序需要能夠處理在進程之間切換虛擬內存上下文,並且需要編寫非常穩定的內核驅動程序 - 因爲內核驅動程序以內核模式運行,如果發生崩潰,則會導致整個系統崩潰。內核驅動程序不適用於硬件設備以外的任何設備,因爲它們需要管理訪問權限來安裝或啓動,並且因爲它們移除了內核通常爲程序崩潰提供的安全性 - 即它們自己崩潰而不是整個系統。

長話短說:

  • 驅動程序使用本機API,而不是在Win32 API
    • 這意味着,司機一般都不會顯示任何UI。
  • 驅動程序需要管理內存以及顯式分頁內存 - 使用分頁池和非分頁池等內容。
  • 驅動程序需要處理進程上下文切換,而不依賴於哪個進程在運行時碰巧擁有頁表。
  • 驅動程序無法由受限用戶安裝到內核中。
  • 驅動程序以處理器級別的特權運行。
  • 用戶級程序出錯會導致程序進程終止。駕駛員出現故障會導致系統顯示藍屏死機。
  • 驅動程序需要處理低級硬件位,如中斷和中斷請求級別(IRQL)。
+0

我可以從本地驅動程序使用Win32 API嗎? WDK中有一個用於獲取進程名稱的示例。我在WinAPI中也是這樣做的。 – userbb 2011-05-15 08:06:49

+1

@userbb:否。驅動程序無法調用Windows子系統 - 它的運行級別低於子系統。 (實際上,通常在Windows子系統啓動之前加載)您可以在Windows程序和Native程序中獲得進程的名稱。在Native程序中,只能使用Native API,而在Windows程序中,您可以使用Native API或Windows API。 – 2011-05-15 08:08:39

+1

@userbb:即,驅動程序必須調用'ZwQueryInformationProcess'才能獲取進程名稱。應用程序可以調用'ZwQueryInformationProcess','NtQueryInformationProcess'或'EnumProcessModules'。 – 2011-05-15 08:11:52

2

它是以內核模式而不是用戶模式運行的代碼。內核模式代碼可以直接訪問操作系統的內部,硬件等。

總是要編寫內核模式模塊來實現device drivers

0

內核驅動程序是「應用程序」的低級實現。
因爲它運行在內核上下文中,所以它可以直接訪問內核API和內存。

例如,內核驅動程序應使用:將文件

  • 控制訪問(密碼保護,隱藏)
  • 允許訪問非標準的文件系統(如電話分機,reiserfs的,ZFS等)和設備
  • 真正的API鉤子
  • ...還有許多其他原因

如果你想獲得更多的瞭解,您可以使用您最喜愛的搜索引擎搜索關鍵字「ring0」。