Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Per i sistemi operativi Windows Vista e versioni successive, un driver può usare la versione CONNECT_MESSAGE_BASED di IoConnectInterruptEx per registrare un ISR per gli interrupt con segnalazione dei messaggi del driver. Il driver specifica un valore di CONNECT_MESSAGE_BASED per Parameters-Version> e usa i membri diParameters-MessageBased> per specificare gli altri parametri dell'operazione.
Parametri->MessageBased.PhysicalDeviceObject specifica il PDO per il dispositivo gestito dall'ISR. Il sistema utilizza l'oggetto dispositivo per identificare automaticamente gli interrupt segnalati tramite messaggi del dispositivo.
Parameters-MessageBased.MessageServiceRoutine> punta alla routine InterruptMessageService, mentre Parameters-MessageBased.ServiceContext> specifica il valore passato dal sistema come parametro ServiceContext a InterruptMessageService. Il driver può usarlo per passare le informazioni sul contesto. Per altre informazioni sul passaggio di informazioni sul contesto, vedere Fornire informazioni sul contesto ISR.
Il driver può anche specificare una routine interruptMessageService di fallback in Parameters-MessageBased.FallBackServiceRoutine>. Se nel dispositivo sono presenti interrupt basati su riga, ma non vengono interrotti messaggi, il sistema registrerà invece la routine InterruptMessageService per gestire gli interrupt basati su riga. In questo caso, il sistema passa Parameters->MessageBased.ServiceContext come parametro ServiceContext a InterruptService. IoConnectInterruptEx aggiorna Parameters-Version> per CONNECT_LINE_BASED se ha registrato la routine di fallback.
Parameters->MessageBased.ConnectionContext punta a una variabile che riceve un puntatore a una struttura IO_INTERRUPT_MESSAGE_INFO (per InterruptMessageService) o a una struttura KINTERRUPT (per InterruptService). Il driver può usare il puntatore ricevuto per rimuovere l'ISR. Per altre informazioni, vedere Rimozione di un ISR.
I driver possono facoltativamente specificare uno spin lock in Parameters->MessageBased.SpinLock per il sistema da usare durante la sincronizzazione con l'ISR. La maggior parte dei driver può semplicemente specificare NULL per permettere al sistema di allocare uno spin lock per conto del driver. Per altre informazioni sulla sincronizzazione con un ISR, vedere Sincronizzazione dell'accesso ai dati del dispositivo.
Nell'esempio di codice seguente viene illustrato come registrare una routine InterruptMessageService usando CONNECT_MESSAGE_BASED.
IO_CONNECT_INTERRUPT_PARAMETERS params;
// deviceExtension is a pointer to the driver's device extension.
// deviceExtension->IntInfo is a PVOID.
// deviceExtension->IntType is a ULONG.
// deviceInterruptService is a pointer to the driver's InterruptService routine.
// deviceInterruptMessageService is a pointer to the driver's InterruptMessageService routine.
// PhysicalDeviceObject is a pointer to the device's PDO.
// ServiceContext is a pointer to driver-specified context for the ISR.
RtlZeroMemory( ¶ms, sizeof(IO_CONNECT_INTERRUPT_PARAMETERS) );
params.Version = CONNECT_MESSAGE_BASED;
params.MessageBased.PhysicalDeviceObject = PhysicalDeviceObject;
params.MessageBased.MessageServiceRoutine = deviceInterruptMessageService;
params.MessageBased.ServiceContext = ServiceContext;
params.MessageBased.SpinLock = NULL;
params.MessageBased.SynchronizeIrql = 0;
params.MessageBased.FloatingSave = FALSE;
params.MessageBased.FallBackServiceRoutine = deviceInterruptService;
status = IoConnectInterruptEx(¶ms);
if (NT_SUCCESS(status)) {
// We record the type of ISR registered.
devExt->IsrType = params.Version;
} else {
// Operation failed. Handle error.
...
}