關於開發驅動重要的核心資料結構,方便自己理解:
driver_object:
typedef struct _driver_object
cshort type;
cshort size;
//乙個鍊錶,記錄了該驅動建立的所有裝置物件
pdevice_object deiceobject;
ulong flags;
pvoid driverstart;
ulong driversize;
pvoid driversection;
pdriver_extension driverextension;
unicode_string drivername;
punicode_string hardwaredatabase;
pfast_io_dispatch fastiodispatch;
pdriver_initialize driverinit;
pdriver_startio driverstartio;
pdriver_unload driverunload;
pdriver_dispatchmajorfunction[irp_mj_maximum_function];
}driver_object,*pdriver_object
;i/o管理器在裝載驅動時,首先呼叫ioploaddriver()函式,該函式執行一下功能
1. 確定要裝載的驅動名稱,查詢該驅動是否已經被裝載。系統中包含乙個已經裝載的驅動鏈表,i/o管理器是通過查詢這個鍊錶確定驅動是否被裝載的,如果已經被裝載,則返回成功;另外登錄檔中也必須配置相關的資訊
2. 如果驅動沒有被裝載,i/o管理器請求虛擬儲存管理器(vmm)將驅動可執行檔案對映到記憶體中,vmm在對映時檢查該檔案是否為可用的pe格式,如果不是,vmm使請求失敗,驅動裝載失敗
3. i/o管理器通過物件管理器建立驅動物件,該驅動物件儲存在非分頁記憶體池中,因此任意irql都可以訪問
4. i/o管理器將驅動物件結構清零,majorfunction中的每乙個元素被設定為iopinvaliddeivicerequest()。該函式僅僅返回status_invalid_device_request狀態碼
5. i/o管理器將driverinit欄位設定為驅動的入口程式(driverentry),driversection被初始化為驅動的section物件指標,該section物件指向驅動的可執行檔案;driverstart設定為驅動映像的基址;driversize被設定為驅動映像的尺寸。
6. i/o管理器將該驅動物件插到 nt object manager維護的驅動列表中
7. hardwaredatabase欄位初始化為configuration manager的硬體配置資訊。底層驅動可以使用這個字段決定驅動啟動順序的配置;drivername也被初始化,這樣錯誤記錄服務可以記錄相關的資訊
8. i/o 管理器呼叫驅動初始化程式。該初始化程式總是在系統程序中irql_passive_level級別被呼叫。
device_object :
typedef struct _device_object queue;
ulong alignmentrequirement;
kdevice_queue devicequeue;
kdpc dpc;
ulong activethreadcount;
psecurity_descriptor securitydescriptor;
kevent devicelock;
ushort sectorsize;
ushort spare1;
pdevobj_extension deviceobjectextension;
pvoid reserved;
} device_object, *pdevice_object;
file_object:
typedef struct _file_object file_object, *pfile_object; // n***is
成員詳解:
type:乙個唯讀成員,被系統用於標識這是乙個檔案物件,如果物件是乙個檔案物件,那麼它的值就是5.
size:乙個唯讀成員,標識檔案物件的大小(位元),如果擴充套件部分存在的話,這個大小不包括檔案物件的擴充套件部分。
deviceobject:指向裝置物件,檔案在該裝置物件上開啟。
vpb:指向同檔案物件關聯的卷引數塊,如果vpb成員非空,便標識檔案存在乙個被掛載的卷上。
fscontext:指向任何驅動程式維護的檔案物件可選狀態的指標,否則為空。對檔案系統驅動程式,這個成員必須指向乙個叫做fsrtl_advanced_fcb_header
的頭結構,它包含乙個檔案系統特殊結構,否則可能會導致系統不穩定,通常,這個頭結構包含在fcb中。然而,在一些支援多資料流的檔案系統,例如ntfs,這個頭結構是流控制塊(scb)。
注意:在wdm裝置棧中,只有功能裝置物件能用兩個上下文指標,檔案系統驅動程式通過開啟多個相同的資料流共享這個成員。
fscontext2:乙個指向驅動程式維護的檔案物件的任何其他狀態,否則為空。
注意:這個成員對檔案系統棧的驅動程式是不透明的,因為底層檔案系統使用此成員。
sectionobjectpointer:指向檔案物件的唯讀區域物件。這個成員被設定成只能被檔案系統用作與快取管理器互動。
privatecachemap:乙個不透明成員,只能被檔案系統設定。它指向處理特殊資訊,被用作與快取管理器的互動。
finalstatus:乙個唯讀成員,被用作某些特定的同步事件中,標識檔案物件io請求的最終狀態
relatedfileobject:乙個指向file_object結構的指標,用作標識當前檔案物件已經開啟相對於乙個已經開啟的檔案物件。這個檔案物件通常通過這個成員指向乙個目錄(表示當前檔案已經被開啟相對於這個目錄)。然而,乙個檔案能夠重新開啟相對於它本身,乙個檔案的分支資料流能夠被開啟相對於已經開啟的同一檔案的主資料流。relatedfileobject成員只在irp_mj_create請求例程有效。
lockoperation:乙個唯讀成員。如果為false,乙個鎖操作(ntlockfile)從來沒有執行在檔案物件上。如果是真,至少有乙個鎖操作執行在檔案物件上。一旦設定成true,這個成員總是保持true(例如,釋放檔案物件上檔案鎖不會將這個成員設定成false)。
deletepending:乙個唯讀成員。如果是true,乙個檔案的刪除操作同檔案物件的存在關聯。如果是false,當前沒有待刪除的檔案物件操作。
readaccess:乙個唯讀成員,如果是true,與檔案相關聯的檔案物件已經被用作讀操作開啟,如果是false,檔案沒有被用作讀操作開啟,這個資訊被用作核查或者設定檔案的共享操作。
writeaccess:乙個唯讀成員,如果是true,與檔案相關聯的檔案物件已經被用作寫操作開啟,如果是false,檔案沒有被用作寫操作開啟,這個資訊被用作核查或者設定檔案的共享操作。
deleteaccess:乙個唯讀成員。如果是true,與檔案相關聯的檔案物件已經被用作刪除操作開啟,如果是false,檔案沒有被用作刪除操作開啟,這個資訊被用作核查或者設定檔案的共享操作。
large_integer
typedef struct _large_integer
large_integer;
初始化:
large_integer lenth =
核心資料結構
核心需要儲存i o元件使用的狀態資訊,可以通過若干核心資料結構比如說檔案開啟表等來完成 unix系統中在讀取乙個使用者檔案的時候,核心需要去檢查下快取,然後再去決定是否執行磁碟i o,在讀乙個程序映象時候,核心只需要從記憶體當中讀取資料,也就是說這些操作都可以呼叫read 函式來完成,但是語義不同 ...
核心資料結構
這部分包含了修改核心模組,所以要使用到核心鏈結表資料結構。首先你得定義乙個包含元素的結構去插入鍊錶。下邊這段 用c語言定義了生日結構 struct birthday 注意struct list head list。結構list head在包含目錄的裡有定義。它的作用就是嵌入包含列表節點的鏈結表。li...
核心資料結構mm struct
核心資料結構mm struct中的成員變數start code和end code是程序 段的起始和終止位址,start data和 end data是程序資料段的起始和終止位址,start stack是程序堆疊段起始位址,start brk是程序動態記憶體分配起始位址 堆的起始位址 還有乙個 brk...