IOCTL_ATA_PASS_THROUGH IOCTL (ntddscsi.h)

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 (LU) solo si no hay ningún controlador de clase para el tipo de dispositivo conectado a esa LU. El controlador de puerto del sistema no comprueba si un dispositivo ha sido reclamado por un controlador de clase antes de procesar una solicitud de paso a través. Por lo tanto, si una aplicación omite un controlador de clase que ha reclamado un dispositivo y envía una solicitud de paso a través para ese dispositivo directamente al controlador de puerto, puede producirse un conflicto para el control del dispositivo entre el controlador de clase y la aplicación.
  • Esta solicitud no se puede usar si el comando requiere que el controlador subyacente acceda directamente a la memoria. Si el comando del autor de la llamada puede requerir acceso directo a la memoria, use IOCTL_ATA_PASS_THROUGH_DIRECT en su lugar.
  • Las aplicaciones no deben intentar enviar una solicitud de paso a través de forma asincrónica. Todas las solicitudes de paso a través deben ser sincrónicas.
  • Las aplicaciones no requieren privilegios administrativos para enviar una solicitud de paso a través a un dispositivo, pero deben tener acceso de lectura y escritura al dispositivo.
La aplicación que realiza la llamada proporciona el contenido del registro del archivo de tareas de ATA para el comando previsto en la estructura ATA_PASS_THROUGH_EX . El sistema almacena en búfer todas las transferencias de datos. Esta solicitud se usa normalmente para transferir pequeñas cantidades de datos (menos de 16 KB).

Código principal

IRP_MJ_DEVICE_CONTROL

Búfer de entrada

El búfer de Irp-AssociatedIrp.SystemBuffer> debe contener una estructura de ATA_PASS_THROUGH_EX, que incluye un conjunto de registros de entrada de archivo de tareas que indican el tipo de comando que se va a realizar y sus parámetros. 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 DataBufferOffset de la estructura 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. Si el comando ATA incrustado es una operación de escritura, el tamaño del búfer de entrada debe ser la suma de sizeof(ATA_PASS_THROUGH_EX) y el valor del miembro DataTransferLength de ATA_PASS_THROUGH_EX. En el ejemplo de pseudocódigo siguiente se muestra cómo calcular el tamaño del búfer:
ULONG buffsize; // size of the buffer
ATA_PASS_THROUGH_EX hdr;
hdr.DataTransferLength = size in bytes of the data transfer
buffsize = sizeof (ATA_PASS_THROUGH_EX) + hdr.DataTransferLength

Si el comando ATA incrustado es una operación de lectura o una operación de control de dispositivo que no implica la transferencia de datos, InputBufferLength debe ser igual a sizeof (ATA_PASS_THROUGH_EX).

En cualquier caso, si InputBufferLength es menor que sizeof (ATA_PASS_THROUGH_EX), 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_EX y almacena los datos en el búfer en Irp-AssociatedIrp.SystemBuffer>.

El controlador de puerto rellena el miembro CurrentTaskFile con los valores presentes en los registros de salida del dispositivo al finalizar el comando ATA incrustado. Si el comando era una transferencia de datos, el controlador de puerto almacena los datos transferidos en un búfer alineado en caché que se encuentra en un desplazamiento de bytes DataBufferOffset desde el principio de la estructura. 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 ATA_PASS_THROUGH_EX para indicar la cantidad de datos transferidos realmente desde el dispositivo. Si el comando ATA incrustado es una operación de escritura o una operación de control de dispositivo que no transfiere datos, OutputBufferLength es igual a sizeof(ATA_PASS_THROUGH_EX). Si el comando ATA incrustado es una operación de lectura, OutputBufferLength es igual a sizeof(ATA_PASS_THROUGH_EX) + DataTransferLength.

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 estado de entrada de ATA_PASS_THROUGH_EX está establecido incorrectamente.

Requisitos

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

Consulte también

ATA_PASS_THROUGH_EX

IOCTL_ATA_PASS_THROUGH_DIRECT