Freigeben über


Verbinden einer Interruptdienstroutine mit einem parallelen Port

Ein Client im Kernelmodus kann eine IOCTL_INTERNAL_PARALLEL_CONNECT_INTERRUPT-Anforderung verwenden, um eine Interruptdienstroutine und eine verzögerte Portüberprüfungsroutine mit dem Betrieb des Parallelport-Funktionstreibers zu verbinden.

Hinweis Microsoft empfiehlt die Verwendung einer vom Client bereitgestellten Interruptroutine nicht. Die Verwendung von Interrupts kann zu Systeminstabilität führen. Standardmäßig ist die IOCTL_INTERNAL_PARALLEL_CONNECT_INTERRUPT-Anforderung deaktiviert.

Um die Portierung und Entwicklung von Treibern für parallele Geräte zu erleichtern, unterstützt der vom System bereitgestellte Funktionstreiber für parallele Ports ein Registrierungsflag, mit dem Clients im Kernelmodus eine Verbindungsunterbrechungsanforderung aktivieren und deaktivieren können. Die Verbindungsunterbrechungsanforderung wird durch den Registrierungseintragswert EnableConnectInterruptIoctl unter dem Plug & Play Registrierungsschlüssel für den parallelen Port aktiviert. Der Eintragswert hat den Typ REG_DWORD, und der Standardwert ist 0x0 (deaktiviert). Ein Wert, der nicht gleich 0x0 die Verbindungsunterbrechungsanforderung aktiviert.

Die Verbindungsunterbrechungsanforderung gibt eine PARALLEL_INTERRUPT_INFORMATION-Struktur zurück, die einen Zeiger auf das Interruptobjekt des parallelen Ports und die folgenden Zeiger auf vom System bereitgestellte Rückrufroutinen enthält:

  • Das TryAllocatePortAtInterruptLevel-Element ist ein Zeiger auf einen nicht blockierenden PPARALLEL_TRY_ALLOCATE_ROUTINE-Rückruf (ISR), den ein Kernelmodustreiber in einer ISR verwenden kann, um einen parallelen Port zuzuweisen.

  • Das FreePortFromInterruptLevel-Element ist ein Zeiger auf einen ISR-Rückruf ( Nonblocking PPARALLEL_FREE_ROUTINE), den ein Kernelmodustreiber in einer ISR verwenden kann, um einen parallelen Port freizusetzen.

Die Interruptdienstroutine wird unter IRQL = DIRQL nach einem Hardware-Interrupt am parallelen Port aufgerufen. Wenn ein Treiber eine Unterbrechungsdienstroutine verbindet und über eine Unload-Routine verfügt, muss der Treiber eine IOCTL_INTERNAL_PARALLEL_DISCONNECT_INTERRUPT-Anforderung in seiner Unload-Routine senden.

Die Routine für die verzögerte Portüberprüfung wird aufgerufen, nachdem der parallele Port freigegeben wurde und wenn keine ausstehenden Anforderungen zum Zuordnen des Ports oder auswählen eines IEEE 1284.3-Geräts vorliegen. Ein Treiber kann die Routine für die verzögerte Portüberprüfung verwenden, um Unterbrechungen zu aktivieren.

Wenn die Interruptdienstroutine eines Clients aufgerufen wird, wenn dem Client kein Port zugewiesen ist, kann der Client versuchen, den Port schnell zuzuordnen, indem er den PPARALLEL_TRY_ALLOCATE_ROUTINE-Rückruf (ISR) aufruft. Der Client kann auch den PPARALLEL_FREE_ROUTINE -Rückruf (ISR) verwenden, um den Port frei zu geben.

Da ein paralleler Port von Treibern gemeinsam genutzt wird, verwaltet der Parallelport-Funktionstreiber eine Liste von Interruptdienstroutinen und verzögerten Portüberprüfungsroutinen, die mit einem parallelen Port verbunden sind. Der Parallelport-Funktionstreiber ruft alle verbundenen Interruptroutinen und verzögerten Portüberprüfungsroutinen in der Reihenfolge auf, in der sie verbunden wurden.