前言 :
等待是驅動程式中經常用到的, 這裡將 DDK 等待的方法彙總. 總共有四種辦法, 讀者可以根據自己的需要進行選擇.
第一種方法 : 使用 KeWaitForSingleObject
第一種方法是使用 KeWaitForSingleObject 函式. 該函式在前面已經介紹過, 其主要用來等待內核同步對像, 但是也可以用來等待一段時間.
首先初始化一個內核同步物件, 其初始化狀態為未觸發狀態. 然後呼叫 KeWaitForSingleObject 並對其設置 timeout 參數, 該參數是需要等待的時間. 下面程式碼演示了如何用 KeWaitForSingleObject 等待一段時間.
第二種方法 : 使用 KeDelayExecutionThread
第二種方法是使用內核函式 KeDelayExecutionThread, 該內核函式和 KeWaitForSingleObject 類似, 都是強制當前執行緒進入睡眠狀態. 經過指定時間後, 執行時間恢復執行. 下面程式碼演示了如何使用 KeDelayExecutionThread 等待一段時間.
第三種方法 : 使用 KeStallExecutionProcessor
第三種方法是使用內核函式 KeStallExecutionProcessor, 該內核函式是讓 CPU 處於忙碌等候狀態, 而不是處於睡眠. 經過指定時間後, 繼續讓執行緒執行.
這種方法是讓 CPU 不停地等待, 而不是讓執行緒進入休眠, 類似於自旋鎖. 因此這種方法浪費 CPU 時間. DDK 文檔規定 KeStallExecutionProcessor 不宜超過 50us. 由於沒有執行緒進入睡眠, 也不會發生執行緒的切換, 因此這種方法的延時比較精確. 下面程式碼演示了如何使用 KeStallExecutionProcessor 等待一段時間 :
第四種方法 : 使用計時器
第四種方法是使用計時器物件, 注意這和前面講的 DPC 計時器略有不同. 這裡沒有用到 DPC 物件與 DPC 常式, 因此當指定時間到後, 不會進入 DPC 常式.
計時器物件和其他內核同步物件一樣, 也式有兩個狀態, 一個是未激發狀態, 一個是激發狀態. 在初始化計時器時, 計時器處於未激發狀態. 當使用 KeSetTimer 後, 經過指定時間, 進入激發狀態. 這樣就可以使用 KeWaitForSingleObject 函式對計時器進行等待, 以下是一段範例代碼 :
等待是驅動程式中經常用到的, 這裡將 DDK 等待的方法彙總. 總共有四種辦法, 讀者可以根據自己的需要進行選擇.
第一種方法 : 使用 KeWaitForSingleObject
第一種方法是使用 KeWaitForSingleObject 函式. 該函式在前面已經介紹過, 其主要用來等待內核同步對像, 但是也可以用來等待一段時間.
首先初始化一個內核同步物件, 其初始化狀態為未觸發狀態. 然後呼叫 KeWaitForSingleObject 並對其設置 timeout 參數, 該參數是需要等待的時間. 下面程式碼演示了如何用 KeWaitForSingleObject 等待一段時間.
第二種方法 : 使用 KeDelayExecutionThread
第二種方法是使用內核函式 KeDelayExecutionThread, 該內核函式和 KeWaitForSingleObject 類似, 都是強制當前執行緒進入睡眠狀態. 經過指定時間後, 執行時間恢復執行. 下面程式碼演示了如何使用 KeDelayExecutionThread 等待一段時間.
第三種方法 : 使用 KeStallExecutionProcessor
第三種方法是使用內核函式 KeStallExecutionProcessor, 該內核函式是讓 CPU 處於忙碌等候狀態, 而不是處於睡眠. 經過指定時間後, 繼續讓執行緒執行.
這種方法是讓 CPU 不停地等待, 而不是讓執行緒進入休眠, 類似於自旋鎖. 因此這種方法浪費 CPU 時間. DDK 文檔規定 KeStallExecutionProcessor 不宜超過 50us. 由於沒有執行緒進入睡眠, 也不會發生執行緒的切換, 因此這種方法的延時比較精確. 下面程式碼演示了如何使用 KeStallExecutionProcessor 等待一段時間 :
第四種方法 : 使用計時器
第四種方法是使用計時器物件, 注意這和前面講的 DPC 計時器略有不同. 這裡沒有用到 DPC 物件與 DPC 常式, 因此當指定時間到後, 不會進入 DPC 常式.
計時器物件和其他內核同步物件一樣, 也式有兩個狀態, 一個是未激發狀態, 一個是激發狀態. 在初始化計時器時, 計時器處於未激發狀態. 當使用 KeSetTimer 後, 經過指定時間, 進入激發狀態. 這樣就可以使用 KeWaitForSingleObject 函式對計時器進行等待, 以下是一段範例代碼 :
This message was edited 4 times. Last update was at 27/01/2011 12:07:56
沒有留言:
張貼留言