2 從組合語言到Windows核心程式設計筆記 2

2022-02-12 18:53:45 字數 2436 閱讀 1843

核心執行緒

在驅動中生成的執行緒一般是系統執行緒。系統執行緒所在的程序名為「system」

。ntstatus

pscreatesystemthread(

out phandle threadhandle,

in ulong desiredaccess,

in pobject_attributes objectattributes optional,

in handle processhandle optional,

out pclient_id clientid optional,

in pkstart_routine startroutine,

in pvoid startcontext);

來完成。此外得到的控制代碼也必須要用

zwclose

來關閉。關閉控制代碼並不結束執行緒。

睡眠#define delay_one_microsecond (-10)

#define delay_one_millisecond (delay_one_microsecond*1000)

void mysleep(long msec)

核心中的事件是乙個資料結構。這個結構的指標可以當作乙個引數傳入乙個等待函式中。如果這個事件不被「設定」

,則這個等待函式不會返回,這個執行緒被阻塞。如果這個事件被「設定

」,則等待結束,可以繼續下去。

事件不需要銷毀。

可以發現,關於事件的操作這一部分(如事件的重設,同步等),其原理和mfc

中是很類似的,只是

mfc中封封裝了更好處理的

api函式而已。

實際上等待執行緒結束並不一定要用事件。執行緒本身也可以當作乙個事件來等待。

驅動與裝置和請求處理

#include

ntstatus

driverentry (

in pdriver_object driverobject,

in punicode_string registrypath

)函式driverentry

是每個驅動程式中必須的。如同

win32

應用程式裡的

winmain

。driverentry

的第乙個引數就是乙個

driver_object

的指標。這個

driver_object

結構就對應當前編寫的驅動程式。其記憶體是

windows

系統已經分配的。

第二個引數registrypath

是乙個字串。代表乙個登錄檔子鍵。這個子鍵是專門分配給這個驅動程式使用的。用於儲存驅動配置資訊到登錄檔中。

driver_object中含有分發函式指標。這些函式用來處理發到這個驅動的各種請求。

windows

總是自己呼叫

driver_object

下的分發函式來處理這些請求。所以編寫乙個驅動程式,本質就是自己編寫這些處理請求的分發函式。

ntstatus

driverentry (

in pdriver_object driverobject,

in punicode_string registrypath)…

}ntstatus mydispatchfunction(pdevice_object device,pirp irp)

void mydriverunload(pdriver_object driver)

這個函式的位址設定到driverobject->driverunload

即可。如果驅動程式要和應用程式之間通訊,則應該生成裝置。此外還必須為裝置生成應用程式可以訪問的符號鏈結。

「\\.\」意味後面是乙個符號鏈結名。 目前生成裝置,請總是生成在

\device\

目錄下。

應用程式為了和驅動通訊,首先必須開啟裝置。然後傳送或者接收資訊。最後關閉它。這至少需要三個irp

:第乙個是開啟請求。第二個傳送或者接收資訊。第三個是關閉請求。

應用層呼叫的api

驅動層收到的

irp主功能號

createfile irp_mj_create

closehandle irp_mj_close

deviceiocontrol irp_mj_device_control

readfile irp_mj_read

writefile irp_mj_write

關於上述幾項內容的專題論述,請參見相關文件。[5,6]

參考[1]

[2]

[3 [4]

[5] windows驅動程式設計基礎教程

.doc

[6] 天書夜讀

-從組合語言到

windows

核心程式設計(改

)[7] windows ddk

[8] 天書夜讀——從組合語言到windows核心程式設計

3 從組合語言到Windows核心程式設計筆記 3

windows核心 一 sys放在 drivers 目錄下。執行在 r0層。在wdk 的相應環境中,進行相應 目錄,build.乙個核心程式被看作乙個pe 格式的dll 它是被 windows 整個核心呼叫的乙個 dll,一旦加裁,就成為核心的組成部分。所有的核心記憶體空間是共享的。核心程式崩潰,w...

1 從組合語言到Windows核心程式設計筆記 1

彙編部分 1 call 的本質相當於 push jmp,ret 的本質相當於 pop jmp。2 windows中,不管哪種呼叫方式都是返回值放在 eax中,然後返回。外部從 eax中得到值。3 ebp總是被我們用來儲存這個函式執行之前的 esp的值。4 把區域性變數區域初始化成全0cccccccc...

從機器語言到組合語言

機器語言是計算機唯一能接受和執行的語言。機器語言由二進位製碼組成,每一串二進位製碼叫做一條指令。一條指令規定了計算機執行的乙個動作。一台計算機所能懂得的指令的全體,叫做這個計算機的指令系統。不同型號的計算機的指令系統不同。指令通常由幾個位元組組成,第乙個位元組是操作碼,它規定了計算機要執行的基本操作...