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 multitarget, telles que COPY, ne sont pas autorisées.
- Les opérations de transfert de données bidirectionnelles ne sont pas prises en charge.
- Si un pilote de classe pour le type cible d’appareil existe, 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 d’appareil connecté à cette lu. Le pilote de port système ne vérifie pas si un périphérique a été revendiqué par un pilote de classe avant de traiter 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 pour le 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 d’appareil adaptateur et si elle provient du mode utilisateur et cible une unité logique revendiquée par un pilote de classe, Storport échoue avec STATUS_INVALID_DEVICE_REQUEST. Si la demande est envoyée à un objet de périphérique LU, provient du mode noyau ou cible une unité logique non demandée, elle est transmise au pilote miniport.
- Cette requête ne peut pas être utilisée si la base de données CDB peut nécessiter que le pilote miniport sous-jacent accède 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 requête directe de manière asynchrone. Toutes les demandes directes doivent être synchrones.
- Les applications ne nécessitent pas de privilèges d’administration pour envoyer une demande directe à un appareil, mais elles doivent avoir un accès en lecture/écriture à l’appareil.
IOCTL_SCSI_PASS_THROUGH est une demande de contrôle d’appareil mis 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 requête IOCTL_SCSI_PASS_THROUGH_DIRECT, le système verrouille la mémoire tampon en mémoire utilisateur et l’appareil accède directement à cette mémoire.
Cette demande 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 base de données CDB SCSI qui doit être initialisée par l’appelant, à l’exception du chemin, de l’ID cible et du numéro d’unité logique (LUN), qui sont renseignés par le pilote de port. Pour une commande de sortie de données, les données à transférer sont incluses dans la mémoire tampon à Irp->AssociatedIrp.SystemBuffer à 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 des demandes.
Longueur de la mémoire tampon d’entrée
Parameters.DeviceIoControl.InputBufferLength indique la taille, en octets, de la mémoire tampon à Irp->AssociatedIrp.SystemBuffer, qui doit être au moins (sens de la taille des données + taille de(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 des requêtes et toutes les données transférées de l’appareil vers la mémoire tampon à Irp->AssociatedIrp.SystemBuffer.
Longueur de la mémoire tampon de sortie
Les SenseInfoLength et DataTransferLength dans la structure SCSI_PASS_THROUGH sont mises à jour pour indiquer la quantité de données transférées.
Bloc d’état
Le champ Information est défini sur le nombre d’octets retournés dans la mémoire tampon de sortie à Irp->AssociatedIrp.SystemBuffer. Le champ Status est défini sur STATUS_SUCCESS, ou éventuellement sur STATUS_BUFFER_TOO_SMALL ou STATUS_INVALID_PARAMETER si la valeur Length d’entrée dans SCSI_PASS_THROUGH est incorrectement définie.
Exigences
Exigence | Valeur |
---|---|
d’en-tête | ntddscsi.h (include Ntddscsi.h) |