KSERVICE_ROUTINE funzione di callback (wdm.h)
La routine InterruptService (ISR) esegue rapidamente un'interruzione del dispositivo e pianifica l'elaborazione post-interruzione dei dati ricevuti, se necessario.
Sintassi
KSERVICE_ROUTINE KserviceRoutine;
BOOLEAN KserviceRoutine(
[in] _KINTERRUPT *Interrupt,
[in] PVOID ServiceContext
)
{...}
Parametri
[in] Interrupt
Puntatore fornito dal chiamante alla struttura KINTERRUPT per l'interruzione.
[in] ServiceContext
Puntatore fornito dal chiamante alle informazioni di contesto, specificato in una chiamata precedente a IoConnectInterrupt o IoConnectInterruptEx.
Valore restituito
Se la routine determina che l'interruzione non proviene da uno dei dispositivi del driver, deve restituire FALSE. In caso contrario, la routine deve eseguire l'interruzione e restituire TRUE.
Commenti
Per registrare un ISR per un vettore di interruzione e un'affinità del processore specifici, un driver deve chiamare IoConnectInterrupt o IoConnectInterruptEx.
La routine InterruptService (ISR) di un driver viene eseguita in un contesto di interruzione, in un contesto di interruzione assegnato dal sistema, come specificato dal parametro SyncIrql a IoConnectInterrupt. Altri dispositivi, con valori DIRQL più elevati, possono interrompere l'ISR.
Prima che il sistema chiami un ISR, acquisisce il blocco spin dell'interruzione (il parametro SpinLock a IoConnectInterrupt), in modo che l'ISR non possa eseguire simultaneamente in un altro processore. Dopo aver restituito l'ISR, il sistema rilascia il blocco di rotazione.
Un ISR deve prima determinare se l'interruzione proviene da uno dei dispositivi del driver esaminando le informazioni sul contesto fornite da Context. Se l'interruzione non proviene da uno dei dispositivi del driver, la routine deve restituire immediatamente FALSE in modo che il gestore di I/O possa chiamare altri driver che hanno registrato ISR per lo stesso processore e vettore di interruzione.
Per altre informazioni sull'implementazione degli ISR, vedere Routine del servizio di interruzione.
Esempio
Per definire una routine di callback di InterruptService , è prima necessario specificare una dichiarazione di funzione che identifica il tipo di routine di callback che si sta definendo. Windows fornisce un set di tipi di funzione di callback per i driver. La dichiarazione di una funzione usando i tipi di funzione callback consente l'analisi del codice per i driver, il verifica driver statico (SDV) e altri strumenti di verifica trovano errori ed è un requisito per la scrittura di driver per il sistema operativo Windows.
Ad esempio, per definire una routine di callback di InterruptService denominata MyInterruptService
, usare il tipo di KSERVICE_ROUTINE, come illustrato in questo esempio di codice:
KSERVICE_ROUTINE MyInterruptService;
Implementare quindi la routine di callback come indicato di seguito:
_Use_decl_annotations_
BOOLEAN
MyInterruptService(
struct _KINTERRUPT *Interrupt,
PVOID ServiceContext
)
{
// Function body
}
Il tipo di funzione KSERVICE_ROUTINE è definito nel file di intestazione Wdm.h. Per identificare in modo più accurato gli errori quando si eseguono gli strumenti di analisi del codice, assicurarsi di aggiungere l'annotazione _Use_decl_annotations_
alla definizione della funzione. L'annotazione _Use_decl_annotations_
garantisce che vengano usate le annotazioni applicate al tipo di funzione KSERVICE_ROUTINE nel file di intestazione. Per altre informazioni sui requisiti per le dichiarazioni di funzione, vedere Dichiarazione di funzioni tramite tipi di ruolo per i driver WDM. Per informazioni su _Use_decl_annotations_
, vedere Annotazione del comportamento della funzione.
Requisiti
Requisito | Valore |
---|---|
Piattaforma di destinazione | Desktop |
Intestazione | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
IRQL | Chiamato in DIRQL (vedere la sezione Osservazioni). |