1、summary of kernel-mode support routines
<?xml:namespace prefix = o />
決不在核心模式服務函式的引數中使用帶有側效的表示式。
2、異常
對使用者模式虛擬記憶體直接引用的**段應該用結構化異常幀保護起來。這樣的引用通常發生在呼叫mmprobeandlockpages、probeforread,和probeforwrite函式時。
當異常發生時,作業系統通過掃瞄堆疊異常幀來尋找相應的異常處理程式。
圖示 結構化異常處理邏輯
顯示了對過濾函式的兩次呼叫。一次為了定位異常處理程式,另一次為了回卷堆疊。
如果你需要獲得更多的關於異常的資訊,有兩個函式可以在__except的求值表示式中呼叫,它們可以提供本次異常的相關資訊。實際上,這兩個函式是在microsoft編譯器的內部實現的,所以僅能用於特定時刻:
•getexceptioncode() 返回當前異常的數值**。該值是乙個ntstatus值。該函式僅在__except表示式和其後的異常處理**中有效。
•getexceptioninformation() 返回exception_pointers結構的位址,該結構包含異常的所有詳細資訊,在哪發生、發生時暫存器的內容,等等。該函式僅在__except表示式中有效。
生成異常
僅當你知道存在乙個異常處理**並知道你真正在做什麼時,才可以在非任意執行緒上下文下生成乙個異常。
raiseexception
exraisestatus
exraiseaccessviolation
exraisedatatypemisalignment
有乙個地方必須使用結構化異常處理機制,那就是當呼叫mmprobeandlockpages函式鎖定被mdl(記憶體描述符表)使用的記憶體頁時,必須建立乙個異常處理例程。對於wdm驅動程式,這個問題不經常出現,因為通常你使用的mdl都已經被其它程式探測並鎖定(probe-and-lock)過。但是,由於你可以定義使用method_neither緩衝方法的i/o控制(ioctl)操作,所以你必須按下面方式寫**:
pmdl mdl = mmcreatemdl(...);
__try
__except(exception_execute_handler)
程式可以在任何irql上呼叫kebugcheckex。如果程式發現乙個不可恢復的錯誤,並且該程式繼續執行將會破壞系統,那麼該程式就呼叫kebugcheckex函式,這個函式將使系統以一種可控制的方式關閉。
43 Windows驅動程式模型筆記 一
1 通常,驅動程式在某些不可 執行緒的上下文中應該使用非同步方式處理 i o請求。我們使用術語任意執行緒上下文 arbitrary thread context 來描述驅動程式並不知道 或並不關心 處理器當前執行在哪乙個執行緒上的上下文。2 windows 2000 使用對稱多處理器模型,即所有的處...
windows驅動程式開發初探
最近,由於需求推動,自己得開始學一下在windows下如何開發驅動程式。雖然,後來由於其他的原因使得學習沒繼續下去,但是我還是把一些粗略的學習經歷與體會寫在這裡,方便自己日後捲土重來,也方便其他的對windows開發一竅不通的有志之士參考一下。一 開發的目的 二 開發的歷程 1 學習的歷程 要開發出...
Linux裝置驅動程式模型
第1章 linux裝置驅動程式模型 linux系統中包含字元裝置 塊裝置 網路裝置三類基本的裝置驅動程式。隨著技術的不斷進步,linux驅動程式體系的拓撲結構越來越複雜,linux 2.4核心已經不能適應這種形勢的需求。為此2.6核心開發了全新的裝置模型,它採用sysfs檔案系統,該檔案系統是乙個類...