Compartir a través de


IOCTL_ATA_PASS_THROUGH_DIRECT IOCTL (ntddscsi.h)

IOCTL_ATA_PASS_THROUGH_DIRECT permite que una aplicación envíe casi cualquier comando de ATA a un dispositivo de destino, con las siguientes restricciones:

  • Si existe un controlador de clase para el tipo de dispositivo de destino, la aplicación debe enviar la solicitud al controlador de clase. Por lo tanto, una aplicación puede enviar esta solicitud directamente al controlador de puerto del sistema para una unidad lógica de destino solo si no hay ningún controlador de clase para el dispositivo.

  • La aplicación debe usar esta solicitud en lugar de IOCTL_ATA_PASS_THROUGH si el comando ATA incrustado podría requerir que el controlador de miniport subyacente acceda directamente a la memoria.

Si el comando de ATA solicita una operación de transferencia de datos, el autor de la llamada debe configurar un búfer alineado con caché desde el que, o en el que, el controlador puede transferir datos directamente. El autor de la llamada debe asegurarse de lo siguiente:

  • La longitud de la transferencia de datos satisface el requisito de alineación de E/S del dispositivo; de lo contrario, se produce un error en este IOCTL con STATUS_INVALID_PARAMETER.
  • La longitud de la transferencia de datos no debe ser mayor que la longitud máxima de transferencia de E/S del dispositivo; de lo contrario, se espera que el dispositivo produzca un error en la solicitud.

La solicitud de IOCTL_ATA_PASS_THROUGH_DIRECT se usa normalmente para transferir grandes cantidades de datos (más de 16 KB).

Código principal

IRP_MJ_DEVICE_CONTROL

Búfer de entrada

El búfer de Irp-AssociatedIrp.SystemBuffer> contiene una estructura de ATA_PASS_THROUGH_DIRECT que incluye un conjunto de registros de entrada de archivo de tareas que indican el tipo de comando que se va a realizar. El autor de la llamada debe inicializar todos los miembros de esta estructura, excepto PathId, TargetId y Lun, que el controlador de puerto rellena. Para un comando de salida de datos, el miembro DataBuffer de ATA_PASS_THROUGH_DIRECT debe apuntar a un búfer alineado con la memoria caché que contiene los datos que se van a escribir.

Longitud del búfer de entrada

Parameters.DeviceIoControl.InputBufferLength indica el tamaño en bytes del búfer en Irp-AssociatedIrp.SystemBuffer>. El valor de InputBufferLength es fijo y no depende de la cantidad de datos transferidos. Es igual a sizeof(ATA_PASS_THROUGH_DIRECT). Si el tamaño del búfer es menor que sizeof(ATA_PASS_THROUGH_DIRECT), el controlador de puerto produce un error en la solicitud de E/S y devuelve un error.

Búfer de salida

El controlador de puerto da formato a los datos devueltos mediante una estructura de ATA_PASS_THROUGH_DIRECT que almacena en el búfer en Irp-AssociatedIrp.SystemBuffer>.

El controlador de puerto almacena los datos transferidos en el búfer alineado en caché al que apunta el miembro DataBuffer de ATA_PASS_THROUGH_DIRECT.

El controlador de puerto rellena el miembro CurrentTaskFile de ATA_PASS_THROUGH_DIRECT con los valores presentes en los registros de salida del dispositivo al finalizar el comando de ATA. La aplicación es responsable de interpretar el contenido de los registros de salida para determinar qué errores, si los hubiera, devolvió el dispositivo.

Longitud del búfer de salida

El controlador de puerto actualiza el miembro DataTransferLength de la estructura ATA_PASS_THROUGH_DIRECT para indicar la cantidad de datos transferidos desde el dispositivo.

Búfer de entrada y salida

Ninguno.

Longitud del búfer de entrada y salida

No es aplicable.

Bloque de estado

El miembro Information se establece en el número de bytes devueltos en el búfer de salida en Irp-AssociatedIrp.SystemBuffer>. El miembro Status se establece en STATUS_SUCCESS o, posiblemente, en STATUS_BUFFER_TOO_SMALL o STATUS_INVALID_PARAMETER si el valor de longitud de entrada de ATA_PASS_THROUGH_DIRECT está establecido incorrectamente.

Requisitos

Requisito Value
Cliente mínimo compatible Windows Server 2003
Encabezado ntddscsi.h (incluya Ntddscsi.h)

Consulte también

ATA_PASS_THROUGH_DIRECT

IOCTL_ATA_PASS_THROUGH