Share via


IOCTL_SCSI_PASS_THROUGH IOCTL (ntddscsi.h)

Permet à une application d’envoyer presque n’importe quelle commande SCSI à un appareil cible, avec les restrictions suivantes :

  • Les commandes multi-cibles, telles que COPY, ne sont pas autorisées.
  • Les opérations de transfert de données bidirectionnelles ne sont pas prises en charge.
  • S’il existe un pilote de classe pour le type d’appareil cible, la demande doit être envoyée à ce pilote de classe. Par conséquent, une application peut envoyer cette requête directement au pilote de port système pour une unité logique cible (LU) uniquement s’il n’existe aucun pilote de classe pour le type de périphérique connecté à cette lu. Le pilote de port système ne case activée pas pour déterminer si un périphérique a été revendiqué par un pilote de classe avant qu’il ne traite une demande directe. Par conséquent, si une application contourne un pilote de classe qui a revendiqué un appareil et envoie une demande directe pour ce périphérique directement au pilote de port, un conflit de contrôle de l’appareil peut se produire entre le pilote de classe et l’application. Si une demande directe est envoyée à un objet de périphérique adaptateur et si elle provient du mode utilisateur et cible une unité logique revendiquée par un pilote de classe, Storport échoue à la demande avec STATUS_INVALID_DEVICE_REQUEST. Si la requête est envoyée à un objet d’appareil lu, provient du mode noyau ou cible une unité logique non réclamée, elle est passée au pilote miniport.
  • Cette requête ne peut pas être utilisée si la base de données CDB peut nécessiter le pilote miniport sous-jacent pour accéder directement à la mémoire. Si la base de données CDB de l’appelant peut nécessiter un accès direct à la mémoire, utilisez IOCTL_SCSI_PASS_THROUGH_DIRECT à la place.
  • Les applications ne doivent pas tenter d’envoyer une demande directe de manière asynchrone. Toutes les demandes directes doivent être synchrones.
  • Les applications ne nécessitent pas de privilèges administratifs pour envoyer une demande directe à un appareil, mais elles doivent disposer d’un accès en lecture/écriture à l’appareil.
L’application appelante crée le bloc de descripteur de commande SCSI, qui peut inclure une demande de données d’sens de requête si une condition CHECK se produit.

IOCTL_SCSI_PASS_THROUGH est une demande de contrôle d’appareil mise en mémoire tampon. Pour contourner la mise en mémoire tampon dans la mémoire système, les appelants doivent utiliser IOCTL_SCSI_PASS_THROUGH_DIRECT. Lors de la gestion d’une demande de IOCTL_SCSI_PASS_THROUGH_DIRECT , le système verrouille la mémoire tampon dans la mémoire utilisateur et l’appareil accède directement à cette mémoire.

Cette requête est généralement utilisée pour transférer de petites quantités de données (<16 Ko).

Les applications peuvent envoyer cette demande au moyen d’une demande de IRP_MJ_DEVICE_CONTROL .

Les pilotes de classe de stockage définissent le numéro IRP secondaire sur IRP_MN_SCSI_CLASS pour indiquer que la demande a été traitée par un pilote de classe de stockage.

Note 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 .
 

Code principal

IRP_MJ_DEVICE_CONTROL

Mémoire tampon d'entrée

Cette structure inclut une CDB SCSI, qui doit être initialisée par l’appelant, à l’exception du chemin d’accès, de l’ID cible et du numéro d’unité logique (LUN), qui sont renseignés par le pilote de port. Pour une commande data-out, les données à transférer sont incluses dans la mémoire tampon sur Irp-AssociatedIrp.SystemBuffer> sur DataBufferOffset dans la structure SCSI_PASS_THROUGH. Toutefois, l’appelant doit allouer un stockage supplémentaire, immédiatement après SCSI_PASS_THROUGH, si l’appelant demande des données de sens de requête.

Longueur de la mémoire tampon d’entrée

Parameters.DeviceIoControl.InputBufferLength indique la taille, en octets, de la mémoire tampon sur Irp->AssociatedIrp.SystemBuffer, qui doit être au moins (sens taille + des données(SCSI_PASS_THROUGH)). La taille de la structure SCSI_PASS_THROUGH varie en fonction de sa spécification DataTransferLength .

Mémoire tampon de sortie

Le pilote de port retourne toutes les données de sens de requête et toutes les données transférées de l’appareil vers la mémoire tampon sur Irp-AssociatedIrp.SystemBuffer>.

Longueur de la mémoire tampon de sortie

Les valeurs SenseInfoLength et DataTransferLength de la structure SCSI_PASS_THROUGH sont mises à jour pour indiquer la quantité de données transférées.

Bloc d’état

Le champ Informations est défini sur le nombre d’octets retournés dans la mémoire tampon de sortie sur Irp-AssociatedIrp.SystemBuffer>. Le champ État est défini sur STATUS_SUCCESS, ou éventuellement sur STATUS_BUFFER_TOO_SMALL ou STATUS_INVALID_PARAMETER si la valeur longueur d’entrée dans SCSI_PASS_THROUGH est incorrectement définie.

Configuration requise

Condition requise Valeur
En-tête ntddscsi.h (inclure Ntddscsi.h)

Voir aussi

SCSI_PASS_THROUGH