IOCTL_SCSI_PASS_THROUGH IOCTL (ntddscsi.h)

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

  • No se permiten comandos multitarget, como COPY.
  • No se admiten operaciones de transferencia de datos bidireccionales.
  • Si existe un controlador de clase para el tipo de dispositivo de destino, la solicitud debe enviarse a ese 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 que está 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. Si se envía una solicitud de paso a través a un objeto de dispositivo de adaptador y si se origina desde el modo de usuario y tiene como destino una LU reclamada por un controlador de clase, Storport produce un error en la solicitud con STATUS_INVALID_DEVICE_REQUEST. Si la solicitud se envía a un objeto de dispositivo LU, se origina en modo kernel o tiene como destino una LU no reclamada, se pasa al controlador de minipuerto.
  • Esta solicitud no se puede usar si el CDB podría requerir que el controlador de minipuerto subyacente acceda directamente a la memoria. Si el CDB del autor de la llamada puede requerir acceso directo a la memoria, use IOCTL_SCSI_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 crea el bloque descriptor de comandos SCSI, que puede incluir una solicitud de datos de detección de solicitudes si se produce una condición CHECK.

IOCTL_SCSI_PASS_THROUGH es una solicitud de control de dispositivo almacenado en búfer. Para omitir el almacenamiento en búfer en la memoria del sistema, los llamadores deben usar IOCTL_SCSI_PASS_THROUGH_DIRECT. Al controlar una solicitud de IOCTL_SCSI_PASS_THROUGH_DIRECT , el sistema bloquea el búfer en la memoria del usuario y el dispositivo accede directamente a esta memoria.

Esta solicitud se usa normalmente para transferir pequeñas cantidades de datos (<16 000).

Las aplicaciones pueden enviar esta solicitud mediante una solicitud de IRP_MJ_DEVICE_CONTROL .

Los controladores de clase de almacenamiento establecen el número IRP secundario en IRP_MN_SCSI_CLASS para indicar que una controlador de clase de almacenamiento ha procesado la solicitud.

Nota Los modelos de controlador de puerto SCSI y controlador de minipuerto SCSI pueden modificarse o no estar disponibles en el futuro. En su lugar, se recomienda usar los modelos del controlador Storport y del controlador storport miniport .
 

Código principal

IRP_MJ_DEVICE_CONTROL

Búfer de entrada

Esta estructura incluye un CDB SCSI, que el autor de la llamada debe inicializar, excepto la ruta de acceso, el identificador de destino y el número de unidad lógica (LUN), que el controlador de puerto rellena. Para un comando de salida de datos, los datos que se van a transferir se incluyen en el búfer en Irp-AssociatedIrp.SystemBuffer> en DataBufferOffset en la estructura SCSI_PASS_THROUGH. Sin embargo, el autor de la llamada debe asignar almacenamiento adicional, inmediatamente después de SCSI_PASS_THROUGH, si el autor de la llamada solicita datos de detección de solicitudes.

Longitud del búfer de entrada

Parameters.DeviceIoControl.InputBufferLength indica el tamaño, en bytes, del búfer en Irp->AssociatedIrp.SystemBuffer, que debe ser al menos (tamaño + de los datosdedetecciónof(SCSI_PASS_THROUGH)). El tamaño de la estructura de SCSI_PASS_THROUGH varía, en función de su especificación DataTransferLength .

Búfer de salida

El controlador de puerto devuelve los datos de detección de solicitudes y los datos transferidos desde el dispositivo al búfer en Irp-AssociatedIrp.SystemBuffer>.

Longitud del búfer de salida

Los objetos SenseInfoLength y DataTransferLength de la estructura SCSI_PASS_THROUGH se actualizan para indicar la cantidad de datos transferidos.

Bloque de estado

El campo Información se establece en el número de bytes devueltos en el búfer de salida en Irp-AssociatedIrp.SystemBuffer>. El campo Estado se establece en STATUS_SUCCESS, o posiblemente en STATUS_BUFFER_TOO_SMALL o STATUS_INVALID_PARAMETER si el valor de longitud de entrada de SCSI_PASS_THROUGH está establecido incorrectamente.

Requisitos

   
Header ntddscsi.h (incluya Ntddscsi.h)

Consulte también

SCSI_PASS_THROUGH