Condividi tramite


Registrazione e accodamento di una routine CustomTimerDpc

Un driver può registrare una routine CustomTimerDpc chiamando le routine seguenti, in genere dalla routine AddDevice :

  1. KeInitializeDpc per registrare la routine

  2. KeInitializeTimer o KeInitializeTimerEx per configurare un oggetto timer

Successivamente, il driver può chiamare KeSetTimer o KeSetTimerEx per specificare un'ora di scadenza e aggiungere l'oggetto timer alla coda timer del sistema. Quando viene raggiunta l'ora di scadenza, il sistema dequeue l'oggetto timer e chiama la routine CustomTimerDpc . La figura seguente illustra queste chiamate.

diagramma che illustra l'uso di oggetti timer e dpc per una routine customtimerdpc.

Come illustrato nella figura precedente, il driver deve fornire l'archiviazione per un oggetto DPC e un oggetto timer. La maggior parte dei driver fornisce l'archiviazione per questi oggetti in un'estensione del dispositivo o in un altro driver allocato, memoria residente.

Nella chiamata a KeSetTimer, il driver passa puntatori agli oggetti Dpc e Timer , insieme a un DueTime espresso in unità di 100 nanosecondi, come illustrato nella figura precedente. Un valore positivo per DueTime specifica un'ora di scadenza assoluta (dal 1° gennaio 1601) in cui deve essere chiamata la routine CustomTimerDpc . Un valore negativo per DueTime specifica una scadenza relativa.

Poiché un timer assoluto scade in un momento di sistema specifico, la durata di attesa di un timer assoluto non è influenzata se l'ora di sistema cambia prima della scadenza del timer. D'altra parte, un timer relativo scade sempre dopo il numero specificato di unità temporali trascorse, indipendentemente dalle modifiche apportate al tempo di sistema assoluto.

Per richiamare ripetutamente una routine CustomTimerDpc , usare KeSetTimerEx per impostare il timer e specificare un intervallo ricorrente nel parametro Period . KeSetTimerEx è simile a KeSetTimer , ad eccezione di questo parametro aggiuntivo.

Come illustrato nella figura precedente, la chiamata a KeSetTimer o KeSetTimerEx accoda l'oggetto timer per un intervallo specificato come indicato di seguito:

  1. Al termine di DueTime , l'oggetto timer viene dequeued e impostato sullo stato Signaled.

  2. Se ogni processore del computer esegue il codice in una coda DPC maggiore o uguale a DISPATCH_LEVEL, l'oggetto DPC associato all'oggetto timer viene inserito in una coda DPC. In caso contrario, viene chiamata la routine CustomTimerDpc .

  3. Se l'oggetto DPC era già nella coda quando l'intervallo DueTime è scaduto, la routine CustomTimerDpc viene chiamata non appena irQL in qualsiasi processore nel computer scende sotto DISPATCH_LEVEL.

    Nota

    La routine CustomTimerDpc , come tutte le routine DPC, viene chiamata in IRQL = DISPATCH_LEVEL. Durante l'esecuzione di una routine DPC, tutti i thread non vengono eseguiti nello stesso processore. Gli sviluppatori di driver devono progettare attentamente le routine CustomTimerDpc da eseguire per un breve periodo di tempo possibile.

L'intervallo di tempo più piccolo che può essere specificato in KeSetTimer e KeSetTimerEx è di circa dieci millisecondi, quindi un driver può usare una routine CustomTimerDpc quando i tempi di intervallo più piccoli rispetto a una routine IoTimer , che viene eseguita una volta al secondo, possono gestire.

Una sola istanza di un particolare oggetto timer può essere accodata in qualsiasi momento. La chiamata a KeSetTimer o KeSetTimerEx con lo stesso puntatore a oggetti Timer annulla l'oggetto timer in coda e lo reimposta.

La configurazione di una routine CustomTimerDpc è esattamente simile alla configurazione di una routine CustomDpc , con un passaggio aggiuntivo per inizializzare l'oggetto timer. Infatti, i loro prototipi sono identici, ma la routine CustomTimerDpc non può usare i due puntatori SystemArgument dichiarati nel suo prototipo.