核心執行緒
在驅動中生成的執行緒一般是系統執行緒。系統執行緒所在的程序名為「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...
從機器語言到組合語言
機器語言是計算機唯一能接受和執行的語言。機器語言由二進位製碼組成,每一串二進位製碼叫做一條指令。一條指令規定了計算機執行的乙個動作。一台計算機所能懂得的指令的全體,叫做這個計算機的指令系統。不同型號的計算機的指令系統不同。指令通常由幾個位元組組成,第乙個位元組是操作碼,它規定了計算機要執行的基本操作...