44、Windows驅動程式模型筆記(二)

來源:互聯網
上載者:User

圖示 原圖2-13 DRIVER_OBJECT資料結構

    I/O管理器使用驅動程式對象來代表每個裝置驅動程式,見圖2-13。就象我們將要討論的許多資料結構一樣,驅動程式對象是部分不透明的。這意味著雖然 DDK頭中公開了整個結構,但我們僅能直接存取或修改結構中的某些域。在圖中,我把驅動程式對象的不透明域用灰背景表示。這些不透明域類似於C++類中的私人成員或保護成員,而透明域類似於公用成員。

1、DRIVER_OBJECT資料結構

    DeviceObject(PDEVICE_OBJECT) 指向一個裝置對象鏈表,每個裝置對象代表一個裝置。I/O管理器把多個裝置對象串連起來並維護這個域。非WDM驅動程式的DriverUnload函數利用這個域來遍曆裝置對象列表,以便刪除其中的裝置對象。WDM驅動程式沒有必要使用這個域。

    DriverExtension(PDRIVER_EXTENSION) 指向一個不大的子結構,其中只有AddDevice(PDRIVER_ADD_DEVICE)成員可以直接存取,見圖2-14。AddDevice是一個指標,它指向驅動程式中建立裝置對象的函數。

圖示 圖2-14. DRIVER_EXTENSION資料結構

    FastIoDispatch(PFAST_IO_DISPATCH)指向一個函數指標表,這些函數是由檔案系統和網路驅動程式輸出的。

    DriverStartIo(PDRIVER_STARTIO)指向驅動程式中處理串列I/O請求的函數,I/O管理器自動為驅動程式序列化多個I/O請求。

    DriverUnload (PDRIVER_UNLOAD)指向驅動程式中的清除函數。我將在DriverEntry函數後面討論該函數,實際上,WDM驅動程式根本就沒有什麼重要的清除工作要做。

    MajorFunction (array of PDRIVER_DISPATCH)是一個函數指標表,指向存在於驅動程式中的二十多種IRP處理函數。

2、DEVICE_OBJECT結構

    WDM驅動程式可以調用IoCreateDevice函數建立裝置對象,但裝置對象的管理則由I/O管理器負責。

圖示 圖2-15 DEVICE_OBJECT結構

    DriverObject(PDRIVER_OBJECT)指向與該裝置對象相關的驅動程式對象,通常就是調用IoCreateDevice函數建立該裝置對象的驅動程式對象。過濾器驅動程式有時需要用這個指標來尋找被過濾裝置的驅動程式對象,然後查看其MajorFunction表項。

    NextDevice(PDEVICE_OBJECT)指向屬於同一個驅動程式的下一個裝置對象。是這個域把多個裝置對象串連起來,起始點就是驅動程式對象中的DeviceObject成員。WDM驅動程式沒有必要使用這個域。

    CurrentIrp(PIRP)指向最近發往驅動程式StartIo函數的I/O請求包。

    Characteristics(ULONG)是另一組標誌位,描述裝置的可選特。

    DeviceExtension(PVOID)指向一個由使用者定義的資料結構,該結構可用於儲存每個裝置執行個體的資訊。I/O管理器為該結構分配空間,但該結構的名字和內容完全由使用者決定。一個常見的做法是把該結構命名為DEVICE_EXTENSION。使用給定的裝置對象指標fdo可訪問這個使用者結構,代碼如下:

PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;

    StackSize(CCHAR)統計從該裝置對象開始向下直到PDO之間的裝置對象個數。該域的目的是告訴其它代碼,如果把該裝置對象的驅動程式作為其 IRP的第一發送對象,那麼應在這個IRP中建立多少個堆棧單元(stack location)。WDM驅動程式通常不需要修改該值,因為建立裝置堆疊的支援函數會自動完成這個任務。

在前面DEVICE_OBJECT的討論中,通過個NextDevice域把所有屬於特定驅動程式的裝置對象水平地串連在一起,但還沒有描述把多個裝置對象垂直地串連成一個裝置堆疊的方法,即從上層FiDO到FDO,再到下層FiDO,最後到PDO。不透明域AttachedDevice就是用於這個目的。從PDO開始,每個裝置對象都有指向上一層裝置對象的指標。由於沒有已公開的向下方向的指標,所以驅動程式必須自己記住下層裝置對象是誰。(實際上,IoAttachDeviceToDeviceStack確實在一個結構中建立了向下方向的指標,但DDK中沒有完全聲明該結構。不要試圖去查出這個結構,它隨時都有可能被修改)

AttachedDevice 域故意沒有公開,因為要正確地使用該域需要與刪除裝置對象的代碼同步。但我們可以調用IoGetAttachedDeviceReference函數,該函數在給定的堆棧中尋找最上層裝置對象並增加參考計數,這樣可以防止該裝置對象被過早地從記憶體中刪除。如果你要自己下到PDO,可以向裝置發送一個 IRP_MJ_PNP請求,其副功能碼為IRP_MN_QUERY_DEVICE_RELATIONS,Type參數為 TargetDeviceRelation。PDO驅動程式將返回PDO的地址。但是,我猜想這個IRP是保留給系統使用的,所以你最好不要使用這個 IRP。我們完全可以在第一次建立裝置對象時記住PDO的地址。

3、DriverEntry

DriverEntry是核心模式驅動程式主進入點常用的名字。

extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)

{

...

}

    DriverEntry的第一個參數是一個指標,指向一個剛被初始化的驅動程式對象,該對象就代表你的驅動程式。WDM驅動程式的DriverEntry 常式應完成對這個對象的初始化並返回。非WDM驅動程式需要做大量額外的工作,它們必須探測自己的硬體,為硬體建立裝置對象(用於代表硬體),配置並初始化硬體使其正常工作。而對於WDM驅動程式,頗麻煩的硬體探測和配置工作由PnP管理器自動完成,我將在第六章討論PnP。如果你想知道非WDM驅動程式是如何初始化自身的,參見Art Baker的《The Windows NT Device Driver Book (Prentice Hall, 1997)》、Viscarola和Mason的《Windows NT Device Driver Development (Macmillan, 1998)》。

    DriverEntry的第二個參數是裝置服務鍵的鍵名。這個串不是長期存在的(函數返回後可能消失),如果以後想使用該串就必須先把它複製到安全的地方。

servkey.Buffer = (PWSTR) ExAllocatePool(PagedPool, RegistryPath->Length + sizeof(WCHAR));

if (!servkey.Buffer)

return STATUS_INSUFFICIENT_RESOURCES;

servkey.MaximumLength = RegistryPath->Length + sizeof(WCHAR);

RtlCopyUnicodeString(&servkey, RegistryPath);

    對於WDM驅動程式的DriverEntry常式,其主要工作是把各種函數指標填入驅動程式對象。這些指標為作業系統指明了驅動程式容器中各種子常式的位置。DriverExtension->AddDevice 指向驅動程式的AddDevice函數。PnP管理器將為每個硬體執行個體調用一次AddDevice常式。

    DriverStartIo 如果驅動程式使用標準的IRP排隊方式,應該設定該成員,使其指向驅動程式的StartIo常式。

    MajorFunction 是一個指標數組。每個WDM驅動程式必須能處理PNP、POWER、SYSTEM_CONTROL這三種請求。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.