使用Driver-Defined回呼物件

若要使用另一個驅動程式所定義的回呼物件,驅動程式會開啟 物件,然後在觸發回呼時註冊要呼叫的常式,如下圖所示。 要求通知的驅動程式必須知道回呼物件的名稱,而且必須瞭解傳遞至回呼常式之引數的語意。

說明回呼通知註冊的圖表。

在可以開啟物件之前,驅動程式必須呼叫 InitializeObjectAttributes 來建立屬性區塊,並指定物件的名稱。 屬性區塊的指標之後,它會呼叫ExCreateCallback、傳遞屬性指標、接收回呼控制碼的位置,以及Create參數的FALSE,指出它需要現有的回呼物件。

然後,驅動程式可以使用傳回的控制碼呼叫 ExRegisterCallback ,以註冊其回呼常式。

回呼常式具有下列原型:

typedef VOID (*PCALLBACK_FUNCTION ) (
    IN PVOID CallbackContext,
    IN PVOID Argument1,
    IN PVOID Argument2
    );

CallbackCoNtext參數是每次呼叫回呼常式時要傳遞至回呼常式的內容指標。 一般而言,此參數是內容資料的區塊指標,如果可以在DISPATCH_LEVEL呼叫常式,呼叫端應該從非分頁集區配置。 這兩個引數是由建立回呼的元件所定義。 一般而言,引數會提供觸發回呼之條件的相關資訊。

當回呼建立者觸發通知時,系統會呼叫已註冊的常式,並將指標傳遞至內容和兩個引數。 引數的值是由建立回呼的元件所提供。 回呼常式會在建立驅動程式觸發通知的相同 IRQL 呼叫,一律為 IRQL < = DISPATCH_LEVEL。

在回呼常式中,驅動程式可以執行目前條件所需的任何工作。

當驅動程式不再需要通知時,應該呼叫 ExUnregisterCallback ,從已註冊的回呼清單中移除其常式,並移除其回呼物件的參考。