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 :
Si un pilote de classe pour le type cible d’appareil existe, l’application doit envoyer la demande au 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 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 dans laquelle, le pilote peut transférer des données directement. L’appelant doit s’assurer que les éléments suivants sont les suivants :
- La longueur du transfert de données satisfait à l’exigence d’alignement des E/S de l’appareil ; sinon, cette IOCTL échoue avec STATUS_INVALID_PARAMETER.
- La longueur du transfert de données ne doit pas être supérieure à la longueur maximale des E/S de l’appareil ; sinon, il est prévu que l’appareil échouera 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
Mémoire tampon d’entrée
La mémoire tampon à Irp->AssociatedIrp.SystemBuffer contient une structure ATA_PASS_THROUGH_DIRECT qui inclut un ensemble de registres d’entrée de fichier de tâche qui indiquent le type de commande à effectuer. L’appelant doit initialiser tous les membres de cette structure, à l’exception de PathId, TargetIdet Lun, dans lequel le pilote de port se renseigne. Pour une commande data-out, le DataBuffer membre 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 à 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 requête 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 ATA_PASS_THROUGH_DIRECT qu’il stocke dans la mémoire tampon à Irp->AssociatedIrp.SystemBuffer.
Le pilote de port stocke les données transférées dans la mémoire tampon alignée sur le cache vers laquelle pointe le DataBuffer membre de ATA_PASS_THROUGH_DIRECT.
Le pilote de port remplit le CurrentTaskFile membre de ATA_PASS_THROUGH_DIRECT avec les valeurs présentes dans les registres de sortie de l’appareil à l’achèvement de la commande ATA. L’application est chargée d’interpréter le 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
Sans objet.
Bloc d’état
Le membre d’informations est défini sur le nombre d’octets retournés dans la mémoire tampon de sortie à >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 length d’entrée dans ATA_PASS_THROUGH_DIRECT est incorrectement définie.
Exigences
Exigence | Valeur |
---|---|
client minimum pris en charge | Windows Server 2003 |
d’en-tête | ntddscsi.h (include Ntddscsi.h) |