Streamzeiger und IRP-Abbruch

Wenn ein Frame über einen gesperrten Streamzeiger verfügt, der darauf verweist, kann der IRP, der diesem Frame entspricht, nicht abgebrochen werden. Siehe Sperren und Entsperren von Streamzeigern.

In der folgenden Tabelle sind Techniken aufgeführt, die Ihr Minidriver verwenden kann, um die IRP-Abbruchung zu unterstützen. Ihre Abbruchstrategie sollte auf den Streamzugriffsanforderungen Ihres Minidrivers basieren, wie in der spalte links beschrieben.

Bei Bedarf. Aktion Kommentare

Kurzer Zugriff auf das Streamen von Daten an einem einzigen Zugriffspunkt

Rufen Sie KsPinGetLeadingEdgeStreamPointer auf, wobei der State-Parameter auf KSSTREAM_POINTER_STATE_LOCKED festgelegt ist. Rufen Sie dann sofort nach Abschluss der Verarbeitung KsStreamPointerUnlock oder KsStreamPointerAdvanceOffsetsAndUnlock auf.

Ermöglicht eine schnelle Reaktion auf Abbruch, es sei denn, der Thread blockiert zwischen dem Abrufen des Zeigers und dem Entsperren.

Unbegrenzte Dauer der Zugriffszeit, kann den Anspruch jedoch im Kontext eines Rückrufs für die Kündigung aufgeben

Rufen Sie KsStreamPointerClone auf, um einen gesperrten Streamzeiger (in der Regel den führenden Rand) zu klonen, ihn zu entsperren und auf CancelCallback zu antworten. Der Rückruf erfolgt bei gedrückter Spin-Sperre der Warteschlange, also bei DISPATCH_LEVEL. Dementsprechend kann die vom Anbieter bereitgestellte CancelCallback-Routine keine Warteschlangenbearbeitungs- oder Aufruffunktionen ausführen, die einen Mutex abrufen. Stattdessen überprüft der Minidriver in der Rückrufroutine, dass später nicht auf die zugeordneten Daten zugegriffen wird, und ruft dann KsStreamPointerDelete auf.

Kann schwieriger zu implementieren sein, bietet aber häufig die beste Balance zwischen effizientem Zugriff und schneller Reaktion auf Abbruch.

Regelmäßiger Zugriff auf einen Frame und kann das Verschwinden des Frames zwischen Zugriffen tolerieren

Verwalten Sie einen entsperrten Klon, und rufen Sie KsStreamPointerLock auf, um ihn zur Zugriffszeit zu sperren. Wenn der Frame abgebrochen wird, schlägt der nächste Versuch, den Streamzeiger zu sperren, fehl, und der Minidriver kann KsStreamPointerDelete aufrufen.

Wie bei der ersten Option ist die Reaktionsfähigkeit auf abbruch eine Funktion davon, wie lange der Streamzeiger gesperrt ist.

Unbegrenzte Dauer der Zugriffszeit und kann den Anspruch nicht als Reaktion auf einen Rückruf aufgeben

Behalten Sie einen gesperrten Klonstreamzeiger für einen beliebigen Zeitraum aufrecht, um das Abbruch zu verhindern. Um einen Klonstreamzeiger zu erstellen, rufen Sie KsStreamPointerClone auf. Rufen Sie dann KsStreamPointerLock und KsStreamPointerUnlock auf, um den Klon zu sperren oder zu entsperren.

Die Reaktionsfähigkeit auf abbruch kann schlecht sein. Erwägen Sie die Verwendung von Streamzeigertimeouts mit dieser Technik.

Wenn ein Frame über einen Streamzeiger verfügt, der darauf verweist, kann der Minidriver KsStreamPointerGetIrp aufrufen, um auf den IRP zuzugreifen, der diesem Frame entspricht. Rufen Sie KsStreamPointerGetMdl auf, um die einem Frame zugeordnete Speicherdeskriptorliste (MDL) abzurufen.