驅動物件和裝置物件

2021-10-08 08:21:07 字數 3369 閱讀 8554

驅動物件,本質就是核心中一塊描述驅動資訊的記憶體

kd> dt _driver_object 8988fe20

+0x000 type : 4 //nt式驅動的型別為4

+0x002 size : 168 //該結構體的大小

+0x004 deviceobject : (null) //自己建立的裝置物件 該驅動中所有的裝置物件會組成乙個鍊錶。

+0x008 flags : 0x12

+0x00c driverstart : 0xbaba8000 //驅動開始的位址

+0x010 driversize : 0x6000 //驅動的大小

+0x014 driversection : 0x89706c38

+0x018 driverextension : 0x8988fec8 //驅動的擴充套件資訊

+0x01c drivername : _unicode_string 「\driver\mydriver1」 //驅動的名字

+0x024 hardwaredatabase : 0x8067e260 「\registry\machine\hardware\description\system」 //登錄檔中的位置

+0x028 fastiodispatch : (null)

+0x02c driverinit : 0xbabac000 mydriver1!gsdriverentry+0

+0x030 driverstartio : (null) //記錄startio函式的位址,用於序列化

+0x034 driverunload : 0xbaba9030 mydriver1!unload+0 //驅動的解除安裝函式

+0x038 majorfunction : [28] 0x804f5552 nt!iopinvaliddevicerequest+0

kd> dt _driver_object 8988fe20

+0x000 type : 4

+0x002 size : 168

+0x004 deviceobject : (null)

+0x008 flags : 0x12

+0x00c driverstart : 0xbaba8000

+0x010 driversize : 0x6000

+0x014 driversection : 0x89706c38

+0x018 driverextension : 0x8988fec8

+0x01c drivername : _unicode_string 「\driver\mydriver1」

+0x024 hardwaredatabase : 0x8067e260 「\registry\machine\hardware\description\system」

+0x028 fastiodispatch : (null)

+0x02c driverinit : 0xbabac000 mydriver1!gsdriverentry+0

+0x030 driverstartio : (null)

+0x034 driverunload : 0xbaba9030 mydriver1!unload+0

+0x038 majorfunction : [28] 0x804f5552 nt!iopinvaliddevicerequest+0

0: kd> dt _device_object

+0x000 type : int2b //該結構體型別

+0x002 size : uint2b //該結構體大小

+0x004 referencecount : int4b //裝置引用的次數

+0x008 driverobject : ptr32 _driver_object //指向驅動物件結構

+0x00c nextdevice : ptr32 _device_object //指向該裝置的下乙個裝置,最後乙個裝置指向空

+0x010 attacheddevice : ptr32 _device_object //指向下乙個裝置物件,這裡指的是,如果有更高一層的驅動附加到這個驅動的時候,attacheddevice 指向的是更高一層的驅動 誰附加了我 這個值就指向誰的裝置物件指標 這個值存放在被附加的裝置物件上

+0x014 currentirp : ptr32 _irp 在使用startio函式的時候,指向當前irp結構

+0x018 timer : ptr32 _io_timer //定時器指標

+0x020 characteristics : uint4b //裝置物件特徵

+0x024 vpb : ptr32 _vpb

+0x028 deviceextension : ptr32 void //指向的是裝置的擴充套件物件,每個裝置都會指定乙個擴充套件物件。

裝置擴充套件物件記錄的是裝置自己特殊定義的結構體,也就是由程式設計師自己定義的結構體。另外,在驅動程式中,應該盡量避免全域性變數的使用,因為全域性變數涉及不容易同步的問題。解決的辦法,將全域性變數存在裝置擴充套件裡。

根據裝置的需要,需要填寫相應的裝置型別,當製作虛擬裝置時,應該選擇file_device_unknown型別的裝置

+0x030 stacksize : char //在多層驅動情況下,驅動與驅動之間會形成類似堆疊的結構,irp會依次從最高層傳遞到最底層,stacksize描述的就是這個層數

+0x034 union queue; irp鍊錶+0x05c alignmentrequirement : uint4b //裝置在大容量傳輸的時候,需要記憶體對齊,已儲存傳輸速度。

+0x060 devicequeue : _kdevice_queue //裝置佇列

+0x074 dpc : _kdpc

+0x094 activethreadcount : uint4b

+0x098 securitydescriptor : ptr32 void

+0x09c devicelock : _kevent

+0x0ac sectorsize : uint2b

+0x0ae spare1 : uint2b

+0x0b0 deviceobjectextension : ptr32 _devobj_extension

+0x0b4 reserved : ptr32 void

儲存驅動和裝置物件

儲存裝置棧由處理系統上儲存裝置 i o的驅動建立的樹狀裝置物件組成。樹的根節點是儲存介面卡或整合於其它儲存棧的驅動棧的功能性裝置物件 fdo 樹的子節點是檔案系統和使用者模式應用程式使用的裝置物件。如任一pnp驅動相同,通過 iocreatedevice 建立裝置物件,ioattachdevicet...

基礎驅動和裝置物件關係

沒事寫點基礎的東西,有寫的不當的地方,希望能指出。寫過驅動或者正在學習驅動程式設計的人可能都碰到了驅動物件和裝置物件。driverobject和deviceobject的關係。這裡就做個說明吧。首先來看看這兩個結構體定義,從中我們可以發現一些有意思的東西。我們發現在driver object中有乙個...

IRP 驅動物件 裝置物件簡短介紹

irp請求 向最終裝置申請執行某個操作的請求,它在核心中以乙個資料結構 irp 的形式存在,具有相關的約定和規範。驅動物件 表示系統核心中載入的乙個驅動程式的資料結構 driver object 裝置物件 最終接收 響應乙個irp請求的物件。在核心中,也是乙個資料結構 device object 的...