IOCTL_SCSI_PASS_THROUGH_EX IOCTL (ntddscsi.h)
La demande de code de contrôle IOCTL_SCSI_PASS_THROUGH_EX est la version étendue de la demande IOCTL_SCSI_PASS_THROUGH . Cette demande prend en charge les transferts de données bidirectionnels et autorise un bloc de données de commande (CDB) > de 16 octets.
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.
- 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_EX à 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.
IOCTL_SCSI_PASS_THROUGH_EX 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_EX. Lors de la gestion d’une demande de IOCTL_SCSI_PASS_THROUGH_DIRECT_EX , 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.
Code principal
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 DataInBufferOffset dans la structure SCSI_PASS_THROUGH_EX. Toutefois, l’appelant doit allouer du stockage supplémentaire, immédiatement après SCSI_PASS_THROUGH_EX, 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éesde (SCSI_PASS_THROUGH_EX)). La taille de la structure SCSI_PASS_THROUGH_EX varie en fonction de la valeur spécifiée dans DataInTransferLength .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>. Les valeurs SenseInfoLength et DataOutTransferLength dans la structure SCSI_PASS_THROUGH_EX sont mises à jour pour indiquer la quantité de données transférées.
Longueur de la mémoire tampon de sortie
Les valeurs SenseInfoLength et DataOutTransferLength dans la structure SCSI_PASS_THROUGH_EX 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_EX est incorrectement définie.
Remarques
Pour émettre une demande de IOCTL_SCSI_PASS_THROUGH_EX , le périphérique de stockage sous-jacent doit prendre en charge les SSR étendus. Cela signifie que le type SRB pris en charge est SRB_TYPE_STORAGE_REQUEST_BLOCK. Une application peut interroger la prise en charge de SRB avec la requête IOCTL_STORAGE_QUERY_PROPERTY avec un type de requête PropertyStandardQuery et un type de propriété StorageDeviceProperty. Le membre SrbType retourné dans la structure STORAGE_ADAPTER_DESCRIPTIOR indique SRB_TYPE_SCSI_REQUEST_BLOCK ou SRB_TYPE_STORAGE_REQUEST_BLOCK.
Configuration requise
Condition requise | Valeur |
---|---|
En-tête | ntddscsi.h (inclure Ntddscsi.h) |