Verwenden der CONNECT_LINE_BASED Version von IoConnectInterruptEx

Für Windows Vista und höhere Betriebssysteme kann ein Treiber die CONNECT_LINE_BASED Version von IoConnectInterruptEx verwenden, um eine InterruptService-Routine für die zeilenbasierten Interrupts des Treibers zu registrieren. (Treiber für frühere Betriebssysteme können die CONNECT_FULLY_SPECIFIED Version von IoConnectInterruptEx verwenden.)

Hinweis Sie können diese Methode nur für Treiber verwenden, die eine Single Interrupt Service Routine (ISR) für alle zeilenbasierten Interrupts registrieren. Wenn der Treiber mehrere Interrupts empfangen kann, muss er die CONNECT_FULLY_SPECIFIED Version von IoConnectInterruptEx verwenden.

Der Treiber gibt den Wert CONNECT_LINE_BASED für Parameters-Version> an und verwendet die Member vonParameters-LineBased>, um die anderen Parameter des Vorgangs anzugeben:

  • Parameters-LineBased.PhysicalDeviceObject gibt das physische Geräteobjekt (PDO) für das Gerät an, das die ISR-Dienste bereitstellt.> Das System verwendet das Geräteobjekt, um die leitungsbasierten Unterbrechungen des Geräts automatisch zu identifizieren.

  • Parameters-LineBased.ServiceRoutine> verweist auf die InterruptService-Routine, während Parameters-LineBased>. ServiceContext gibt den Wert an, den das System als ServiceContext-Parameter an InterruptService übergibt. Der Treiber kann dies verwenden, um Kontextinformationen zu übergeben. Weitere Informationen zum Übergeben von Kontextinformationen finden Sie unter Bereitstellen von ISR-Kontextinformationen.

  • Der Treiber stellt einen Zeiger auf eine PKINTERRUPT-Variable in Parameters-LineBased.InterruptObject> bereit. IoConnectInterruptEx legt diese Variable so fest, dass sie auf das Interruptobjekt für den Interrupt verweist, das beim Entfernen des ISR verwendet werden kann. Weitere Informationen finden Sie unter Entfernen eines ISR.

  • Treiber können optional eine Drehsperre in Parameters-LineBased.SpinLock> angeben, die das System bei der Synchronisierung mit dem ISR verwenden soll. Die meisten Treiber können einfach NULL angeben, damit das System eine Drehsperre im Namen des Treibers zuweisen kann. Weitere Informationen zur Synchronisierung mit einem ISR finden Sie unter Synchronisieren des Zugriffs auf Gerätedaten.

Im folgenden Codebeispiel wird veranschaulicht, wie Eine InterruptService-Routine mit CONNECT_LINE_BASED registriert wird:

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( &params, 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(&params);

if (!NT_SUCCESS(status)) {
    // Operation failed. Handle error.
    ...
}