一般我們使用x86和x64平台進行編譯,它們的區別除了指標從四個位元組變為了8個位元組之外,其餘幾種型別位元組的寬度都沒有什麼變化。
ntstatus myfun()
}
typedef
struct _unicode_stringunicode_string,
*punicode_string;
//字串的字元是寬字元,雙位元組的
//定義和輸出字串
unicode_string buff =
rtl_constant_string
(l"使用字串結構體的字串");
dbgprint
("%wz\n"
,&buff)
;//輸出使用%wz
typedef staruct _driver_objectdriver_object,
*pdriver_object;
typedef
struct _list_entry list_entry,
*plist_entry,
*restricted_pointer prlist_entry;
名稱
呼叫時機
觸發呼叫的api
irp_mj_cleanup
當本驅動物件的裝置物件控制代碼被關閉(且引用計數為0),但仍有i/o請求未完成,此函式會被呼叫,可以在此函式中清理未完成的i/o請求
closehandle
irp_mj_close
當本驅動物件的裝置物件控制代碼被關閉(且引用計數為0),並且i/o請求已經被完成或已經全部取消。此函式會被呼叫,此函式相當於裝置物件的析構函式
closehandle
irp_mj_create
當本驅動物件的裝置物件被開啟(通過createfile/zwcreatefile
),此函式會被呼叫,此函式相當於裝置物件的建構函式
createfile
irp_mj_device_control
裝置控制,用於讀/寫裝置物件
deviceiocontrol
irp_mj_file_system_control
irp_mj_flush_buffers
寫輸出緩衝區或者丟棄輸入緩衝區
flushfilebuffers
irp_mj_internal_dervice_control
irp_mj_pnp
irp_mj_power
電源管理器發出的請求
irp_mj_query_information
獲取裝置物件的長度
getfilesize
irp_mj_read
讀取裝置物件的內容
readfile
irp_mj_set_information
設定裝置物件的長度
irp_mj_shutdown
irp_mj_write
將資料寫到裝置物件
writefile
利用這個結構體中儲存的驅動資訊來遍歷出所有的驅動:
#include
void ondriverunload
(pdriver_object driver)
//定義驅動資訊結構體
typedef
struct _ldr_data_table_entry s1;
}u1;
union
s2;struct
s3;}u2;
} ldr_data_table_entry,
*pldr_data_table_entry;
//遍歷驅動資訊
void enumdriver
(pdriver_object driver)
while
(ptemp!=
&pldr->inloadorderlinks);}
ntstatus driverentry
(pdriver_object driver, punicode_string reg_path)
//0xb8 bytes (sizeof)
struct _device_object
queue;
//0x34
ulong alignmentrequirement;
//0x5c
struct _kdevice_queue devicequeue;
//0x60
struct _kdpc dpc;
//0x74
ulong activethreadcount;
//0x94
void* securitydescriptor;
//0x98
struct _kevent devicelock;
//0x9c
ushort sectorsize;
//0xac
ushort spare1;
//0xae
struct _devobj_extension* deviceobjectextension;
//0xb0
void* reserved;
//0xb4
}device_object,
*pdevice_object;
//重要字段:
//1. driverobject:指出裝置物件屬於那個驅動物件
//2. nextdevie:下乙個裝置物件(乙個驅動物件可以建立多個裝置物件),這個裝置物件是同一層的
//3. attacheddevice:指向下一層驅動程式的裝置物件(可以理解為被掛載的裝置物件)
//4. currentirp:使用irp序列化時很重要,用於決定當前irp是完成還是掛起等
//5. stacksize:裝置棧的個數
//6. deviceextension:指向ldr鏈的指標
ntstatus mydispatch
(pdevice_object device,pirp irp)
;
irp也是乙個核心資料結構,這個結構更為複雜,因為它需要表示無數種實際的請求。
irp結構體部分重要字段如下:
typedef
struct _irp
associatedirp;
//io狀態,一般請求完成之後的返回情況放在這裡
io_status_block iosattus;
//irp棧空間大小
char stackcount;
//irp當前棧空間
char currentlocation;
//...
//用來取消乙個未決請求的函式
__volatile pdrivce_cancel cancelroutine;
//也是乙個緩衝區,但特性和前面兩個有所不同
pvoid userbuffer;
union;}
;}overlay;
//...
}tail;
}irp,
*pirp;
Linux核心 核心基礎知識
核心的版本號主要有四個陣列組成。比如版本號 2.6.26.1 其中,2 主版本號 6 從版本號或副版本號 26 修訂版本號 1 穩定版本號 副版本號表示這個版本是穩定版 偶數 還是開發版 奇數 上面例子中的版本號是穩定版。穩定的版本可用於企業級環境。修訂版本號的公升級包括bug修正,新的驅動以及新的...
python核心程式設計學習記錄之基礎知識
雖然對python的基礎知識有所了解,但是為了更深入的學習,要對python的各種經典書籍進行學習 第一章介紹python的優缺點,略過 第二章介紹python起步,第三章介紹python基礎,僅記錄一些有用的 python支援五種基本的數字型別 int 有符合整數 long 長整數 bool 布林...
vfio核心實現分析 (1)基礎知識
1 vfio 是乙個可以安全的把裝置 i o 中斷 dma等暴露到使用者空間,從而可以在使用者空間完成裝置驅動的框架。2 虛擬機器裝置分配 device assignment 高效能應用等都可以受益於 vfio 低開銷的使用者空間直接裝置訪問,從而獲得更高的 i o效能。實現使用者空間裝置驅動,最困...