Condividi tramite


Definizione di un oggetto Callback

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

diagramma che illustra la definizione di un oggetto callback.

Prima di creare l'oggetto, il driver chiama InitializeObjectAttributes per impostare i relativi 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 in cui ricevere un handle all'oggetto callback. Passa anche due booleani, che indica se il sistema deve creare l'oggetto 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 cui chiamerà le routine di callback registrate. Le condizioni prendono la forma di due argomenti, ognuno che punta a un parametro definito dal driver che crea il callback. È necessario documentare queste condizioni, insieme al nome dell'oggetto callback e all'oggetto 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 stati registrati, passando i due argomenti e un puntatore al contesto fornito quando è stata registrata la routine. Il driver deve chiamare ExNotifyCallback in IRQL = DISPATCH_LEVEL. Il sistema chiama le routine di callback allo stesso 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 decrererne il conteggio dei riferimenti e assicurarsi che l'oggetto venga eliminato.