基礎驅動和裝置物件關係

2021-05-13 09:01:00 字數 1156 閱讀 1385

沒事寫點基礎的東西,有寫的不當的地方,希望能指出。

寫過驅動或者正在學習驅動程式設計的人可能都碰到了驅動物件和裝置物件。driverobject和deviceobject的關係。這裡就做個說明吧。

首先來看看這兩個結構體定義,從中我們可以發現一些有意思的東西。

我們發現在driver_object中有乙個指向device_object的指標,這個指標是什麼時候進行賦值的呢。一會說。再看看device_object這個結構,我們發現其中有乙個回指向driver_object的指標,還有乙個 nextdevice,這也是乙個device_object,這又是什麼意思呢。

現在我們來一點點的解答。要對這些做乙個解答,那麼就必須說說iocreatedevice這個函式。這個函式時用來幹什麼的。大家都只要是用來生產裝置物件的。這個函式機會在核心驅動都有時有見到的。這個函式到底做了什麼呢。在這個函式中簡單的說就是生成後乙個deviceobject,並進行必要的初始化操作。然後將deviceobject中的driverobject進行填充為當前的driverobject。並將這個裝置物件插入到這個驅動的裝置列表中。就是這乙個函式完成了,之前提到的賦值問題。

這樣driverobject就和deviceobject關聯起來了。那為什麼需要關聯起來呢。有乙個值得注意的就是,系統的請求是發給裝置物件的而不是驅動物件的。可是我們根本就沒有位裝置物件編寫處理請求的處理函式。有人會說,在deiverentry中初始化的那些不就是嗎。其實這些初始化的majorfunction我們看到都是在driverobject中儲存著。當有請求過來時,裝置物件可以根據相對應的driverobject找到majorfunction表,然後再irp的io stack loction中可以定位現在應該呼叫哪個函式進行處理。這樣就不難說明為什麼要在devicobject中有乙個回指的緣故的。

而在驅動解除安裝的時候,我們需要將裝置物件刪除掉。如果乙個驅動,生成了很多物件,那麼我們怎麼乙個個刪除了。除了使用很多全域性變數來儲存每個生成的裝置物件,明顯是不可取的。我們可以將驅動物件儲存下來,這樣,在需要刪除所有的裝置物件時,就可以通過driverobject中的deviceobject,以及device_object中的nextdevice來得到所以得裝置物件了。在xp之上,我們不需要手動去得到,可以直接呼叫ioenumeratedeviceobjectlist得到。

今天就說到這裡了。

驅動物件和裝置物件

驅動物件,本質就是核心中一塊描述驅動資訊的記憶體 kd dt driver object 8988fe20 0x000 type 4 nt式驅動的型別為4 0x002 size 168 該結構體的大小 0x004 deviceobject null 自己建立的裝置物件 該驅動中所有的裝置物件會組成乙...

儲存驅動和裝置物件

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

匯流排,裝置,驅動之間關係

匯流排,裝置,驅動之間關係 再看i2c驅動迷茫時候看到 從需求的角度去理解linux系列 匯流排 裝置和驅動 感覺豁然開朗,根據部落格內容簡單總結一下。1 匯流排 匯流排代表同類裝置需要共同遵守的時序,不同匯流排硬體的通訊時序也是不同的,如i2c匯流排 usb匯流排 pci匯流排 2 裝置 裝置代表...