Uso di una routine CustomTimerDpc

Per disabilitare un oggetto timer impostato in precedenza, un driver chiama KeCancelTimer. Questa routine rimuove l'oggetto timer dalla coda timer del sistema. In genere, l'oggetto timer non è impostato sullo stato segnalato e la routine CustomTimerDpc non viene accodata per l'esecuzione. Tuttavia, se il timer sta per scadere quando viene chiamato KeCancelTimer , la scadenza potrebbe verificarsi prima che KeCancelTimer abbia la possibilità di accedere alla coda temporale, nel qual caso si verificherà la segnalazione e l'accodamento DPC.

Il richiamo di KeSetTimer o KeSetTimerEx, con puntatori Timer e Dpc specificati in precedenza, prima della scadenza dell'intervallo specificato in precedenza, ha gli effetti seguenti:

  • Il kernel rimuove l'oggetto timer dalla coda timer, senza impostare l'oggetto sullo stato segnalato o accodando la routine CustomTimerDpc .

  • Il kernel reinsere l'oggetto timer nella coda timer usando il nuovo valore DueTime .

L'uso dello stesso oggetto timer per scopi diversi può causare condizioni di gara o errori gravi del driver. Si supponga, ad esempio, che un driver specifica un singolo oggetto timer per configurare una chiamata a una routine CustomTimerDpc e per configurare le attese in un thread dedicato al driver. Ogni volta che il thread dedicato al driver chiama KeSetTimer, KeSetTimerEx o KeCancelTimer per l'oggetto timer comune, il thread annulla le chiamate alla routine CustomTimerDpc, se l'oggetto timer è già stato accodato per una chiamata CustomTimerDpc.

Se un driver ha routine CustomTimerDpc e attende anche gli oggetti timer in un contesto di thread non arbiverso, deve:

  • Non usare mai un oggetto timer sensibile al contesto thread in un contesto di thread non arbiverso o viceversa.

  • Allocare un oggetto timer separato per ogni routine CustomTimerDpc . Ogni set di thread driver o routine driver chiamati in un contesto di thread non arbiverso deve avere un proprio set di oggetti timer "waitable".

Se si usa una routine CustomTimerDpc, scegliere attentamente l'intervallo che il driver passa nelle chiamate a KeSetTimer o KeSetTimerEx. Si considerino inoltre tutti gli effetti possibili di una chiamata a KeCancelTimer con lo stesso oggetto timer di qualsiasi routine driver che effettua questa chiamata, in particolare sulle piattaforme SMP.

Tenere presente quanto segue sulle routine CustomTimerDpc :

Una sola istanza di un oggetto DPC che rappresenta una determinata routine DPC può essere accodata per l'esecuzione in qualsiasi momento.

Se una seconda routine driver chiama KeSetTimer o KeSetTimerEx per eseguire la stessa routine CustomTimerDpc prima della scadenza dell'intervallo specificato dal primo chiamante, la routine CustomTimerDpc viene eseguita solo dopo la scadenza dell'intervallo specificato dal secondo chiamante. In queste circostanze, CustomTimerDpc non esegue alcun lavoro per il quale la prima routine denominata KeSetTimer o KeSetTimerEx.

Per i driver che dispongono di routine CustomTimerDpc e usano timer periodici:

Un driver non può deallocare un timer periodico da una routine DPC. I driver possono deallocare solo timer nonperiodici da una routine DPC.

Prendere in considerazione le linee guida di progettazione seguenti per i driver con routine CustomDpc eCustomTimerDpc :

Per evitare condizioni di gara, non passare mai lo stesso puntatore Dpc a KeSetTimer o KeSetTimerEx e KeInsertQueueDpc.

In altre parole, si supponga che la routine StartIo di un driver chiami KeSetTimer o KeSetTimerEx per accodare una routine CustomTimerDpc e il driver chiama contemporaneamente KeInsertQueueDpc da un altro processore con lo stesso puntatore Dpc. Questa routine DPC verrà eseguita quando IRQL in un processore scende sotto DISPATCH_LEVEL o l'intervallo di timer scade, a seconda del primo. Tuttavia, alcune operazioni essenziali per StartIo o ISR verranno semplicemente eliminate dalla routine DPC.

Inoltre, un DPC usato da due routine di driver standard con funzionalità molto diverse avrebbe caratteristiche di prestazioni inferiori rispetto alle routine CustomTimerDpc e CustomDpc . Il DPC deve determinare quali operazioni eseguire, a seconda delle condizioni che hanno causato la coda della routine StartIo o dell'ISR. I test per queste condizioni nel DPC userebbero cicli di CPU aggiuntivi.