小華的部落格: WDM 筆記2

搜尋此網誌

星期四, 8月 30, 2007

WDM 筆記2

自己學習WDM果然還是有許多問題無法解決,也只能邊學邊做筆記,做的筆記也不知道是對是錯,只能說WDM真難搞,難怪外面的WDM課程都那麼貴。

//----------------------
// ACP CreateFile
//----------------------
CreateFile() 可以去取得某個Driver的Handle,而這個API使用的是WDM Driver中的外部名稱,但是一般Driver命名方式除了直接給名稱之外還可以使用GUID(一串數字),而這兩種差別在下面比較:
外部名稱:
(1) 直接命名 : \\DeviceDos\\MyDriver
(2) GUID : DEFINE_GUID GUID_DEVICE_MYDRIVER 1234-ABCD-7890123ABCD-....
所以如果Driver是使用GUID,則必須透過一些方式轉換成CreateFile()可以使用的格式。

//------------------------
// 外部名稱的取得
//------------------------
想要對某個Driver送IRP,首先就要利用CreateFile()取得Driver Handle,而這個函數又需要知道Driver的外部名稱,那如何知道Driver的外部名稱是什麼?
這邊又要把Driver分成兩種:
(1) Inbox Driver: 這種型態的驅動程式指的是OS本身提供的,那這些Driver幾乎都是GUID命名,而這個GUID可以在DDK中找到,找xxx.h內的宣告,或是直接搜尋關鍵字 "DEFINE_GUID" or "GUID_DEVICE_HDD"
其中"GUID_DEVICE_HDD"也可以是"GUID_DEVICE_BATTERY",看你是哪個設備的Driver你就打什麼名稱,如果找不到就要另外想辦法囉。

(2) Non-Inbox Driver : 這類的驅動程式就是指廠商自己寫的,例如ATI...etc. 而這類的驅動程式一般廠商會提供GUID,或是在廠商提供的xxx.inf 內搜尋。

//-------------------------------
// Release Driver
//-------------------------------
一般Release Driver會給3個檔案:
(1) xxx.inf : 這是類似Script的東西,用來把Driver的一些資訊告訴OS,也就是會安裝一些資訊到Registry之中(例如 : ...\Service\{ServiceName}),而INF檔案裡面有其格式,可參考MSDN說明,其中就包含Driver的GUID,另外在[DeviceList]下面宣告的就是所謂的Hardware ID。
(2) xxx.sys : Driver COnpiler好之後的檔案,也就是實際的程式碼檔案。
(3) xxx.cat : 當經過WHQL後會有這個檔案可以使用,OS就會認定這個Driver是屬於經過認證的驅動程式,當然也可以做一個假的來測試。

//--------------------------------
// Driver Stack
//--------------------------------
Filter-DO: 過濾Driver
Function-DO : 一般設備的驅動程式都稱為Function-DO
PDO: Bus Driver

一般PDO還可以看做下一層的Driver,因為OS會把Driver堆疊起來,所謂的堆疊就是利用DeviceObject內的某個LowerDeviceObject欄位指向另一個DeviceObject,而LowerDeviceObject 指過去的Driver就是PDO,也就是下一層Driver,如果剛好是Bus Driver,那麼PDO=Bus Driver...

NTSTATUS AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT pdo)
{
NTSTATUS ntStatus = IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION),
NULL, FILE_DEVICE_UNKNOWN, 0, FALSE, &fdo);
....
pdx->LowerDeviceObject = IoAttachDeviceToDeviceStack(fdo, pdo);
....
}

由範例程式可以看到當PnP Manager 通知Driver去執行AddDevice()函數時,會跟我們的Driver說下一層的PDO是誰(當成參數傳給AddDevice()),然後我們先去為我們的Driver建立一個DeviceObject,這個DO也就是FDO,然後把我們的FDO 連接(Attach)在某個PDO上面,這樣子是不是就長的很像Stack ?

2 則留言:

阿君 提到...

真高興發現有同好~ 大家一起來學WDM唷!!!

匿名 提到...

小華前輩,您好,
最近在找關於ACPI driver的資料時,在程式設計俱樂部的討論區有看到n年前您有嘗試著撰寫一個WDM Driver,然後讓您的Application可以去呼叫ACPI 內的Method,而Weber前輩有給您一些建議,可否冒昧請教您後來有繼續完成此driver嗎?是否可以給後輩一些指點與建議,可以介紹幾本好書或一些資料或是Spec讓小妹參考嗎? 謝謝!
我目前只知道大槪是要請BIOS那邊虛擬一個device讓我可以安裝此device的acpi driver,但此device的ASL code該如何設,及如何運用acpi.sys及MSSMBIOS.SYS,就不知該如何著手?我目前是參考"ACPI Driver Interface in Windows Vista"及ACPI Spec.