SCSI_REQUEST_BLOCK structure (srb.h)

La structure SCSI_REQUEST_BLOCK est associée à une fonction SRB.

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

typedef struct _SCSI_REQUEST_BLOCK {
  USHORT                     Length;
  UCHAR                      Function;
  UCHAR                      SrbStatus;
  UCHAR                      ScsiStatus;
  UCHAR                      PathId;
  UCHAR                      TargetId;
  UCHAR                      Lun;
  UCHAR                      QueueTag;
  UCHAR                      QueueAction;
  UCHAR                      CdbLength;
  UCHAR                      SenseInfoBufferLength;
  ULONG                      SrbFlags;
  ULONG                      DataTransferLength;
  ULONG                      TimeOutValue;
  PVOID                      DataBuffer;
  PVOID                      SenseInfoBuffer;
  struct _SCSI_REQUEST_BLOCK *NextSrb;
  PVOID                      OriginalRequest;
  PVOID                      SrbExtension;
  union {
    ULONG InternalStatus;
    ULONG QueueSortKey;
    ULONG LinkTimeoutValue;
  };
  ULONG                      Reserved;
  UCHAR                      Cdb[16];
} SCSI_REQUEST_BLOCK, *PSCSI_REQUEST_BLOCK;

Membres

Length

Spécifie la taille en octets de cette structure.

Function

Spécifie l’opération à effectuer, qui peut être l’une des valeurs suivantes :

Valeur Opération
SRB_FUNCTION_EXECUTE_SCSI (0x00) Une demande d’E/S d’appareil SCSI doit être exécutée sur l’unité logique cible.
SRB_FUNCTION_ABORT_COMMAND (0x10) Un message SCSIMESS_ABORT doit être envoyé pour annuler la demande pointée par le membre NextSrb . S’il s’agit d’une demande de file d’attente marquée, un message SCSIMESS_ABORT_WITH_TAG doit être utilisé à la place. Si la demande indiquée a été effectuée, cette demande doit être effectuée normalement. Seuls les membres SRB Function, PathId, TargetId, Lun et NextSrb sont valides.
SRB_FUNCTION_RESET_DEVICE (0x13) Le pilote ScsiPort n’envoie plus ce SRB à ses miniports. Seuls les pilotes de miniport Storport utilisent ce SRB. Le contrôleur cible SCSI doit être réinitialisé à l’aide du message SCSIMESS_BUS_DEVICE_RESET. Le pilote miniport doit effectuer toutes les requêtes actives pour le contrôleur cible. Seuls les membres SRB Function, TargetId et PathId sont valides.
SRB_FUNCTION_RESET_LOGICAL_UNIT (0x20) L’unité logique doit être réinitialisée, si possible. Le pilote miniport HBA doit effectuer toutes les demandes actives pour l’unité logique. Seuls les membres Function, PathId, TargetId et Lun du SRB sont valides. Storport prend en charge ce type de réinitialisation, mais pas le port SCSI.
SRB_FUNCTION_RESET_BUS (0x12) Le bus SCSI doit être réinitialisé à l’aide du message SCSIMESS_BUS_DEVICE_RESET. Un pilote miniport ne reçoit cette demande que si une demande donnée a expiré et qu’une demande ultérieure d’abandon de la demande de délai d’expiration a également expiré. Seuls les membres SRB Function et PathId sont valides.
SRB_FUNCTION_TERMINATE_IO (0x14) Un message SCSIMESS_TERMINATE_IO_PROCESS doit être envoyé pour annuler la demande pointée par le membre NextSrb . Si la demande indiquée est déjà terminée, cette demande doit être effectuée normalement. Seuls les membres SRB Function, PathId, TargetId, Lun et NextSrb sont valides.
SRB_FUNCTION_RELEASE_RECOVERY (0x11) Un message SCSIMESS_RELEASE_RECOVERY doit être envoyé au contrôleur cible. Seuls les membres SRB Function, PathId, TargetId et Lun sont valides.
SRB_FUNCTION_RECEIVE_EVENT (0x03) L’adaptateur HBA doit être prêt à recevoir une notification d’événement asynchrone de la cible adressée. Le membre SRB DataBuffer indique où les données doivent être placées.
SRB_FUNCTION_SHUTDOWN (0x07) Le système est en cours d’arrêt. Cette requête est envoyée à un pilote miniport uniquement s’il a défini CachesData sur TRUE dans le PORT_CONFIGURATION_INFORMATION pour l’adaptateur HBA. Un tel pilote miniport peut recevoir plusieurs de ces notifications avant que toute activité système s’arrête réellement. Toutefois, la dernière notification d’arrêt se produit après la dernière E/S de démarrage. Seuls les membres SRB Function, PathId, TargetId et Lun sont valides.
SRB_FUNCTION_FLUSH (0x08) Le pilote miniport doit vider toutes les données mises en cache pour l’appareil cible. Cette requête est envoyée au pilote miniport uniquement s’il a défini CachesData sur TRUE dans le PORT_CONFIGURATION_INFORMATION pour l’adaptateur HBA. Seuls les membres SRB Function, PathId, TargetId et Lun sont valides.
SRB_FUNCTION_IO_CONTROL (0x02) La demande est une demande de contrôle d’E/S, provenant d’une application en mode utilisateur avec un HBA dédié. Le DataBuffer SRB pointe vers un en-tête SRB_IO_CONTROL suivi de la zone de données. La valeur dans DataBuffer peut être utilisée par le pilote, quelle que soit la valeur de MapBuffers. Seuls les membres SRB Function, SrbFlags, TimeOutValue, DataBuffer et DataTransferLength sont valides, ainsi que le membre SrbExtension si le pilote miniport a demandé des extensions SRB lors de l’initialisation. Si un pilote miniport contrôle un HBA dédié à l’application afin de prendre en charge cette requête, le pilote miniport doit exécuter la requête et avertir le pilote de port spécifique au système d’exploitation lorsque le SRB est terminé, à l’aide du mécanisme normal d’appels à ScsiPortNotification avec RequestComplete et NextRequest.
SRB_FUNCTION_LOCK_QUEUE (0x18) Contient les requêtes mises en file d’attente par le pilote de port pour une unité logique particulière, généralement pendant le traitement d’une demande d’alimentation. Seuls les membres SRB Length, Function, SrbFlags et OriginalRequest sont valides. Lorsque la file d’attente est verrouillée, seules les demandes avec SrbFlags ORed avec SRB_FLAGS_BYPASS_LOCKED_QUEUE sont traitées. Les pilotes miniport SCSI ne traitent pas les requêtes SRB_FUNCTION_LOCK_QUEUE.
SRB_FUNCTION_UNLOCK_QUEUE (0x19) Libère la file d’attente du pilote de port pour une unité logique précédemment verrouillée avec SRB_FUNCTION_LOCK_QUEUE. Les SrbFlags de la demande de déverrouillage doivent être ORed avec SRB_FLAGS_BYPASS_LOCKED_QUEUE. Seuls les membres SRB Length, Function, SrbFlags et OriginalRequest sont valides. Les pilotes miniport SCSI ne traitent pas les requêtes SRB_FUNCTION_UNLOCK_QUEUE.
SRB_FUNCTION_UNLOCK_QUEUE (0x19) Libère la file d’attente du pilote de port pour une unité logique précédemment verrouillée avec SRB_FUNCTION_LOCK_QUEUE. Les SrbFlags de la demande de déverrouillage doivent être ORed avec SRB_FLAGS_BYPASS_LOCKED_QUEUE. Seuls les membres SRB Length, Function, SrbFlags et OriginalRequest sont valides. Les pilotes miniport SCSI ne traitent pas les requêtes SRB_FUNCTION_UNLOCK_QUEUE.
SRB_FUNCTION_DUMP_POINTERS (0x26) Une requête avec cette fonction est envoyée à un pilote de miniport Storport qui est utilisé pour contrôler le disque qui contient les données de vidage sur incident. La demande collecte les informations nécessaires au pilote miniport pour prendre en charge le vidage sur incident et la mise en veille prolongée. Consultez la structure MINIPORT_DUMP_POINTERS . Un pilote de miniport physique doit définir l’indicateur STOR_FEATURE_DUMP_POINTERS dans le membre FeatureSupport de son HW_INITIALIZATION_DATA pour recevoir une demande avec cette fonction.
SRB_FUNCTION_FREE_DUMP_POINTERS (0x27) Une demande avec cette fonction est envoyée à un pilote de miniport Storport pour libérer toutes les ressources allouées lors d’une demande précédente pour SRB_FUNCTION_DUMP_POINTERS.

SrbStatus

Retourne la status de la demande terminée. Ce membre doit être défini par le pilote miniport avant qu’il informe le pilote spécifique au système d’exploitation que la demande est terminée en appelant ScsiPortNotification avec RequestComplete. La valeur de ce membre peut être l’une des suivantes :

Valeur Signification
SRB_STATUS_PENDING Indique que la demande est en cours. Le pilote de port spécifique au système d’exploitation initialise SrbStatus à cette valeur.
SRB_STATUS_SUCCESS Indique que la demande a été effectuée avec succès.
SRB_STATUS_ABORTED Indique que la requête a été abandonnée comme indiqué par le pilote de port. Un pilote miniport définit cette status dans nextSrb pour une demande de SRB_FUNCTION_ABORT_COMMAND réussie.
SRB_STATUS_ABORT_FAILED Indique qu’une tentative d’abandon de la demande a échoué. Retournez cette status pour une demande SRB_FUNCTION_ABORT_COMMAND lorsque la requête spécifiée est introuvable.
SRB_STATUS_ERROR Indique que la demande a été effectuée avec une erreur dans le bus SCSI status.
SRB_STATUS_BUSY Indique que le pilote miniport ou l’appareil cible n’a pas pu accepter la demande pour le moment. Le pilote de port spécifique au système d’exploitation présentera de nouveau la demande ultérieurement.
SRB_STATUS_INTERNAL_ERROR Indique que le pilote de port SCSI n’a pas pu remettre la demande au pilote miniport ou au périphérique cible. Dans ce cas, status est enregistré dans InternalStatus.
SRB_STATUS_INVALID_REQUEST Indique que le pilote miniport ne prend pas en charge la demande donnée.
SRB_STATUS_NO_DEVICE Indique que l’appareil n’a pas répondu.
SRB_STATUS_TIMEOUT Indique que la requête a expiré.
SRB_STATUS_SELECTION_TIMEOUT Indique que le délai de sélection de l’appareil SCSI a expiré.
SRB_STATUS_COMMAND_TIMEOUT Indique que la cible n’a pas terminé la commande dans le délai imparti.
SRB_STATUS_MESSAGE_REJECTED Indique que la cible a rejeté un message. Cette valeur est normalement retournée uniquement pour les requêtes de type message telles que SRB_FUNCTION_TERMINATE_IO.
SRB_STATUS_BUS_RESET Indique qu’une réinitialisation de bus s’est produite pendant l’exécution de cette requête.
SRB_STATUS_PARITY_ERROR Indique qu’une erreur de parité s’est produite sur le bus SCSI et qu’une nouvelle tentative a échoué.
SRB_STATUS_REQUEST_SENSE_FAILED Indique que la commande request-sense a échoué. Cette opération est retournée uniquement si l’adaptateur HBA effectue l’affichage automatique de la requête et si le pilote miniport définit AutoRequestSense sur TRUE dans le PORT_CONFIGURATION_INFORMATION pour cet adaptateur HBA.
SRB_STATUS_NO_HBA Indique que l’adaptateur HBA ne répond pas.
SRB_STATUS_DATA_OVERRUN Indique qu’une erreur de dépassement ou de sous-exécution de données s’est produite. Le pilote miniport doit également mettre à jour le membre DataTransferLength du SRB pour indiquer la quantité de données réellement transférées en cas de sous-exécution.
SRB_STATUS_UNEXPECTED_BUS_FREE Indique que la cible est déconnectée de manière inattendue.
SRB_STATUS_PHASE_SEQUENCE_FAILURE Indique que l’adaptateur HBA a détecté une erreur d’échec de séquence de phase non valide.
SRB_STATUS_REQUEST_FLUSHED Indique que la demande de status a été arrêtée.
SRB_STATUS_BAD_FUNCTION Indique que le code de la fonction SRB n’est pas pris en charge.
SRB_STATUS_INVALID_PATH_ID Indique que le PathId spécifié dans le SRB n’existe pas.
SRB_STATUS_INVALID_TARGET_ID Indique que la valeur TargetID dans le SRB n’est pas valide.
SRB_STATUS_INVALID_LUN Indique que la valeur lun dans le SRB n’est pas valide.
SRB_STATUS_ERROR_RECOVERY Indique que la demande a été effectuée avec une erreur dans le bus SCSI status et que le message SCSI INITIATE RECOVERY a été reçu.
SRB_STATUS_AUTOSENSE_VALID Indique que les informations retournées dans SenseInfoBuffer sont valides.
SRB_STATUS_QUEUE_FROZEN Un pilote miniport ne doit jamais définir le membre SrbStatus sur cette valeur. Le pilote de port Windows peut définir cette valeur pour informer un pilote de classe de stockage que sa file d’attente de requêtes pour un périphérique particulier a été figée.

ScsiStatus

Retourne le status SCSI retourné par l’adaptateur HBA ou l’appareil cible. Si le status n’est pas SUCCESS, le pilote miniport doit définir le membre SrbStatus sur SRB_STATUS_ERROR.

PathId

Indique le port SCSI ou le bus de la demande. Cette valeur est de base zéro.

TargetId

Indique le contrôleur ou l’appareil cible sur le bus.

Lun

Indique le numéro d’unité logique de l’appareil.

QueueTag

Contient la valeur de balise de file d’attente attribuée par le pilote de port spécifique au système d’exploitation. Si ce membre est utilisé pour la mise en file d’attente étiquetée, l’adaptateur HBA prend en charge la mise en file d’attente interne des requêtes adressées aux unités de base de données et le pilote miniport a défini TaggedQueueing sur TRUE dans le PORT_CONFIGURATION_INFORMATION pour cet adaptateur HBA.

QueueAction

Indique le message de mise en file d’attente étiquetée à utiliser lorsque l’indicateur SRB_FLAGS_QUEUE_ACTION_ENABLE est défini. La valeur peut être l’une des suivantes : SRB_SIMPLE_TAG_REQUEST, SRB_HEAD_OF_QUEUE_TAG_REQUEST ou SRB_ORDERED_QUEUE_TAG_REQUEST, comme défini selon la spécification SCSI.

CdbLength

Indique la taille en octets du bloc descripteur de commande SCSI-2 ou version ultérieure.

SenseInfoBufferLength

Indique la taille en octets de la mémoire tampon request-sense. Si une sous-exécution se produit, le pilote miniport doit mettre à jour ce membre avec le nombre d’octets réellement transférés.

SrbFlags

Indique différents paramètres et options concernant la requête. SrbFlags est en lecture seule, sauf lorsque SRB_FLAGS_UNSPECIFIED_DIRECTION est défini et que les pilotes miniport des adaptateurs DMA subordonnés sont nécessaires pour mettre à jour SRB_FLAGS_DATA_IN ou SRB_FLAGS_DATA_OUT. Un ou plusieurs des indicateurs suivants peuvent être définis pour ce membre :

Indicateur Signification
SRB_FLAGS_QUEUE_ACTION_ENABLE Indique que les actions de file d’attente étiquetées doivent être activées.
SRB_FLAGS_DISABLE_AUTOSENSE Indique que les informations de sens de la demande ne doivent pas être retournées.
SRB_FLAGS_DATA_IN Indique que les données seront transférées de l’appareil vers le système.
SRB_FLAGS_DATA_OUT Indique que les données seront transférées du système vers l’appareil.
SRB_FLAGS_UNSPECIFIED_DIRECTION Défini pour la compatibilité descendante avec les interfaces SCSI ASPI/CAM, cet indicateur indique que le sens de transfert peut être l’un des précédents, car les deux indicateurs précédents sont définis. Si cet indicateur est défini, un pilote miniport doit déterminer le sens du transfert en examinant la phase de données de la cible sur le bus SCSI. Si son adaptateur HBA est un périphérique DMA subordonné, un tel pilote miniport doit mettre à jour SRB_FLAGS_DATA_OUT ou SRB_FLAGS_DATA_IN vers la valeur correcte avant d’appeler ScsiPortIoMapTransfer.
SRB_FLAGS_NO_DATA_TRANSFER Indique qu’aucun transfert de données n’est effectué avec cette demande. Si cette option est définie, les indicateurs SRB_FLAGS_DATA_OUT, SRB_FLAGS_DATA_IN et SRB_FLAGS_UNSPECIFIED_DIRECTION sont clairs.
SRB_FLAGS_DISABLE_SYNCH_TRANSFER Indique que l’adaptateur HBA doit, si possible, effectuer des E/S asynchrones pour cette demande de transfert. Si les E/S synchrones ont été négociées précédemment, l’adaptateur HBA doit renégocier pour les E/S asynchrones avant d’effectuer le transfert.
SRB_FLAGS_DISABLE_DISCONNECT Indique que l’adaptateur HBA ne doit pas autoriser la cible à se déconnecter du bus SCSI pendant le traitement de cette demande.
SRB_FLAGS_BYPASS_FROZEN_QUEUE N’est pas pertinent pour les pilotes miniport.
SRB_FLAGS_NO_QUEUE_FREEZE N’est pas pertinent pour les pilotes miniport.
SRB_FLAGS_IS_ACTIVE N’est pas pertinent pour les pilotes miniport.
SRB_FLAGS_ALLOCATED_FROM_ZONE N’est pas pertinent pour les pilotes miniport et est obsolète pour les pilotes de classe Windows actuels. Pour un pilote de classe héritée Windows, cela indique si le SRB a été alloué à partir d’une mémoire tampon de zone. Si cet indicateur est défini, le pilote de classe doit appeler ExInterlockedFreeToZone pour libérer le SRB ; sinon, il doit appeler ExFreePool. Les nouveaux pilotes de classe doivent utiliser des listes de lookaside plutôt que des mémoires tampons de zone.
SRB_FLAGS_SGLIST_FROM_POOL N’est pas pertinent pour les pilotes de miniport. Pour un pilote de classe Windows, cela indique que la mémoire d’une liste de points/regroupements a été allouée à partir d’un pool non paginé. Si cet indicateur est défini, le pilote de classe doit appeler ExFreePool pour libérer la mémoire une fois le SRB terminé.
SRB_FLAGS_BYPASS_LOCKED_QUEUE N’est pas pertinent pour les pilotes de miniport. Pour le pilote de port, cet indicateur indique que la demande doit être traitée si la file d’attente d’unités logiques est verrouillée. Un pilote de niveau supérieur doit définir cet indicateur pour envoyer une demande de SRB_FUNCTION_UNLOCK_QUEUE.
SRB_FLAGS_NO_KEEP_AWAKE N’est pas pertinent pour les pilotes de miniport. Un pilote de classe Windows utilise cet indicateur pour indiquer au pilote de port qu’il doit signaler l’inactivité au lieu de mettre sous tension l’appareil pour gérer cette demande.
SRB_FLAGS_FREE_SENSE_BUFFER Indique que le port ou le pilote miniport a alloué une mémoire tampon pour les données sense. Cela informe le pilote de classe qu’il doit libérer la mémoire tampon de données sense après l’extraction des données.

DataTransferLength

Indique la taille en octets de la mémoire tampon de données. Si une sous-exécution se produit, le pilote miniport doit mettre à jour ce membre en fonction du nombre d’octets réellement transférés.

TimeOutValue

Indique l’intervalle en secondes pendant lequel la requête peut s’exécuter avant que le pilote de port spécifique au système d’exploitation puisse considérer qu’elle a expiré. Les pilotes miniport ne sont pas tenus de chronomètrer les demandes, car le pilote de port le fait déjà.

DataBuffer

Pointe vers la mémoire tampon de données. Les pilotes miniport ne doivent pas utiliser cette valeur comme pointeur de données, sauf si le pilote miniport a défini MapBuffers sur TRUE dans le PORT_CONFIGURATION_INFORMATION pour l’adaptateur HBA. Toutefois, dans le cas de requêtes SRB_FUNCTION_IO_CONTROL, les pilotes miniport peuvent utiliser cette valeur comme pointeur de données, quelle que soit la valeur de MapBuffers.

SenseInfoBuffer

Pointe vers la mémoire tampon request-sense. Un pilote miniport n’est pas nécessaire pour fournir des données d’sens de requête après une condition CHECK.

NextSrb

Indique le SCSI_REQUEST_BLOCK auquel cette demande s’applique. Seul un petit sous-ensemble de requêtes utilise un deuxième SRB, par exemple SRB_FUNCTION_ABORT_COMMAND.

OriginalRequest

Pointe vers l’IRP pour cette demande. Ce membre n’est pas pertinent pour les pilotes de miniport

SrbExtension

Pointe vers l’extension Srb. Un pilote miniport ne doit pas utiliser ce membre s’il a défini SrbExtensionSize sur zéro dans le SCSI_HW_INITIALIZATION_DATA. La mémoire sur SrbExtension n’est pas initialisée par le pilote de port spécifique au système d’exploitation, et les données déterminées par le pilote miniport sont accessibles directement par l’adaptateur HBA. L’adresse physique correspondante peut être obtenue en appelant ScsiPortGetPhysicalAddress avec le pointeur SrbExtension .

InternalStatus

Utilisé par le pilote de port SCSI, au lieu de SrbStatus, pour signaler la status de la requête terminée chaque fois que la demande ne peut pas être remise au pilote miniport. Dans ce cas, SrbStatus est défini sur SRB_STATUS_INTERNAL_ERROR. Ce membre est utilisé exclusivement pour la communication entre le port SCSI et le pilote de classe et ne doit pas être utilisé par les pilotes miniport.

QueueSortKey

Spécifie le décalage à partir du début du média ou de zéro, en fonction du type de l’appareil cible.

LinkTimeoutValue

Valeur du délai d’expiration du lien.

Reserved

Réservé.

Cdb[16]

Spécifie le bloc de descripteur de commande SCSI-2 ou ultérieur à envoyer à l’appareil cible.

Remarques

Les pilotes de filtre et de classe de stockage Windows peuvent envoyer des SDR avec les valeurs de fonction suivantes au pilote de port système :

  • SRB_FUNCTION_CLAIM_DEVICE pour indiquer que le pilote de classe prend en charge un périphérique identifié dans le SRB par les membres PathId, TargetId et Lun .
  • SRB_ATTACH_DEVICE pour indiquer qu’un pilote de filtre, superposé au-dessus d’un pilote de classe, souhaite que les demandes d’un périphérique particulier soient routées en premier vers le pilote de filtre.
  • SRB_FUNCTION_RELEASE_DEVICE pour indiquer qu’un pilote de classe libère sa revendication sur un périphérique particulier.
  • SRB_FUNCTION_FLUSH_QUEUE à demander l’annulation de toutes les demandes actuellement mises en file d’attente dans le pilote de port vers un périphérique particulier.
  • SRB_FUNCTION_RELEASE_QUEUE de demander au pilote de port de libérer une file d’attente figée de requêtes vers un périphérique particulier.

Les SRB_FUNCTION_XXX précédents ne sont jamais définis en SBS envoyés aux pilotes miniport SCSI. SRB_FUNCTION_REMOVE_DEVICE est défini pour une utilisation dans les versions ultérieures du système. Il n’est jamais défini non plus dans les SLB envoyés aux pilotes miniport SCSI. SRB_FUNCTION_WMI_REQUEST est valide uniquement dans SCSI_WMI_REQUEST_BLOCK. Une classe de stockage ou un pilote de filtre l’utilise pour envoyer des requêtes WMI au pilote de port.

Configuration requise

Condition requise Valeur
En-tête srb.h (inclure Srb.h, Minitape.h, Storport.h)

Voir aussi

ExFreePool

ExInterlockedFreeToZone

HW_INITIALIZATION_DATA (SCSI)

PORT_CONFIGURATION_INFORMATION (SCSI)

SCSI_WMI_REQUEST_BLOCK

SRB_IO_CONTROL

ScsiPortGetPhysicalAddress

ScsiPortGetSrb

ScsiPortIoMapTransfer

ScsiPortNotification