若要使用另一個驅動程式所定義的回呼對象,驅動程式會開啟 物件,然後在觸發回呼時註冊要呼叫的例程,如下圖所示。 要求通知的驅動程式必須知道回呼對象的名稱,而且必須了解傳遞至回呼例程之自變數的語意。
在可以開啟物件之前,驅動程式必須呼叫 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 ,從已註冊的回呼清單中移除其例程,並移除其回呼對象的參考。