(轉錄自: accessory )
最近又要在WINDOWS下面寫點驅動,於是學習了下目前比較流行的WDF,主要是UMDF。因為以前用過一陣WDM,所以對KERNEL MODE的KMDF興趣不是特別大。
WDF的全稱是Windows Driver Foundation,其中又包括了UMDF和KMDF。前者是USER LEVEL的驅動,後者是KERNEL LEVEL。在WDF出來之前,流行的WINDOWS驅動結構叫做WDM(WINDOWS DRIVER MODEL)。在WDM之前,WIN NT和WIN 95的驅動模式是不一樣的.WIN NT的比較規範,什麼東西都只能在內核做.NT這一套一直發展下來,變成了後來的WDM,WDF。不知道未來又會出現啥新名詞.WIN 95那一套很多地方限制沒有那麼嚴,這同時也造成了OS不夠穩定。在WIN 95之前,就是WIN 3.X和純真的DOS年代了。現在的BIOS依然純真,不過馬上就要變成複雜的UEFI了…. =。=
回歸正題,以前剛學WDM的時候,就被告知一切對硬件的操作都必須要在KERNEL LEVEL做才行。於是形成了一個思維定勢,只有KERNEL LEVEL才可以操作硬件。多年以後,開始學習LINUX ,驚訝的發現LINUX下面是可以允許USER LEVEL APP直接訪問硬件端口的。再看INTEL手冊,發現硬件並沒有設計成只能在KERNEL LEVEL才能訪問…這時才明白,原來WINDOWS是故意那麼設計的…
LINUX下的USER LEVEL APP也是有ROOT權限才可以訪問硬件端口。同時也有一些限制,比如處理中斷和DMA。不過能訪問端口本身已經提供了很多方便。有的時候,只想寫個小程序訪問2 ,3個IO端口。這個在LINUX下很簡單,在WINDOWS下就要自己寫驅動,或者藉助其他工具和庫了。
後來某一天,驚聞WINDOWS最新的UMDF也是在USER LEVEL下的驅動。於是心想,是不是WINDOWS終於想明白,要跟LINUX學,允許USER LEVEL APP訪問端口了呢?本來我以為是這樣的,但是一直沒仔細看UMDF。今天看了一下後,找了半天,也沒有看到類似LINUX那樣可以直接訪問端口的東西。最後發現,UMDF還是要用FILE OBJECT去訪問那些硬件……也就是說WINDOWS下直接在USER LEVEL APP訪問IO端口的夢想又泡湯了…
看來WINDOWS並沒有更改他們的設計觀念,UMDF也和LINUX下的東西有很大區別。當然,UMDF本身還是有一些優點的,讓某些驅動的編寫容易了很多,不用再工作在內核下,不再受很多限制了。另外一個有點驚訝的是,UMDF居然是基於COM的。當然也沒有用到COM的全部功能,只是用了一點。不過這個也可以看出,COM這個東西還是比較成功的。感覺UMDF這個東西就是一個APP和DEVICE DRIVER的混合體.UMDF可以提供一些設備的符號鏈接,接受其他用戶程序的調用,這點上比較像個驅動。但是在UMDF真正要訪問硬件的時候,它又不能自己幹,還要調用底層的KERNEL DEVICE DRIVER。還要用啥FILE OBJECT之類的。從這個角度看,UMDF也很像一個用戶程序。
WDF最早也是跟著VISTA出來的。話說VISTA從技術上說還是不錯的,可惜用戶體驗方面做的差了點,變成了一個失敗的產品。又一次驗證了光有技術是不夠的……