Creazione di un ISR attivo o inattivo

A partire da Windows 8, un driver può chiamare la routine IoReportInterruptActive o IoReportInterruptInactive per attivare o inattiva una routine del servizio di interruzione registrata( ISR).

Per registrare un ISR e per connettere l'ISR a un interrupt o a un set di interrupt, il driver chiama la routine IoConnectInterruptEx . Dopo la registrazione dell'ISR, il driver può usare IoReportInterruptActive e IoReportInterruptInactive per eseguire operazioni di connessione e disconnessione leggere (o "soft") che lasciano invariata la registrazione dell'ISR. IoReportInterruptInactive disabilita le chiamate all'ISR disconnettendo temporaneamente l'interrupt o le interruzioni associate. IoReportInterruptActive soft-connette questi interrupt per abilitare le chiamate all'ISR.

Ad esempio, un driver potrebbe chiamare IoReportInterruptInactive per disconnettere soft-disconnect un set di interrupt prima che un dispositivo esce dallo stato di alimentazione D0 e chiamare IoReportInterruptActive per connettere soft-connect questi interrupt dopo il reenters D0 del dispositivo. In linea di principio, un driver potrebbe invece chiamare IoDisconnectInterruptEx prima che il dispositivo esce da D0 e chiamare IoConnectInterruptEx dopo il reenter D0 del dispositivo. Tuttavia, le chiamate IoReportInterruptXxx sono più veloci delle chiamate IoConnectInterruptEx e IoDisconnectInterruptEx . A differenza delle chiamate IoConnectInterruptEx e IoDisconnectInterruptEx , che potrebbero non riuscire per diversi motivi (ad esempio, risorse di sistema insufficienti), le chiamate IoReportInterruptXxx raramente, se mai, hanno esito negativo. Inoltre, le routine IoReportInterruptXxx possono essere chiamate in IRQL <= DISPATCH_LEVEL, mentre IoConnectInterruptEx e IoDisconnectInterruptEx possono essere chiamate solo in PASSIVE_LEVEL.

Per impostazione predefinita, l'ISR è attivo (e le chiamate all'ISR sono abilitate) dopo che IoConnectInterruptEx ha registrato correttamente l'ISR.

Le chiamate a IoReportInterruptInactive e IoReportInterruptActive sono facoltative. Se un driver non chiama mai queste routine, l'ISR registrato rimane attivo finché il driver chiama la routine IoDisconnectInterruptEx per annullare la registrazione dell'ISR.

Il driver deve configurare il dispositivo in modo da emettere interrupt solo quando l'ISR per questi interrupt è attivo. L'impossibilità di impedire a un dispositivo di emettere interrupt quando l'ISR è inattivo potrebbe causare instabilità del sistema. Ad esempio, se un dispositivo condivide una linea di interruzione attivata a livello con altri dispositivi e il dispositivo genera richieste di interruzione quando l'ISR è inattivo, gli ISR per gli altri dispositivi nella riga non riconosceranno l'interrupt e l'interrupt continuerà a essere attivato. Prima di chiamare IoReportInterruptInactive, il driver deve configurare il dispositivo per interrompere l'emissione di interrupt. Dopo aver chiamato IoReportInterruptActive, il driver deve configurare il dispositivo per avviare l'emissione di interrupt.

Per annullare la registrazione di un ISR, un driver può chiamare IoDisconnectInterruptEx indipendentemente dal fatto che l'ISR sia attualmente attivo o inattivo.

Una chiamata IoReportInterruptActive che si verifica quando l'ISR è già attiva non ha alcun effetto, ma non viene considerata come un errore. Analogamente, una chiamata IoReportInterruptInactive che si verifica quando l'ISR è già inattiva non ha alcun effetto, ma non viene considerata come un errore.