Partager via


IOCTL_ATA_PASS_THROUGH_DIRECT IOCTL (ntddscsi.h)

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

  • S’il existe un pilote de classe pour le type cible d’appareil, l’application doit envoyer la demande au pilote de classe. Ainsi, une application peut envoyer cette requête directement au pilote de port système pour une unité logique cible uniquement s’il n’existe aucun pilote de classe pour l’appareil.

  • L’application doit utiliser cette requête plutôt que IOCTL_ATA_PASS_THROUGH si la commande ATA incorporée peut nécessiter que le pilote miniport sous-jacent accède directement à la mémoire.

Si la commande ATA demande une opération de transfert de données, l’appelant doit configurer une mémoire tampon alignée sur le cache à partir de laquelle, ou vers laquelle, le pilote peut transférer des données directement. L’appelant doit vérifier ce qui suit :

  • La longueur du transfert de données répond aux exigences d’alignement des E/S de l’appareil ; sinon, ce IOCTL échoue avec STATUS_INVALID_PARAMETER.
  • La longueur du transfert de données ne doit pas être supérieure à la longueur maximale de transfert d’E/S de l’appareil ; dans le cas contraire, il est attendu que l’appareil échoue à la demande.

La requête IOCTL_ATA_PASS_THROUGH_DIRECT est généralement utilisée pour transférer de grandes quantités de données (plus de 16 Ko).

Code principal

IRP_MJ_DEVICE_CONTROL

Mémoire tampon d'entrée

La mémoire tampon dans Irp-AssociatedIrp.SystemBuffer> contient une structure ATA_PASS_THROUGH_DIRECT qui comprend un ensemble de registres d’entrée de fichiers de tâches qui indiquent le type de commande à effectuer. L’appelant doit initialiser tous les membres de cette structure, à l’exception de PathId, TargetId et Lun, que le pilote de port remplit. Pour une commande data-out, le membre DataBuffer de ATA_PASS_THROUGH_DIRECT doit pointer vers une mémoire tampon alignée sur le cache contenant les données à écrire.

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>. La valeur de InputBufferLength est fixe et ne dépend pas de la quantité de données transférées. Il est égal à sizeof(ATA_PASS_THROUGH_DIRECT). Si la taille de la mémoire tampon est inférieure à sizeof(ATA_PASS_THROUGH_DIRECT), le pilote de port échoue à la demande d’E/S et retourne une erreur.

Mémoire tampon de sortie

Le pilote de port met en forme les données de retour à l’aide d’une structure de ATA_PASS_THROUGH_DIRECT qu’il stocke dans la mémoire tampon sur Irp-AssociatedIrp.SystemBuffer>.

Le pilote de port stocke les données transférées dans la mémoire tampon alignée sur le cache pointée par le membre DataBuffer de ATA_PASS_THROUGH_DIRECT.

Le pilote de port remplit le membre CurrentTaskFile de ATA_PASS_THROUGH_DIRECT avec les valeurs présentes dans les registres de sortie de l’appareil à la fin de la commande ATA. L’application est responsable de l’interprétation du contenu des registres de sortie pour déterminer quelles erreurs, le cas échéant, ont été retournées par l’appareil.

Longueur de la mémoire tampon de sortie

Le pilote de port met à jour le membre DataTransferLength de la structure ATA_PASS_THROUGH_DIRECT pour indiquer la quantité de données transférées à partir de l’appareil.

Mémoire tampon d’entrée/sortie

Aucun.

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

Non applicable.

Bloc d’état

Le membre Information est défini sur le nombre d’octets retournés dans la mémoire tampon de sortie sur Irp-AssociatedIrp.SystemBuffer>. Le membre Status est défini sur STATUS_SUCCESS ou éventuellement sur STATUS_BUFFER_TOO_SMALL ou STATUS_INVALID_PARAMETER si la valeur d’entrée Length dans ATA_PASS_THROUGH_DIRECT n’est pas définie de manière incorrecte.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows Server 2003
En-tête ntddscsi.h (inclure Ntddscsi.h)

Voir aussi

ATA_PASS_THROUGH_DIRECT

IOCTL_ATA_PASS_THROUGH