IOCTL_SCSI_PASS_THROUGH_EX IOCTL (ntddscsi.h)
La solicitud de código de control IOCTL_SCSI_PASS_THROUGH_EX es la versión extendida de la solicitud de IOCTL_SCSI_PASS_THROUGH . Esta solicitud proporciona compatibilidad con transferencias de datos bidireccionales y permite un bloque de datos de comandos (CDB) > de 16 bytes.
Permite que una aplicación envíe casi cualquier comando SCSI a un dispositivo de destino, con las restricciones siguientes:
- No se permiten comandos multitarget, como COPY.
- 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 en 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 miniporte.
- Esta solicitud no se puede usar si el CDB podría requerir que el controlador de miniport subyacente acceda directamente a la memoria. Si el CDB del autor de la llamada podría requerir acceso directo a la memoria, use IOCTL_SCSI_PASS_THROUGH_DIRECT_EX 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.
IOCTL_SCSI_PASS_THROUGH_EX es una solicitud de control de dispositivo almacenado en búfer. Para omitir el almacenamiento en búfer en la memoria del sistema, los autores de llamadas deben usar IOCTL_SCSI_PASS_THROUGH_DIRECT_EX. Al controlar una solicitud de IOCTL_SCSI_PASS_THROUGH_DIRECT_EX , 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.
Código principal
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 data-out, los datos que se van a transferir se incluyen en el búfer en Irp-AssociatedIrp.SystemBuffer> en DataInBufferOffset en la estructura de SCSI_PASS_THROUGH_EX. Sin embargo, el autor de la llamada debe asignar almacenamiento adicional, inmediatamente después de SCSI_PASS_THROUGH_EX, 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 datos desentidoof(SCSI_PASS_THROUGH_EX)). El tamaño de la estructura de SCSI_PASS_THROUGH_EX varía en función del valor especificado en DataInTransferLength .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>. SenseInfoLength y DataOutTransferLength en la estructura de SCSI_PASS_THROUGH_EX se actualizan para indicar la cantidad de datos transferidos.
Longitud del búfer de salida
SenseInfoLength y DataOutTransferLength en la estructura de SCSI_PASS_THROUGH_EX 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 longitud de entrada de SCSI_PASS_THROUGH_EX se establece incorrectamente.
Comentarios
Para emitir una solicitud de IOCTL_SCSI_PASS_THROUGH_EX , el dispositivo de almacenamiento subyacente debe admitir srBs extendidos. Esto significa que el tipo de SRB admitido es SRB_TYPE_STORAGE_REQUEST_BLOCK. Una aplicación puede consultar la compatibilidad con SRB con la solicitud de IOCTL_STORAGE_QUERY_PROPERTY con un tipo de consulta PropertyStandardQuery y un tipo de propiedad de StorageDeviceProperty. El miembro SrbType devuelto en la estructura STORAGE_ADAPTER_DESCRIPTIOR indicará SRB_TYPE_SCSI_REQUEST_BLOCK o SRB_TYPE_STORAGE_REQUEST_BLOCK.
Requisitos
Requisito | Valor |
---|---|
Header | ntddscsi.h (incluya Ntddscsi.h) |