Share via


Interrompi oggetti di sincronizzazione

Il driver di sistema PortCls implementa l'interfaccia IInterruptSync per il vantaggio dei driver miniport. IInterruptSync rappresenta un oggetto di sincronizzazione interrupt che sincronizza l'esecuzione di un elenco di routine del servizio di interruzione (ISR) con routine non di interrupt.

Gli oggetti di sincronizzazione interrupt offrono due funzionalità chiave:

  • Esecuzione di un elenco di isr in risposta a un interrupt. L'oggetto di sincronizzazione è connesso a un'origine di interrupt. Ogni volta che si verifica l'interrupt, l'oggetto sync esegue gli ISR in un ordine specificato in base alla modalità selezionata. Vedere la descrizione seguente delle tre modalità.

  • Esecuzione di routine che non sono ISR. Queste routine non di interruzione non sono connesse all'interrupt dell'oggetto di sincronizzazione. Al contrario, una routine non interrupt viene eseguita alla volta della scelta del chiamante. Tuttavia, l'oggetto sync esegue la routine non interrupt in modo sincrono con l'elenco degli ISR dell'oggetto. In altre parole, la routine non interrupt viene eseguita fino al completamento prima che uno degli ISR nell'elenco dell'oggetto di sincronizzazione inizi l'esecuzione e viceversa.

Un oggetto di sincronizzazione interrupt è flessibile nella gestione di più isr. Gli ISR si trovano in un elenco collegato che l'oggetto di sincronizzazione attraversa in fase di interruzione. Quando un driver miniport registra un ISR con un oggetto di sincronizzazione, specifica se l'ISR deve essere aggiunto all'inizio o alla fine di questo elenco.

Un driver miniport chiama la funzione PcNewInterruptSync per creare un oggetto di sincronizzazione interrupt. Durante questa chiamata, il driver specifica il modo in cui l'oggetto deve attraversare l'elenco di isr in fase di interruzione. La chiamata supporta le tre opzioni specificate dalle costanti di enumerazione INTERRUPTSYNCMODE nella tabella seguente.

Costante Significato

InterruptSyncModeNormal

Chiamare ogni ISR nell'elenco fino a quando uno di essi non restituisce STATUS_SUCCESS.

InterruptSyncModeAll

Chiamare ogni ISR nell'elenco esattamente una volta, indipendentemente dai codici restituiti degli ISR precedenti.

InterruptSyncModeRepeat

Attraversare l'intero elenco di isr fino a quando non si verifica un viaggio nell'elenco in cui nessun ISR nell'elenco restituisce STATUS_SUCCESS.

Nella modalità InterruptSyncModeNormal l'oggetto sync chiama ogni ISR nell'elenco fino a quando uno di essi non restituisce STATUS_SUCCESS. Tutti gli ISR nell'elenco che seguono questo ISR non vengono chiamati. Questa modalità emula il modo in cui il sistema operativo gestisce normalmente gli ISR. Se nessun isr restituisce STATUS_SUCCESS, il comportamento corrisponde a InterruptSyncModeAll.

Nella modalità InterruptSyncModeAll ogni ISR nell'elenco viene chiamato esattamente una volta, indipendentemente dai codici restituiti degli ISR precedenti. Questo è destinato a hardware più primitivo in cui l'origine dell'interrupt non è deterministica, anche se potrebbe essere utile anche in altre situazioni. Ad esempio, due origini di interrupt potrebbero essere strettamente sincronizzate in ogni interrupt, indipendentemente da quale delle due origini proviene un determinato interrupt.

Nella modalità InterruptSyncModeRepeat l'oggetto di sincronizzazione attraversa ripetutamente l'intero elenco di isr fino a quando non viene eseguita una corsa nell'elenco in cui nessuna routine nell'elenco restituisce STATUS_SUCCESS. Questa modalità è appropriata per le situazioni in cui le interruzioni da più origini potrebbero essere attivate contemporaneamente sulla stessa riga di interruzione o un secondo interrupt potrebbe essere attivato durante l'elaborazione ISR. Ogni origine di interrupt deve essere in grado di determinare se richiede l'elaborazione. Il sistema smetterà di rispondere se un ISR che restituisce sempre STATUS_SUCCESS viene registrato con un oggetto di sincronizzazione in questa modalità.

In una di queste modalità, l'oggetto di sincronizzazione riconoscerà l'interruzione al sistema operativo se uno degli ISR registrati restituisce STATUS_SUCCESS. In tutte e tre le modalità, se tutte le origini di interrupt indicano che non hanno gestito correttamente l'interrupt, l'oggetto di sincronizzazione restituirà un codice di risultato non riuscito al sistema operativo.

L'interfaccia IInterruptSync supporta i metodi seguenti:

IInterruptSync::CallSynchronizedRoutine

IInterruptSync::Connect

IInterruptSync::D isconnect

IInterruptSync::GetKInterrupt

IInterruptSync::RegisterServiceRoutine