核心與驅動 00 核心程式設計基礎知識

2021-10-02 12:19:45 字數 3868 閱讀 8389

一般我們使用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效能。實現使用者空間裝置驅動,最困...