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
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) |