Condividi tramite


Manutenzione di un interruzione

Questo argomento descrive come eseguire il servizio di un interruzione DIRQL. Per informazioni sulla manutenzione di un interruzione a livello passivo, vedere Supporto di interruzioni a livello passivo.

La manutenzione di un interruzione è costituita da due e a volte tre passaggi:

  1. Salvataggio rapido di informazioni volatili ,ad esempio il contenuto del registro, in una routine di servizio di interruzione eseguita in IRQL = DIRQL.

  2. Elaborazione delle informazioni volatili salvate in una chiamata di procedura posticipata (DPC) eseguita in IRQL = DISPATCH_LEVEL.

  3. Se necessario, eseguire operazioni aggiuntive in IRQL = PASSIVE_LEVEL.

Quando un dispositivo genera un interruzione hardware, il framework chiama la routine di servizio di interruzione del driver (ISR), che i driver basati su framework implementano come funzione di callback EvtInterruptIsr .

La funzione di callback evtInterruptIsr , che viene eseguita nel diRQL del dispositivo, deve salvare rapidamente le informazioni di interruzione, ad esempio il contenuto del registro, che verrà perso se si verifica un altro interruzione.

In genere, la funzione di callback EvtInterruptIsr pianifica una chiamata di routine posticipata (DPC) per elaborare le informazioni salvate in un secondo momento in un irQL inferiore (DISPATCH_LEVEL). I driver basati su framework implementano routine DPC come funzioni di callback EvtInterruptDpc o EvtDpcFunc .

La maggior parte dei driver usa una singola funzione di callback EvtInterruptDpc per ogni tipo di interruzione. Per pianificare l'esecuzione di una funzione di callback EvtInterruptDpc, un driver deve chiamare WdfInterruptQueueDpcForIsr dall'interno della funzione di callback EvtInterruptIsr.

Se il driver crea più oggetti coda del framework per ogni dispositivo, è possibile usare un oggetto DPC separato e una funzione di callback EvtDpcFunc per ogni coda. Per pianificare l'esecuzione di una funzione di callback EvtDpcFunc , il driver deve prima creare uno o più oggetti DPC chiamando WdfDpcCreate, in genere nella funzione evtDriverDeviceAdd callback del driver. Quindi la funzione di callback evtInterruptIsr del driver può chiamare WdfDpcEnqueue.

I driver in genere completano le richieste di I/O nelle funzioni di callback EvtInterruptDpc o EvtDpcFunc .

A volte un driver deve eseguire alcune operazioni di manutenzione di interruzione in IRQL = PASSIVE_LEVEL. In questi casi, la funzione di callback EvtInterruptDpc o EvtDpcFunc, eseguita in IRQL = DISPATCH_LEVEL, può pianificare l'esecuzione di uno o più elementi di lavoro del framework, che vengono eseguiti in IRQL = PASSIVE_LEVEL.

Per un esempio di driver che usa elementi di lavoro durante l'interruzione del dispositivo di manutenzione, vedere il driver di esempio PCIDRV .