編譯和調試
使用wdk編譯,源代碼應包括wdf.h,ntddk.h以及kmdf_version=1,編譯使用/gs。
kmdf包括以下庫:
1). wdfdriverentry.lib(編譯時綁定):驅動入口,調用驅動的driverentry。
2). wdfmm000.sys:ddi庫,安裝驅動時候,由co-installer來完成該sys的安裝,驅動運作時動态綁定之。
3). wdfldr.sys:引導庫,加載ddi庫,綁定到驅動中,由co-installer來完成該sys的安裝。
kmdf釋出一些調試工具和符号檔案以便于調試驅動。
安裝
使用co-install和inf檔案安裝kmdf驅動,是以安裝包包括:inf檔案,co-install的dll,驅動sys,可選安裝程式。
1). inf檔案包括wdf段(指定服務名以及kmdf的版本),并引用co-install,co-install包括cab資源包。該cab包括ddi庫和引導庫。
2). dll,導出cab檔案,cab的所有内容都是簽名過的元件。如果co-install驗證失敗,驅動不能被安裝。
版本和動态綁定
os加載kmdf驅動時,驅動動态綁定到wdfmm000.sys,多個驅動共享相應的dll,相同主版本的dll可以同時存在。當編譯kmdf時候,連結了wdfdriverentry.lib,該lib包含kmdf的版本資訊,并連結進入驅動sys檔案,其中的fxdriverentry封裝了驅動的driverentry函數,而成為驅動的入口點。驅動加載步驟如下:
1). fxdriverentry調用wdfversionbind傳wdfmm000.sys的版本資訊。
2). os檢測相同版本的庫是否加載,如果沒有,啟動代表該庫的服務,然後加載庫和驅動。如果加載,os把驅動增加為該服務的客戶,傳回相關資訊給fxdriverentry。如果驅動需要和已經加載的庫版本不一樣的庫,那麼加載失敗,并寫入系統事件日志。
3). fxdriverentry調用driverentry,後者又調用kmdf去建立驅動對象。
不同主版本号的kmdf庫可以同時運作,但是同主版本号不同次版本的庫不能同時運作。驅動安裝時,次版本号最新的庫将覆寫舊的庫,如果此時舊的庫已經被加載,那麼需要重新開機os。
對于os啟動時加載的驅動,情況不同,因為kmdf庫必須先于驅動加載,是以安裝的時候,co-installer從inf檔案中先判斷驅動是否是啟動加載型的,如果是,必須改變kmdf服務的啟動類型(使得os啟動時候啟動該服務)和設定其加載次序(使得其先于客戶驅動而被加載)。