Utilizzo di un oggetto callback Driver-Defined
Per utilizzare un oggetto callback definito da un altro driver, un driver apre l'oggetto e quindi registra una routine da chiamare quando viene attivato il callback, come illustrato nella figura seguente. La notifica di richiesta del driver deve conoscere il nome dell'oggetto callback e deve comprendere la semantica degli argomenti passati alla routine di callback.
Prima di poter aprire l'oggetto, il driver deve chiamare InitializeObjectAttributes per creare un blocco di attributi, specificando il nome dell'oggetto. Dopo avere un puntatore a un blocco di attributi, chiama ExCreateCallback, passando il puntatore all'attributo, una posizione in cui ricevere un handle al callback e FALSE per il parametro Create , a indicare che richiede un oggetto callback esistente.
Il driver può quindi chiamare ExRegisterCallback con l'handle restituito per registrare la routine di callback.
La routine di callback ha il prototipo seguente:
typedef VOID (*PCALLBACK_FUNCTION ) (
IN PVOID CallbackContext,
IN PVOID Argument1,
IN PVOID Argument2
);
Il parametro CallbackContext è il puntatore di contesto da passare alla routine di callback ogni volta che viene chiamato. In genere, questo parametro è un puntatore a un blocco di dati di contesto, che il chiamante deve allocare dal pool non di paging se la routine può essere chiamata in DISPATCH_LEVEL. I due argomenti sono definiti dal componente che ha creato il callback. In genere, gli argomenti forniscono informazioni sulle condizioni che hanno attivato il callback.
Quando l'autore del callback attiva la notifica, il sistema chiama la routine registrata, passando un puntatore al contesto e i due argomenti. I valori per gli argomenti vengono forniti dal componente che ha creato il callback. La routine di callback viene chiamata allo stesso IRQL in cui viene attivata la notifica di creazione del driver, che è sempre IRQL <= DISPATCH_LEVEL.
Nella routine di callback, un driver può eseguire le attività necessarie per le condizioni correnti.
Quando il driver non richiede più la notifica, deve chiamare ExUnregisterCallback per rimuovere la routine dall'elenco di callback registrati e rimuovere il relativo riferimento all'oggetto callback.