HW_STARTIO Rückruffunktion (storport.h)

Der Storport-Treiber ruft die HwStorStartIo-Routine einmal für jede eingehende E/A-Anforderung auf.

Syntax

HW_STARTIO HwStartio;

BOOLEAN HwStartio(
  PVOID DeviceExtension,
  PSCSI_REQUEST_BLOCK Srb
)
{...}

Parameter

DeviceExtension

Ein Zeiger auf den HBA-Speicherbereich des Miniporttreibers.

Srb

Ein Zeiger auf den SCSI-Anforderungsblock, der gestartet werden soll.

Rückgabewert

HwStorStartIo gibt TRUE zurück, wenn die Anforderung erfolgreich initiiert wurde. Andernfalls wird FALSE zurückgegeben.

Bemerkungen

HwStorStartIo initiiert einen I/O-Vorgang. StorPort wurde entwickelt, um die privaten Daten eines Miniports zu verwenden, die in HwStorBuildIo vorbereitet und entweder in DeviceExtension oder Srb-SrbExtension> gespeichert sind. Da HwStorBuildIo ohne Drehsperren aufgerufen wird, wird die beste Treiberleistung erreicht, indem sie so viele Daten wie möglich in HwStorBuildIo vorbereiten.

Storport ruft HwStorStartIo auf folgende Weise auf:

  • Bei Nicht-virtuellen Miniporttreibern ruft Storport abhängig vom Wert des in PORT_CONFIGURATION_INFORMATION festgelegten SyncModel-Elementsimmer HwStorStartIo an derselben IRQL auf und verwendet eine interne Drehsperre, um sicherzustellen, dass I/O-Anforderungen sequenziell initiiert werden. Die IRQL ist entweder DISPATCH_LEVEL (Vollduplexmodus) oder DIRQL (Halbduplexmodus).

    Bei der Behandlung von I/O im Halbduplexmodus muss die HwStorStartIo-Routine keine eigene Drehsperre erwerben. Außerdem sind die Speicherzuweisungen mit StorPortAllocatePool und gegenseitiger Ausschluss über StorPortAcquireSpinLock in der HwStorStartIo-Routine nicht zulässig. Im Vollduplexmodus kann StorPortAllocatePool und StorPortAcquireSpinLock in der HwStorStartIo-Routine verwendet werden.

    Wenn ein nicht virtueller Miniport die Optimierung gleichzeitiger Kanäle unterstützt (STOR_PERF_CONCURRENT_CHANNELS von StorPortInitializePerfOpts festgelegt), sind mehrere Aufrufe von HwStorStartIo gleichzeitig möglich. In diesem Fall muss der Miniport sicherstellen, dass alle freigegebenen Ressourcen durch eine Sperre geschützt sind. Mit dieser Leistungsoptimierung erhält Storport die StartIo-Sperre nicht vor dem Aufrufen von HwStorStartIo und der Miniport muss bei Bedarf eine eigene Sperre bereitstellen.

  • Bei virtuellen Speicher-Miniporttreibern ruft Storport HwStorStartIo bei jedem IRQL <= DISPATCH_LEVEL auf und verwendet keine interne Drehsperre. Die HwStorStartIo-Routine kann ihre eigene Spin-Sperre erwerben, indem Sie StorPortAcquireSpinLock aufrufen. Außerdem sind Anrufe an StorPortAllocatePool in der HwStorStartIo-Routine eines virtuellen Speicher-Miniporttreibers zulässig.

Der SRB wird voraussichtlich abgeschlossen, wenn der SCSI-Status empfangen wird. Wenn der Storport-Treiber den SRB durch Aufrufen von StorPortNotification mit einem NotificationType of RequestComplete beendet, wird erwartet, dass ein SRB einen der folgenden Werte im SrbStatus-Feld des Srb zurückgibt:

  • SRB_STATUS_SUCCESS

    • Gibt an, dass der Srb gesendet wurde und der SCSI-Status (möglicherweise mit Daten) zurückgegeben wurde.
    • Storport gibt die Daten und den Status an den Aufrufer zurück.
    • Miniport-Aktion ist keine, außer die Anforderung mithilfe von StorPortNotification für RequestComplete abzuschließen, wahrscheinlich aus der HwStorDpcRoutine.
  • SRB_STATUS_BUSY

    • Gibt an, dass beim Senden des Srb ein temporäres Problem auftritt (z. B. werden Adapterregister oder Puffer ausgelastet).
    • Storport verwirft die ursprüngliche Srb-Erweiterung, auf die Srb-SrbExtension> verweist, und gibt eine neue aus. Storport sendet den ursprünglichen Srb mit der neu ausgestellten Srb-Erweiterung in nachfolgenden Aufrufen an HwStorBuildIo und HwStorStartIo. Alle Daten in der ursprünglichen Srb-Erweiterung gehen verloren.
    • Der Miniport sollte den DataTransferLength des Srb nicht aktualisieren.
    • Da eine neue Srb-Erweiterung ausgestellt wird, muss der Miniport sicherstellen, dass es nie SRB_STATUS_BUSY in der Mitte einer SCSI-Transaktion ausgibt. Nachdem die Transaktion gestartet wurde, muss sie abgeschlossen oder abgebrochen werden. Hardwarebelastungszustände während der Transaktion müssen vom Miniporttreiber behandelt werden.

Der Name HwStorStartIo ist ein Platzhalter zum Beschreiben der Miniportroutine im HwStartIo-ElementHW_INITIALIZATION_DATA Struktur . Diese Struktur wird im HwInitializationData-Parameter von StorPortInitialize übergeben. Der tatsächliche Prototyp dieser Routine wird in Storport.h wie folgt definiert:

typedef
BOOLEAN
(*PHW_STARTIO) (
  _In_ PVOID  DeviceExtension,
  _In_ PSCSI_REQUEST_BLOCK  Srb
  );

Ab Windows 8 kann der Srb-Parameter entweder auf SCSI_REQUEST_BLOCK oder STORAGE_REQUEST_BLOCK verweisen. Wenn der Funktionsbezeichner im Feld "Funktion " von SrbSRB_FUNCTION_STORAGE_REQUEST_BLOCK ist, ist der SRB eine STORAGE_REQUEST_BLOCK Anforderungsstruktur.

Beispiele

Um eine HwStorStartIo-Rückrufroutine zu definieren, müssen Sie zunächst eine Funktionsdeklaration bereitstellen, die statische Treiberüberprüfung (STATIC Driver Verifier , SDV) und andere Überprüfungstools erfordert, wie im folgenden Codebeispiel gezeigt:

Um eine HwStorStartIo-Rückruffunktion zu definieren, müssen Sie zuerst eine Funktionsdeklaration bereitstellen, die den Typ der Rückruffunktion identifiziert, die Sie definieren. Windows stellt eine Reihe von Rückruffunktionstypen für Treiber bereit. Das Deklarieren einer Funktion mithilfe der Rückruffunktionstypen hilft der Codeanalyse für Treiber, statische Treiberüberprüfung (SDV) und anderen Überprüfungstools, Fehler zu finden, und es ist eine Anforderung zum Schreiben von Treibern für das Windows-Betriebssystem.

Um beispielsweise eine HwStorStartIo-Rückrufroutine zu definieren, die "MyHwStartIo" heißt, verwenden Sie den HW_STARTIO Typ, und implementieren Sie Ihre Rückrufroutine wie folgt:

HW_STARTIO MyHwStartIo

BOOLEAN
MyHwStartIo (
  _In_ PVOID  DeviceExtension,
  _In_ PSCSI_REQUEST_BLOCK  Srb
  );
  {
      ...
  }

Der HW_STARTIO Funktionstyp wird in der Storport.h-Headerdatei definiert. Um Fehler genauer zu identifizieren, wenn Sie die Codeanalysetools ausführen, müssen Sie die _Use_decl_annotations_ annotation Funktionsdefinition hinzufügen. Dadurch _Use_decl_annotations_ annotation wird sichergestellt, dass die Anmerkungen, die auf den Funktionstyp HW_STARTIO in der Kopfzeilendatei angewendet werden, verwendet werden. Weitere Informationen zu den Anforderungen für Funktionsdeklarationen finden Sie unter Deklarieren von Funktionen mithilfe von Funktionsrollentypen für Storport-Treiber. Weitere Informationen finden _Use_decl_annotations_Sie unter "Annotating Function Behavior".

Anforderungen

   
Zielplattform Universell
Header storport.h (include Storport.h)
IRQL DISPATCH_LEVEL (Abschnitt "Hinweise".)

Siehe auch

HwStorBuildIo

SCSI_REQUEST_BLOCK

STORAGE_REQUEST_BLOCK

StorPortInitialize