ScsiPortNotification-Funktion (srb.h)

Die ScsiPortNotification-Routine informiert den betriebssystemspezifischen Porttreiber über bestimmte Ereignisse, z. B. wenn ein Miniporttreiber eine Anforderung abschließt oder bereit ist, einen anderen SRB zu starten, und wenn der Host bus Adapter (HBA) bestimmte SCSI-Fehlerbedingungen angibt, die während eines Vorgangs aufgetreten sind.

Hinweis

Der SCSI-Porttreiber und die SCSI-Miniporttreibermodelle können in Zukunft geändert oder nicht mehr verfügbar sein. Stattdessen wird empfohlen, die Modelle Storport-Treiber und Storport-Miniporttreiber zu verwenden.

Syntax

SCSIPORT_API VOID ScsiPortNotification(
  SCSI_NOTIFICATION_TYPE NotificationType,
  PVOID                  HwDeviceExtension,
  ...                    
);

Parameter

NotificationType

Gibt den Typ der Benachrichtigung an. Siehe Hinweise.

HwDeviceExtension

Zeiger auf die Hardwaregeräteerweiterung. Hierbei handelt es sich um einen HBA-Speicherbereich, den der Porttreiber im Namen des Miniporttreibers ordnet und initialisiert. Miniporttreiber speichern normalerweise HBA-spezifische Informationen in dieser Erweiterung, z. B. den Zustand des HBA und die zugeordneten Zugriffsbereiche des HBA. Dieser Bereich steht dem Miniporttreiber im DeviceExtension-HwDeviceExtension-Member> des HBA-Geräteobjekts unmittelbar nach dem Aufruf von ScsiPortInitialize durch den Miniporttreiber zur Verfügung. Der Porttreiber gibt diesen Arbeitsspeicher frei, wenn er das Gerät entfernt.

...

Verschiedene Argumente für diese Routine. Die Anzahl und der Typ der Argumente hängen von NotificationType ab. Siehe Hinweise.

Rückgabewert

Keine

Bemerkungen

Die ScsiPortNotification-Routine verfügt über einen anderen Satz optionaler Parameter, die jedem NotificationType zugeordnet sind. Es folgen die Liste der möglichen Werte für NotificationType sowie Beschreibungen für jeden Wert.

  • NotificationType = RequestComplete

    Gibt an, dass der angegebene Srb abgeschlossen wurde. Wenn dieser Wert festgelegt ist, benötigt ScsiPortNotification einen zusätzlichen Parameter: die Adresse des SRB. Nach dieser Benachrichtigung besitzt der betriebssystemspezifische Porttreiber die Anforderung. Der Miniporttreiber darf nicht auf den Srb zugreifen, und er darf den Srb nicht an eine andere Routine (z. B. ScsiPortLogError) übergeben.

    Syntax:

    VOID ScsiPortNotification(
      _In_     SCSI_NOTIFICATION_TYPE NotificationType,   // RequestComplete
      _In_     PVOID                  HwDeviceExtension,
      _In_opt_ PSCSI_REQUEST_BLOCK    Srb
    );
    
  • NotificationType = NextRequest

    Gibt an, dass der Miniporttreiber für eine weitere Anforderung an ein Derzeit nicht ausgelastetes Ziel bereit ist. Diese Benachrichtigung sollte vom Miniporttreiber gesendet werden, sobald der Treiber für eine weitere Anforderung bereit ist. Normalerweise wird diese Benachrichtigung von der HwScsiStartIo-Routine gesendet, manchmal aber von der HwScsiInterrupt-Routine (oder HwScsiEnableInterruptsCallback).

  • NotificationType = NextLuRequest

    Gibt an, dass der HBA für eine weitere Anforderung für die angegebene logische Einheit bereit ist. Wenn dieser Wert festgelegt ist, benötigt ScsiPortNotification drei zusätzliche Parameter: (1) die Pfad-ID, (2) die Ziel-ID und (3) die logische Einheitsnummer. Dieser Wert sollte nur verwendet werden, wenn der HBA mehrere Anforderungen in die Warteschlange stellen kann und automatische Anforderungssinn oder getaggtes Warteschlangening unterstützt.

    Syntax:

    VOID ScsiPortNotification(
      _In_     SCSI_NOTIFICATION_TYPE NotificationType,   // NextLuRequest
      _In_     PVOID                  HwDeviceExtension,
      _In_opt_                        PathId,
      _In_opt_                        TargetId,
      _In_opt_                        Lun
    );
    
  • NotificationType = ResetDetected

    Gibt an, dass der HBA eine Zurücksetzung auf dem SCSI-Bus erkannt hat. Nach dieser Benachrichtigung ist der Miniporttreiber weiterhin für das Abschließen aller aktiven Anforderungen verantwortlich. Der SCSI-Porttreiber verwaltet alle erforderlichen Buszurücksetzungsverzögerungen.

  • NotificationType = CallEnableInterrupts

    Gibt an, dass der Miniporttreiber den betriebssystemspezifischen Porttreiber benötigt, um die HwScsiEnableInterruptsCallback-Routine des Miniporttreibers aufzurufen. Wenn dieser Wert festgelegt ist, benötigt ScsiPortNotification einen zusätzlichen Parameter: den Einstiegspunkt für HwScsiEnableInterruptsCallback. Die HwScsiInterrupt-Routine des Miniporttreibers führt diesen Aufruf aus, nachdem Interrupts für den HBA deaktiviert wurden, um eine unterbrechungsgesteuerte E/A-Verarbeitung zurückzuweisen, wenn der HBA eine Abfrage oder ein Anhalten in der ISR erfordert. Während der Rückruf ausgeführt wird, bleiben Systemunterbrechungen aktiviert, aber die HwScsiInterrupt-Routine des Miniporttreibers wird nicht aufgerufen. Der HwScsiEnableInterruptsCallback ist für den Abschluss der verzögerten E/A-Verarbeitung und für das erneute Aufrufen von ScsiPortNotification mit CallDisableInterrupts und dem HwScsiDisableInterruptsCallback-Einstiegspunkt des Miniporttreibers verantwortlich.

    Syntax:

    VOID ScsiPortNotification(
      _In_     SCSI_NOTIFICATION_TYPE NotificationType,           // CallEnableInterrupts
      _In_     PVOID                  HwDeviceExtension,
      _In_opt_ PHW_INTERRUPT          HwScsiXxxInterruptsCallback
    );
    
  • NotificationType = CallDisableInterrupts

    Gibt an, dass der Miniporttreiber den betriebssystemspezifischen Porttreiber benötigt, um die HwScsiDisableInterruptsCallback-Routine des Miniporttreibers aufzurufen. Wenn dieser Wert festgelegt ist, benötigt ScsiPortNotification einen zusätzlichen Parameter: den Einstiegspunkt für HwScsiDisableInterruptsCallback. Während dieser Rückruf ausgeführt wird, kann er nicht durch einen Interrupt außer von einem Gerät mit einem Interrupt mit höherer Priorität als dem HBA entfernt werden. In diesem Rückruf stellt der Miniporttreiber Interrupts für den HBA wieder her.

    Syntax:

    VOID ScsiPortNotification(
      _In_     SCSI_NOTIFICATION_TYPE NotificationType,          // CallDisableInterrupts
      _In_     PVOID                  HwDeviceExtension,
      _In_opt_ PHW_INTERRUPT          HwScsiXxxInterruptsCallback
    );
    
  • NotificationType = RequestTimerCall

    Gibt an, dass der Miniporttreiber den betriebssystemspezifischen Porttreiber benötigt, um die HwScsiTimer-Routine des Miniporttreibers in der angeforderten Anzahl von Mikrosekunden aufzurufen. Wenn dieser Wert festgelegt ist, benötigt ScsiPortNotification zwei zusätzliche Parameter: (1) den Einstiegspunkt für die HwScsiTimer-Routine des Miniporttreibers und (2) ein MiniportTimerValue-Intervall in Mikrosekunden. Beachten Sie, dass die Auflösung des Systemtimers ungefähr 10 Millisekunden beträgt.

    Syntax:

    VOID ScsiPortNotification(
      _In_     SCSI_NOTIFICATION_TYPE NotificationType,    // RequestTimerCall
      _In_     PVOID                  HwDeviceExtension,
      _In_opt_ PHW_TIMER              HwScsiTimer,
      _In_opt_ ULONG                  MiniportTimerValue
    );
    
  • NotificationType = BusChangeDetected

    Gibt an, dass ein Zielgerät einem dynamischen Bus hinzugefügt oder entfernt wurde. Wenn dieser Wert festgelegt ist, benötigt ScsiPortNotification einen zusätzlichen Parameter: die Pfad-ID des Busses, auf dem die Änderung erkannt wurde. Nach dieser Benachrichtigung zählt der Porttreiber den Bus erneut auf, indem er INQUIRY-Befehle ausgibt. Die Busaufzählung ist zeitaufwändig und bindet den Bus, sodass ein Miniporttreiber diese Benachrichtigung nicht unnötig senden sollte.

    Syntax:

    VOID ScsiPortNotification(
      _In_     SCSI_NOTIFICATION_TYPE NotificationType,    // BusChangeDetected
      _In_     PVOID                  HwDeviceExtension,
      _In_opt_ UCHAR                  PathId
    );
    
  • NotificationType = WMIEvent

    Gibt an, dass der Miniporttreiber ein Ereignis erkannt hat, für das mindestens ein WMI-Datenverbraucher registriert ist. Wenn dieser Wert festgelegt ist, benötigt ScsiPortNotification mindestens drei zusätzliche Argumente: (1) einen Zeiger auf eine WMI-Ereignisstruktur, (2) die Größe der Ereignisstruktur und (3) die Pfad-ID des Zielgeräts, wenn das Ereignis von einem Gerät stammt, oder 0xFF, wenn das Ereignis vom Adapter stammt. Wenn (3) eine Pfad-ID ist, benötigt ScsiPortNotification zwei zusätzliche Argumente: (4) die Ziel-ID und (5) die LUN (Logical Unit Number) des Zielgeräts.

    Syntax für PathId != 0xFF

    VOID ScsiPortNotification(
      _In_     SCSI_NOTIFICATION_TYPE NotificationType,    // WMIEvent
      _In_     PVOID                  HwDeviceExtension,
      _In_opt_ PVOID                  WMIEvent,
      _In_opt_ UCHAR                  PathId,              // != 0xFF
      _In_opt_ UCHAR                  TargetId,
      _In_opt_ UCHAR                  Lun
    );
    

    Syntax für PathId = 0xFF

    VOID ScsiPortNotification(
      _In_     SCSI_NOTIFICATION_TYPE NotificationType,    // WMIEvent
      _In_     PVOID                  HwDeviceExtension,
      _In_opt_ PVOID                  WMIEvent,
      _In_opt_ UCHAR                  PathId               // 0xFF
    );
    
  • NotificationType = WMIReregister

    Gibt an, dass der Miniporttreiber die Datenelemente oder die Anzahl der Instanzen eines bestimmten Datenblocks geändert hat, die zuvor durch Aufrufen von IoWMIRegistrationControl registriert wurden. Wenn WMIReregister festgelegt ist, benötigt ScsiPortNotification mindestens zwei zusätzliche Argumente: (1) die Pfad-ID des Zielgeräts, um das Gerät erneut zu registrieren, oder 0xFF, um den Adapter erneut zu registrieren. Wenn (1) eine Pfad-ID ist, benötigt ScsiPortNotification zwei zusätzliche Argumente: (2) die Ziel-ID und (3) die LUN (Logical Unit Number) des Zielgeräts.

    Syntax für PathId != 0xFF

    VOID ScsiPortNotification(
      _In_     SCSI_NOTIFICATION_TYPE NotificationType,    // WMIReregister
      _In_     PVOID                  HwDeviceExtension,
      _In_opt_ UCHAR                  PathId,             // != 0xFF
      _In_opt_ UCHAR                  TargetId,
      _In_opt_ UCHAR                  Lun
    );
    

    Syntax für PathId = 0xFF

    VOID ScsiPortNotification(
      _In_     SCSI_NOTIFICATION_TYPE NotificationType,   // WMIReregister
      _In_     PVOID                  HwDeviceExtension,
      _In_opt_ UCHAR                  PathId              // 0xFF
    );
    

Jeder Miniporttreiber muss ScsiPortNotification zweimal für jeden Aufruf der HwScsiStartIo-Routine des Miniporttreibers mit einem SRB aufrufen, den der Miniporttreiber erfolgreich abschließt. Zunächst ruft der Miniporttreiber ScsiPortNotification mit dem NotificationType von NextRequest oder mit NextLuRequest auf, wenn der Miniporttreiber getaggtes Queuing oder mehrere Anforderungen pro LU unterstützt. Anschließend ruft der Miniporttreiber ScsiPortNotification mit dem NotificationType von RequestComplete und der Gerade erfüllten Anforderung auf.

Die HwScsiInterrupt-Routine eines Miniporttreibers ruft höchstwahrscheinlich ScsiPortNotification mit dem NotificationType von ResetDetected auf.

Wenn ein HBA erfordert, dass der Miniporttreiber mehr als eine Millisekunden-Verarbeitung unterbrechungsgesteuerte E/A-Vorgänge verwendet, sollte seine HwScsiInterrupt-Routine Interrupts für den HBA deaktivieren und ScsiPortNotification mit CallEnableInterrupts und einer vom Treiber bereitgestellten HwScsiEnableInterruptsCallback-Routine aufrufen. Diese Routine ruft wiederum ScsiPortNotification mit CallDisableInterrupts und dem entsprechenden vom Treiber bereitgestellten HwScsiDisableInterruptsCallback auf.

Ein Miniporttreiber, der als WMI-Datenanbieter registriert ist, kann ScsiPortNotification mit WMIEvent aufrufen, um ein Ereignis zu posten, für das er zuvor eine Aktivierungsanforderung erhalten hat. Der Porttreiber stellt das Ereignis im Interruptdatenbereich der Geräteerweiterung des Miniporttreibers für die spätere Verarbeitung an einem niedrigeren IRQL in die Warteschlange. Da nur eine begrenzte Anzahl von Ereignissen gleichzeitig in die Warteschlange gestellt werden kann, sollte der Miniporttreiber WMIEvent verwenden, um außergewöhnliche und nicht routinemäßige Bedingungen zu signalisieren, und es sollte dem Porttreiber Zeit geben, um zwischen den Buchungen wieder DISPATCH_LEVEL zu erreichen, um zu verhindern, dass Ereignisse verloren gehen.

Anforderungen

Anforderung Wert
Zielplattform Universell
Header srb.h (einschließlich Miniport.h, Scsi.h)
Bibliothek Scsiport.lib; Storport.lib
IRQL (Siehe Abschnitt "Hinweise")

Weitere Informationen

HwScsiDisableInterruptsCallback

HwScsiEnableInterruptsCallback

HwScsiTimer

IoWMIRegistrationControl

ScsiPortCompleteRequest