C++第三十九篇 -- 研究一下Windows驅動開發(二)-- 驅動程序中重要的數據結構

數據結構是計算機程序的核心,I/O管理器定義了一些數據結構,這些數據結構是編寫驅動程序時所必須掌握的。驅動程序常常要建立和維護這些數據結構的實例。程序員

1、驅動對象(DRIVER_OBJECT)數據庫

每一個驅動程序會有惟一的驅動對象與之對應,而且這個驅動對象是在驅動加載的時候,被內核中的對象管理程序所建立的。數組

驅動對象用DRIVER_OBJECT數據結構表示,它做爲驅動的一個實例被內核加載,而且內核對一個驅動只加載一個實例。確切地說,是由內核中的I/O管理器負責加載的。驅動程序須要在DriverEntry中初始化。先了解一下驅動對象的數據結構。瀏覽器

》DeviceObject:每一個驅動程序會有一個或多個設備對象。其中,每一個設備對象都有一個指針指向下一個驅動對象。經過DeviceObject,就能夠遍歷驅動對象裏的全部設備對象。設備對象是由程序員本身建立的,而非操做系統完成,在驅動被卸載的時候,遍歷每一個設備對象,並將其刪除。網絡

》DriverName:顧名思義,PriveName記錄的是驅動程序的名字。這裏用UNICODE字符串記錄,該字符串通常爲\Driver\[驅動程序名稱]。數據結構

》HardwareDatabase:這裏記錄的是設備的硬件數據庫鍵名,這裏一樣用UNICODE字符串記錄。該字符串通常爲\REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM。多線程

》DriverStartIo:記錄StartIo例程的函數地址,用於串行化操做。函數

》DriverUnload:指定驅動卸載時所用的回調函數地址。ui

》MajorFunction:MajorFunction域記錄的是一個函數指針數組,也就是MajorFunction是一個數組,數組中的每一個成員記錄着一個指針,每個指針指向的是一個函數。這個函數就是處理IRP的派遣函數。spa

》FastIoDispatch:文件驅動中用到的派遣函數,參閱MSDN。

2、設備對象(DEVICE_OBJECT)

每一個驅動程序會建立一個或多個設備對象,用DEVICE_OBJECT數據結構表示。每一個設備對象都會有一個指針指向下一個設備對象,所以就造成了一個設備鏈。設備對象保存設備特徵和狀態的信息。

》DriverObject:指向驅動程序中的驅動獨享。同屬於一個驅動程序的驅動對象指向的是統一驅動對象。

》NextDevice:指向下一個設備對象。這裏指的下一個設備對象是同屬於一個驅動對象的設備,也就是同一個驅動程序建立的若干設備對象。每一個設備對象根據NextDevice域造成鏈表,從而能夠枚舉每一個設備對象。

》AttachedDevice:指向下一個設備對象。這裏指的是,若是有更高一層的驅動附加到這個驅動的時候,AttachedDevice指向的就是那個更高一層的驅動。

》CurrentIrp:在使用StartIO例程的時候,此域指向的是當前IRP結構。

》Flags:此域是一個32位的無符號整型。每個位有具體的含義。

標誌 描述
DO_BUFFERED_IO 讀寫操做使用緩衝方式(系統複製緩衝區)訪問用戶模式數據
DO_EXCLUSIVE  一次只容許一個線程打開設備句柄
DO_DIRECT_IO 讀寫操做使用直接方式(內存描述符表)訪問用戶模式數據
DO_DEVICE_INITIALIZING 設備對象正在初始化
DO_POWER_PAGABLE 必須在PASSIVE_LEVEL級上處理IRP_MJ_PNP請求
DO_POWER_INRUSH    設備上電期間須要大電流

》DeviceExtension:指向的是設備的擴展對象。每一個設備都會制定一個設備擴展對象,設備擴展對象記錄的是設備本身特殊意義的結構體,也就是程序員本身定義的結構體。另外,在驅動程序中,應該儘可能避免全局變量的使用,由於全局變量涉及不容易同步的問題。解決辦法,將全局變量存在設備擴展裏。

》DeviceType:指明設備的類型。

設備類型 描述
FILE_DEVICE_BEEP 蜂鳴器設備對象
FILE_DEVICE_CD_ROM CD光驅設備對象
FILE_DEVICE_CD_ROM_FILE_SYSTEM CD光驅文件系統設備對象
FILE_DEVICE_CONTROLLER 控制器設備對象
FILE_DEVICE_DATALINK 數據鏈設備對象
FILE_DEVICE_DFS DFS設備對象
FILE_DEVICE_DISK 磁盤設備對象
FILE_DEVICE_DISK_FILE_SYSTEM 磁盤文件系統設備對象
FILE_DEVICE_FILE_SYSTEM 文件系統設備對象
FILE_DEVICE_INPORT_PORT 輸入端口設備對象
FILE_DEVICE_KEYBOARD 鍵盤設備對象
FILE_DEVICE_MAILSLOT 郵件槽設備對象
FILE_DEVICE_MIDI_IN MIDI輸入設備對象
FILE_DEVICE_MIDI_OUT MIDI輸出設備對象
FILE_DEVICE_MOUSE 鼠標設備對象
FILE_DEVICE_MULTI_UNC_PROVIDER 多UNC設備對象
FILE_DEVICE_NAMED_PIPE 命名管道設備對象
FILE_DEVICE_NETWORK 網絡設備對象
FILE_DEVICE_NETWORK_BROWSER 網絡瀏覽器涉筆對象
FILE_DEVICE_NETWORK_FILE_SYSTEM 網絡文件系統設備對象
FILE_DEVICE_NULL 空設備對象
FILE_DEVICE_PARALLEL_PORT 並口設備對象
FILE_DEVICE_PHYSICAL_NETCARD 物理網卡設備對象
FILE_DEVICE_PRINTER 打印機設備對象
FILE_DEVICE_SCANNER 掃描儀設備對象
FILE_DEVICE_SERIAL_MOUSE_PORT 串口鼠標設備對象
FILE_DEVICE_SERIAL_PORT 串口設備對象
FILE_DEVICE_SCREEN 屏幕設備對象
FILE_DEVICE_SOUND 聲音設備對象
FILE_DEVICE_STREAMS 流設備對象
FILE_DEVICE_TAPE 磁帶設備對象
FILE_DEVICE_TAPE_FILE_SYSTEM 磁帶文件系統設備對象
FILE_DEVICE_TEANSPORT 傳輸設備對象
FILE_DEVICE_UNKNOWN 未知設備對象
FILE_DEVICE_VIDEO 視頻設備對象
FILE_DEVICE_VIRTUAL_DISK 虛擬磁盤設備對象
FILE_DEVICE_WAVE_OUT 聲音輸出設備對象
FILE_DEVICE_8042_PORT 8042端口設備對象
FILE_DEVICE_NETWORK_REDIRECTOR 網卡設備對象
FILE_DEVICE_BATTERY 電池設備對象
FILE_DEVICE_BUS_EXTENDER 總線擴展設備對象
FILE_DEVICE_MODEM 調制解調器設備對象
FILE_DEVICE_VDM VDM設備對象
FILE_DEVICE_MASS_STORAGE 大容量存儲設備對象
FILE_DEVICE_SMB SMB設備對象
FILE_DEVICE_KS 內核流設備對象
FILE_DEVICE_CHANGER 充電設備對象
FILE_DEVICE_SMARTCARD 智能卡設備對象
FILE_DEVICE_ACPI ACPI設備對象
FILE_DEVICE_DVD DVD設備對象
FILE_DEVICE_WAVE_IN 聲音輸入設備對象

根據設備的須要,須要填寫相應的設備類型。當製做虛擬設備時,應選擇FILE_DEVICE_UNKNOWN類型的設備。

》StackSize:在多層驅動狀況下,驅動與驅動之間會造成相似堆棧的結構。IRP會依次從最高層傳遞到最底層。StackSize描述的就是這個層數。

》AlignmentRequirement:設備在大容量傳輸的時候,須要內存對齊,以保證傳輸速度。

 

3、設備擴展

設備對象記錄「通用」設備的信息,而另一些「特殊」信息記錄在設備擴展裏。各個設備擴展由程序員本身定義,每一個設備的設備擴展也不盡相同。設備擴展是由指定內容和大小,由I/O管理器建立的,並保存在非分頁內存中。

在驅動程序中,儘可能避免使用全局函數,由於全局函數每每致使函數的不可重入性。重入性指的是,在多線程的程序中,多個函數並行運行,函數的運行結果不會根據函數的調用前後順序而致使不一樣。解決的辦法是,將全局變量以設備擴展的形式存儲,並加以適當的同步保護措施。除此以外,在設備擴展中,還會記錄下列一些內容:

》設備對象的反向指針。

》設備狀態或驅動環境信息。

》中斷對象指針。

》控制器對象指針。

因爲設備擴展是驅動程序專用的,它的結構必須在驅動程序的頭文件中定義。

相關文章
相關標籤/搜索