Uso della versione CONNECT_LINE_BASED di IoConnectInterruptEx
Per i sistemi operativi Windows Vista e versioni successive, un driver può usare la versione CONNECT_LINE_BASED di IoConnectInterruptEx per registrare una routine InterruptService per gli interrupt basati su linea del driver. Il driver per i sistemi operativi precedenti può usare la versione CONNECT_FULLY_SPECIFIED di IoConnectInterruptEx.
Nota È possibile utilizzare questo metodo solo per i driver che registrano una singola routine del servizio di interruzione (ISR) per tutti i relativi interrupt basati su riga. Se il driver può ricevere più interrupt, deve usare la versione CONNECT_FULLY_SPECIFIED di IoConnectInterruptEx.
Il driver specifica un valore di CONNECT_LINE_BASED per Parameters-Version> e usa i membri diParameters-LineBased> per specificare gli altri parametri dell'operazione:
Parameters-LineBased.PhysicalDeviceObject> specifica l'oggetto dispositivo fisico (PDO) per il dispositivo che i servizi ISR. Il sistema usa l'oggetto dispositivo per identificare automaticamente gli interrupt basati sulla linea del dispositivo.
Parameters-LineBased.ServiceRoutine> punta alla routine InterruptService, mentre Parameters-LineBased.> ServiceContext specifica il valore passato dal sistema come parametro ServiceContext a InterruptService. Il driver può usarlo per passare le informazioni di contesto. Per altre informazioni sul passaggio delle informazioni sul contesto, vedere Fornire informazioni sul contesto ISR.
Il driver fornisce un puntatore a una variabile PKINTERRUPT in Parameters-LineBased.InterruptObject>. IoConnectInterruptEx imposta questa variabile in modo che punti all'oggetto interrupt per l'interrupt, che può essere usato quando si rimuove l'ISR. Per altre informazioni, vedere Rimozione di un ISR.
I driver possono facoltativamente specificare un blocco spin in Parameters-LineBased.SpinLock> per il sistema da usare durante la sincronizzazione con l'ISR. La maggior parte dei driver può solo specificare NULL per consentire al sistema di allocare un blocco di rotazione 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 InterruptService usando CONNECT_LINE_BASED:
IO_CONNECT_INTERRUPT_PARAMETERS params;
// deviceExtension is a pointer to the driver's device extension.
// deviceExtension->IntObj is a PKINTERRUPT.
// deviceInterruptService is a pointer to the driver's InterruptService 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_LINE_BASED;
params.LineBased.PhysicalDeviceObject = PhysicalDeviceObject;
params.LineBased.InterruptObject = &deviceExtension->IntObj;
params.LineBased.ServiceRoutine = deviceInterruptService;
params.LineBased.ServiceContext = ServiceContext;
params.LineBased.SpinLock = NULL;
params.LineBased.SynchronizeIrql = 0;
params.LineBased.FloatingSave = FALSE;
status = IoConnectInterruptEx(¶ms);
if (!NT_SUCCESS(status)) {
// Operation failed. Handle error.
...
}