Condividi tramite


Definizione di un oggetto callback

Un driver può creare un oggetto callback, tramite il quale altri driver possono richiedere la notifica delle condizioni definite dal driver di creazione. Nella figura seguente vengono illustrati i passaggi necessari per la definizione di un oggetto callback.

diagramma che illustra la definizione di un oggetto callback.

Prima di creare l'oggetto, il driver chiama InitializeObjectAttributes per impostarne gli attributi. Un oggetto callback deve avere un nome, che non può corrispondere al nome di un callback definito dal sistema; può avere qualsiasi altro attributo che il suo creatore ritiene appropriato, in genere OBJ_CASE_INSENSITIVE. Successivamente, il driver chiama ExCreateCallback, passando un puntatore agli attributi inizializzati e una posizione a cui ricevere un handle per l'oggetto callback. Passa anche due valori booleani, che indicano se il sistema deve creare l'oggetto di callback se tale oggetto denominato non esiste già e se l'oggetto deve consentire più routine di callback registrata.

Il driver definisce le condizioni per le quali chiamerà le routine di callback registrate. Le condizioni assumono la forma di due argomenti, ognuno che punta a un parametro definito dal driver che crea il callback. È consigliabile documentare queste condizioni, insieme al nome dell'oggetto callback e all'IRQL in cui richiede la notifica, per i client del driver.

Quando si verifica la condizione di callback, il driver chiama ExNotifyCallback, passando il relativo handle all'oggetto callback e ai due argomenti. Il sistema chiama quindi tutte le routine di callback registrate per l'oggetto callback, nell'ordine in cui sono state registrate, passando i due argomenti e un puntatore al contesto fornito al momento della registrazione della routine. Il driver deve chiamare ExNotifyCallback in IRQL <= DISPATCH_LEVEL. Il sistema chiama le routine di callback alla stessa irQL in cui il driver ha effettuato questa chiamata.

Dopo aver completato tutte le operazioni con l'oggetto callback, il driver che ha creato il callback deve chiamare ObDereferenceObject per decrementare il conteggio dei riferimenti e assicurarsi che l'oggetto venga eliminato.