46 Windows驅動程式模型筆記 四 ,異常

2021-09-08 21:18:36 字數 1311 閱讀 3217

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檔案系統,該檔案系統是乙個類...