Fonction ScsiPortNotification (srb.h)

La routine ScsiPortNotification informe le pilote de port spécifique au système d’exploitation de certains événements, par exemple lorsqu’un pilote miniport termine une requête ou est prêt à démarrer un autre SRB, ainsi que lorsque l’adaptateur de bus hôte (HBA) indique certaines conditions d’erreur SCSI qui se sont produites pendant une opération.

Notes

Les modèles de pilote de port SCSI et de pilote miniport SCSI peuvent être modifiés ou indisponibles à l’avenir. Au lieu de cela, nous vous recommandons d’utiliser les modèles de pilote Storport et de pilote Miniport Storport .

Syntaxe

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

Paramètres

NotificationType

Spécifie le type de notification. Consultez la section Notes.

HwDeviceExtension

Pointeur vers l’extension de périphérique matériel. Il s’agit d’une zone de stockage par adaptateur HBA que le pilote de port alloue et initialise pour le compte du pilote miniport. Les pilotes miniport stockent généralement des informations spécifiques à L’adaptateur HBA dans cette extension, telles que l’état de l’adaptateur HBA et les plages d’accès mappées de l’adaptateur HBA. Cette zone est disponible pour le pilote miniport dans le membre DeviceExtension-HwDeviceExtension> de l’objet d’appareil de l’adaptateur HBA immédiatement après que le pilote miniport a appelé ScsiPortInitialize. Le pilote de port libère cette mémoire lorsqu’il supprime l’appareil.

...

Arguments variadiques pour cette routine. Le nombre et le type d’arguments dépendent de NotificationType. Consultez la section Notes.

Valeur de retour

None

Remarques

La routine ScsiPortNotification a un ensemble différent de paramètres facultatifs associés à chaque NotificationType. La liste des valeurs possibles pour NotificationType suit, ainsi que des descriptions pour chaque valeur.

  • NotificationType = RequestComplete

    Indique que le Srb donné est terminé. Si cette valeur est définie, ScsiPortNotification nécessite un paramètre supplémentaire : l’adresse du SRB. Après cette notification, le pilote de port spécifique au système d’exploitation est propriétaire de la demande. Le pilote miniport ne doit pas accéder au Srb, et il ne doit pas passer le Srb à une autre routine (par exemple , ScsiPortLogError).

    Syntaxe :

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

    Indique que le pilote miniport est prêt pour une autre requête adressée à une cible qui n’est pas occupée actuellement. Cette notification doit être envoyée par le pilote miniport dès que le pilote est prêt pour une autre demande. En règle générale, cette notification est envoyée à partir de la routine HwScsiStartIo , mais parfois de la routine HwScsiInterrupt (ou HwScsiEnableInterruptsCallback).

  • NotificationType = NextLuRequest

    Indique que l’adaptateur HBA est prêt pour une autre requête pour l’unité logique spécifiée. Si cette valeur est définie, ScsiPortNotification nécessite trois paramètres supplémentaires : (1) l’ID de chemin, (2) l’ID cible et (3) le numéro d’unité logique. Cette valeur doit être utilisée uniquement si l’adaptateur HBA peut mettre en file d’attente plusieurs demandes et prendre en charge l’sens de requête automatique ou la mise en file d’attente étiquetée.

    Syntaxe :

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

    Indique que l’adaptateur HBA a détecté une réinitialisation sur le bus SCSI. Après cette notification, le pilote miniport est toujours responsable de l’exécution des demandes actives. Le pilote de port SCSI gère tous les retards de réinitialisation du bus requis.

  • NotificationType = CallEnableInterrupts

    Indique que le pilote miniport nécessite le pilote de port spécifique au système d’exploitation pour appeler la routine HwScsiEnableInterruptsCallback du pilote miniport. Si cette valeur est définie, ScsiPortNotification nécessite un paramètre supplémentaire : le point d’entrée du HwScsiEnableInterruptsCallback. La routine HwScsiInterrupt du pilote miniport effectue cet appel après avoir désactivé les interruptions sur l’adaptateur HBA, afin de différer le traitement des E/S pilotées par interruption si l’adaptateur HBA nécessite un interrogation ou un blocage dans l’ISR. Pendant l’exécution du rappel, les interruptions système restent activées, mais la routine HwScsiInterrupt du pilote miniport ne sera pas appelée. Le HwScsiEnableInterruptsCallback est chargé d’effectuer le traitement différé des E/S et d’appeler à nouveau ScsiPortNotification avec CallDisableInterrupts et le point d’entrée HwScsiDisableInterruptsCallback du pilote miniport.

    Syntaxe :

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

    Indique que le pilote miniport nécessite le pilote de port spécifique au système d’exploitation pour appeler la routine HwScsiDisableInterruptsCallback du pilote miniport. Si cette valeur est définie, ScsiPortNotification nécessite un paramètre supplémentaire : le point d’entrée du HwScsiDisableInterruptsCallback. Pendant que ce rappel s’exécute, il ne peut pas être préempté par une interruption, sauf à partir d’un appareil avec une interruption de priorité plus élevée que l’adaptateur HBA. Dans ce rappel, le pilote miniport réactive les interruptions sur l’adaptateur HBA.

    Syntaxe :

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

    Indique que le pilote miniport nécessite le pilote de port spécifique au système d’exploitation pour appeler la routine HwScsiTimer du pilote miniport dans le nombre de microsecondes demandé. Si cette valeur est définie, ScsiPortNotification nécessite deux paramètres supplémentaires : (1) le point d’entrée de la routine HwScsiTimer du pilote miniport et (2) un intervalle MiniportTimerValue , en microsecondes. Notez que la résolution du minuteur système est d’environ 10 millisecondes.

    Syntaxe :

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

    Indique qu’un appareil cible a peut-être été ajouté ou supprimé d’un bus dynamique. Si cette valeur est définie, ScsiPortNotification nécessite un paramètre supplémentaire : l’ID de chemin d’accès du bus sur lequel la modification a été détectée. Après cette notification, le pilote de port réinsume le bus en émettant des commandes INQUIRY. L’énumération de bus prend du temps et relie le bus. Par conséquent, un pilote de miniport ne doit pas envoyer cette notification inutilement.

    Syntaxe :

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

    Indique que le pilote miniport a détecté un événement pour lequel un ou plusieurs consommateurs de données WMI sont inscrits. Si cette valeur est définie, ScsiPortNotification nécessite au moins trois arguments supplémentaires : (1) un pointeur vers une structure d’événements WMI, (2) la taille de la structure d’événements et (3) l’ID de chemin d’accès de l’appareil cible si l’événement provient d’un appareil, ou 0xFF si l’événement provient de l’adaptateur. Si (3) est un ID de chemin d’accès, ScsiPortNotification nécessite deux arguments supplémentaires : (4) l’ID cible et (5) le numéro d’unité logique (LUN) de l’appareil cible.

    Syntaxe de 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
    );
    

    Syntaxe de PathId = 0xFF

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

    Indique que le pilote miniport a modifié les éléments de données ou le nombre d’instances d’un bloc de données donné précédemment inscrit en appelant IoWMIRegistrationControl. Si WMIReregister est défini, ScsiPortNotification nécessite au moins deux arguments supplémentaires : (1) l’ID de chemin d’accès de l’appareil cible pour réinscrire cet appareil, ou 0xFF pour réinscrire l’adaptateur. Si (1) est un ID de chemin d’accès, ScsiPortNotification nécessite deux arguments supplémentaires : (2) l’ID cible et (3) le numéro d’unité logique (LUN) de l’appareil cible.

    Syntaxe de 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
    );
    

    Syntaxe de PathId = 0xFF

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

Chaque pilote miniport doit appeler ScsiPortNotification deux fois pour chaque appel à la routine HwScsiStartIo du pilote miniport avec un SRB que le pilote miniport effectue correctement. Tout d’abord, le pilote miniport appelle ScsiPortNotification avec notificationType de NextRequest ou avec NextLuRequest si le pilote miniport prend en charge la mise en file d’attente étiquetée ou plusieurs requêtes par LU. Ensuite, le pilote miniport appelle ScsiPortNotification avec le NotificationType de RequestComplete et la demande qu’il vient de satisfaire.

La routine HwScsiInterrupt d’un pilote miniport est plus susceptible d’appeler ScsiPortNotification avec le NotificationType de ResetDetected.

Si un adaptateur HBA nécessite que le pilote miniport utilise plus d’une milliseconde de traitement des opérations d’E/S pilotées par les interruptions, sa routine HwScsiInterrupt doit désactiver les interruptions sur l’adaptateur HBA et appeler ScsiPortNotification avec CallEnableInterrupts et une routine HwScsiEnableInterruptsCallback fournie par le pilote. Cette routine, à son tour, appelle ScsiPortNotification avec CallDisableInterrupts et le HwScsiDisableInterruptsCallback correspondant fourni par le pilote.

Un pilote miniport inscrit en tant que fournisseur de données WMI peut appeler ScsiPortNotification avec WMIEvent pour publier un événement pour lequel il a déjà reçu une demande d’activation. Le pilote de port met en file d’attente l’événement dans la zone de données d’interruption de l’extension de périphérique du pilote miniport pour un traitement ultérieur à un IRQL inférieur. Étant donné que seul un nombre limité d’événements peut être mis en file d’attente à la fois, le pilote miniport doit utiliser WMIEvent pour signaler des conditions exceptionnelles plutôt que de routine, et il doit laisser au pilote de port le temps de revenir à DISPATCH_LEVEL entre les publications, afin d’éviter la perte d’événements.

Configuration requise

Condition requise Valeur
Plateforme cible Universal
En-tête srb.h (inclure Miniport.h, Scsi.h)
Bibliothèque Scsiport.lib ; Storport.lib
IRQL (Voir la section Remarques)

Voir aussi

HwScsiDisableInterruptsCallback

HwScsiEnableInterruptsCallback

HwScsiTimer

IoWMIRegistrationControl

ScsiPortCompleteRequest