一個函數(shù)在被調(diào)用但還未返回時,又再次被調(diào)用的情況下,保證結(jié)果的可靠,則這個函數(shù)是多線程安全的.
在內(nèi)核代碼中,DriverEntry DriverUnload 是由系統(tǒng)進程的單一線程調(diào)用的,不會出現(xiàn)多線程同時調(diào)用的情況.
但是 各種分發(fā)函數(shù),完成函數(shù)和各種NDIS回調(diào)函數(shù)都是運行在多線程環(huán)境的,需要保證多線程安全,方法如只使用函數(shù)內(nèi)部資源夺巩、完全不使用全局變量逃延、靜態(tài)變量或其他全局性資源,或者使用同步手段來限制同一時刻只有一個線程訪問,則可以保證多線程安全.
中斷級主要有 Passive(被動) 級和 Dispatch(派遣) 級兩種, Dispatch 級比 Passive 級高.需要注意使用內(nèi)核API時的中斷級要求.許多復(fù)雜功能的內(nèi)核API都要求在 Passive 級執(zhí)行.
簡單的判斷正在編寫的代碼可能的中斷級:
1.如果調(diào)用路徑中沒有導(dǎo)致中斷級提高或者降低,則函數(shù)執(zhí)行時的中斷級和調(diào)用源的中斷級一樣.
2.路徑上有獲取自旋鎖,中斷級上升.有釋放自旋鎖,則中斷級下降.
DriverEntry DriverUnload , 各種分發(fā)函數(shù) passive級
完成函數(shù) 各種 NDIS 回調(diào)函數(shù) dispatch級
不能強制降低中斷級,可以使用其他方法解決,比如生成一個線程來專門執(zhí)行passive級的代碼
WDK特殊代碼
#define IN 空宏,在代碼中出現(xiàn)不會有任何影響,用來做參數(shù)說明
#pragma alloc_text(INIT, DriverEntry) 宏指定可執(zhí)行代碼編譯后在文件中的位置. 參數(shù)1=節(jié),參數(shù)2=函數(shù)
內(nèi)核模塊編譯出來后是一個PE格式的sys文件,文件的代碼段(text段)有不同的節(jié)(Section),不同的節(jié)被加載到內(nèi)存照片那個之后處理情況不同.
INIT節(jié)的特點實在初始化完畢之后就被釋放,不在占用內(nèi)存空間.
PAGE節(jié)的特點是位于可以進行分頁交換的內(nèi)存空間(在內(nèi)存緊張時可以被交換到硬盤).
代碼默認(rèn)位于 PAGELK節(jié),加載后位于不可分頁交換的內(nèi)存空間.