estructura SCSI_REQUEST_BLOCK (srb.h)
La estructura SCSI_REQUEST_BLOCK está asociada a una función SRB.
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 .
Sintaxis
typedef struct _SCSI_REQUEST_BLOCK {
USHORT Length;
UCHAR Function;
UCHAR SrbStatus;
UCHAR ScsiStatus;
UCHAR PathId;
UCHAR TargetId;
UCHAR Lun;
UCHAR QueueTag;
UCHAR QueueAction;
UCHAR CdbLength;
UCHAR SenseInfoBufferLength;
ULONG SrbFlags;
ULONG DataTransferLength;
ULONG TimeOutValue;
PVOID DataBuffer;
PVOID SenseInfoBuffer;
struct _SCSI_REQUEST_BLOCK *NextSrb;
PVOID OriginalRequest;
PVOID SrbExtension;
union {
ULONG InternalStatus;
ULONG QueueSortKey;
ULONG LinkTimeoutValue;
};
ULONG Reserved;
UCHAR Cdb[16];
} SCSI_REQUEST_BLOCK, *PSCSI_REQUEST_BLOCK;
Miembros
Length
Especifica el tamaño en bytes de esta estructura.
Function
Especifica la operación que se va a realizar, que puede ser uno de los valores siguientes:
Valor | Operación |
---|---|
SRB_FUNCTION_EXECUTE_SCSI (0x00) | Se debe ejecutar una solicitud de E/S de dispositivo SCSI en la unidad lógica de destino. |
SRB_FUNCTION_ABORT_COMMAND (0x10) | Se debe enviar un mensaje de SCSIMESS_ABORT para cancelar la solicitud a la que apunta el miembro NextSrb . Si se trata de una solicitud de cola etiquetada, se debe usar un mensaje de SCSIMESS_ABORT_WITH_TAG en su lugar. Si se ha completado la solicitud indicada, esta solicitud debe completarse normalmente. Solo los miembros SRB Function, PathId, TargetId, Lun y NextSrb son válidos. |
SRB_FUNCTION_RESET_DEVICE (0x13) | El controlador ScsiPort ya no envía este SRB a sus miniportes. Solo los controladores de minipuerto de Storport usan este SRB. El controlador de destino SCSI debe restablecerse mediante el mensaje SCSIMESS_BUS_DEVICE_RESET. El controlador de minipuerto debe completar las solicitudes activas para el controlador de destino. Solo los miembros SRB Function, TargetId y PathId son válidos. |
SRB_FUNCTION_RESET_LOGICAL_UNIT (0x20) | La unidad lógica debe restablecerse, si es posible. El controlador de minipuerto HBA debe completar las solicitudes activas de la unidad lógica. Solo los miembros Function, PathId, TargetId y Lun de la SRB son válidos. Storport admite este tipo de restablecimiento, pero no lo hace el puerto SCSI. |
SRB_FUNCTION_RESET_BUS (0x12) | El bus SCSI debe restablecerse con el mensaje SCSIMESS_BUS_DEVICE_RESET. Un controlador de minipuerto recibe esta solicitud solo si una solicitud determinada ha agotado el tiempo de espera y una solicitud posterior para anular la solicitud de tiempo de espera agotado también ha agotado el tiempo de espera. Solo los miembros SRB Function y PathId son válidos. |
SRB_FUNCTION_TERMINATE_IO (0x14) | Se debe enviar un mensaje de SCSIMESS_TERMINATE_IO_PROCESS para cancelar la solicitud a la que apunta el miembro NextSrb . Si la solicitud indicada ya se ha completado, esta solicitud debe completarse normalmente. Solo los miembros SRB Function, PathId, TargetId, Lun y NextSrb son válidos. |
SRB_FUNCTION_RELEASE_RECOVERY (0x11) | Se debe enviar un mensaje SCSIMESS_RELEASE_RECOVERY al controlador de destino. Solo los miembros SRB Function, PathId, TargetId y Lun son válidos. |
SRB_FUNCTION_RECEIVE_EVENT (0x03) | El HBA debe estar preparado para recibir una notificación de eventos asincrónica del destino direcciondo. El miembro SRB DataBuffer indica dónde se deben colocar los datos. |
SRB_FUNCTION_SHUTDOWN (0x07) | El sistema se está apagando. Esta solicitud se envía a un controlador de minipuerto solo si establece CachesData en TRUE en el PORT_CONFIGURATION_INFORMATION para el HBA. Este miniportador puede recibir varias de estas notificaciones antes de que se detenga realmente toda la actividad del sistema. Sin embargo, la última notificación de apagado se producirá después de la última E/S de inicio. Solo los miembros SRB Function, PathId, TargetId y Lun son válidos. |
SRB_FUNCTION_FLUSH (0x08) | El controlador de minipuerto debe vaciar los datos almacenados en caché para el dispositivo de destino. Esta solicitud se envía al controlador de minipuerto solo si establece CachesData en TRUE en el PORT_CONFIGURATION_INFORMATION para el HBA. Solo los miembros SRB Function, PathId, TargetId y Lun son válidos. |
SRB_FUNCTION_IO_CONTROL (0x02) | La solicitud es una solicitud de control de E/S, que se origina en una aplicación en modo de usuario con un HBA dedicado. SRB DataBuffer apunta a un encabezado de SRB_IO_CONTROL seguido del área de datos. El controlador puede usar el valor de DataBuffer , independientemente del valor de MapBuffers. Solo los miembros SRB Function, SrbFlags, TimeOutValue, DataBuffer y DataTransferLength son válidos, junto con el miembro SrbExtension si el controlador de miniporte solicitó extensiones SRB cuando se inicializó. Si un controlador de minipuerto controla un HBA dedicado a la aplicación para que admita esta solicitud, el controlador de miniporte debe ejecutar la solicitud y notificar al controlador de puerto específico del sistema operativo cuando se haya completado el SRB, mediante el mecanismo normal de llamadas a ScsiPortNotification con RequestComplete y NextRequest. |
SRB_FUNCTION_LOCK_QUEUE (0x18) | Contiene las solicitudes en cola por el controlador de puerto para una unidad lógica determinada, normalmente mientras se procesa una solicitud de energía. Solo los miembros SRB Length, Function, SrbFlags y OriginalRequest son válidos. Cuando la cola está bloqueada, solo se procesarán las solicitudes con SrbFlags ORed con SRB_FLAGS_BYPASS_LOCKED_QUEUE. Los controladores de minipuerto SCSI no procesan SRB_FUNCTION_LOCK_QUEUE solicitudes. |
SRB_FUNCTION_UNLOCK_QUEUE (0x19) | Libera la cola del controlador de puerto para una unidad lógica que se bloqueó anteriormente con SRB_FUNCTION_LOCK_QUEUE. Los SrbFlags de la solicitud de desbloqueo deben ser ORed con SRB_FLAGS_BYPASS_LOCKED_QUEUE. Solo los miembros SRB Length, Function, SrbFlags y OriginalRequest son válidos. Los controladores de minipuerto SCSI no procesan SRB_FUNCTION_UNLOCK_QUEUE solicitudes. |
SRB_FUNCTION_UNLOCK_QUEUE (0x19) | Libera la cola del controlador de puerto para una unidad lógica que se bloqueó anteriormente con SRB_FUNCTION_LOCK_QUEUE. Los SrbFlags de la solicitud de desbloqueo deben ser ORed con SRB_FLAGS_BYPASS_LOCKED_QUEUE. Solo los miembros SRB Length, Function, SrbFlags y OriginalRequest son válidos. Los controladores de minipuerto SCSI no procesan SRB_FUNCTION_UNLOCK_QUEUE solicitudes. |
SRB_FUNCTION_DUMP_POINTERS (0x26) | Una solicitud con esta función se envía a un controlador de miniport de Storport que se usa para controlar el disco que contiene los datos del volcado de memoria. La solicitud recopila información necesaria del controlador de minipuerto para admitir el volcado de memoria y la hibernación. Consulte la estructura MINIPORT_DUMP_POINTERS . Un controlador de minipuerto físico debe establecer la marca STOR_FEATURE_DUMP_POINTERS en el miembro FeatureSupport de su HW_INITIALIZATION_DATA para recibir una solicitud con esta función. |
SRB_FUNCTION_FREE_DUMP_POINTERS (0x27) | Se envía una solicitud con esta función a un controlador de miniport storport para liberar los recursos asignados durante una solicitud anterior para SRB_FUNCTION_DUMP_POINTERS. |
SrbStatus
Devuelve el estado de la solicitud completada. El controlador de minipuerto debe establecer este miembro antes de que notifique al controlador específico del sistema operativo que la solicitud se ha completado llamando a ScsiPortNotification con RequestComplete. El valor de este miembro puede ser uno de los siguientes:
Valor | Significado |
---|---|
SRB_STATUS_PENDING | Indica que la solicitud está en curso. El controlador de puerto específico del sistema operativo inicializa SrbStatus en este valor. |
SRB_STATUS_SUCCESS | Indica que la solicitud se completó correctamente. |
SRB_STATUS_ABORTED | Indica que la solicitud se anuló según lo indicado por el controlador de puerto. Un controlador de minipuerto establece este estado en NextSrb para una solicitud de SRB_FUNCTION_ABORT_COMMAND correcta. |
SRB_STATUS_ABORT_FAILED | Indica un intento de anular la solicitud con errores. Devuelve este estado para una solicitud de SRB_FUNCTION_ABORT_COMMAND cuando no se puede encontrar la solicitud especificada. |
SRB_STATUS_ERROR | Indica que la solicitud se completó con un error en el estado del bus SCSI. |
SRB_STATUS_BUSY | Indica que el controlador de minipuerto o el dispositivo de destino no pudieron aceptar la solicitud en este momento. El controlador de puerto específico del sistema operativo volverá a enviar la solicitud más adelante. |
SRB_STATUS_INTERNAL_ERROR | Indica que el controlador de puerto SCSI no pudo entregar la solicitud al controlador de miniporte o al dispositivo de destino. En tales casos, el estado se registra en InternalStatus. |
SRB_STATUS_INVALID_REQUEST | Indica que el controlador de minipuerto no admite la solicitud especificada. |
SRB_STATUS_NO_DEVICE | Indica que el dispositivo no respondió. |
SRB_STATUS_TIMEOUT | Indica que se agota el tiempo de espera de la solicitud. |
SRB_STATUS_SELECTION_TIMEOUT | Indica que se agota el tiempo de espera de la selección del dispositivo SCSI. |
SRB_STATUS_COMMAND_TIMEOUT | Indica que el destino no completó el comando dentro del límite de tiempo. |
SRB_STATUS_MESSAGE_REJECTED | Indica que el destino rechazó un mensaje. Normalmente, esto solo se devuelve para estas solicitudes de tipo de mensaje como SRB_FUNCTION_TERMINATE_IO. |
SRB_STATUS_BUS_RESET | Indica que se ha producido un restablecimiento de bus mientras se ejecuta esta solicitud. |
SRB_STATUS_PARITY_ERROR | Indica un error de paridad en el bus SCSI y que se produjo un error de reintento. |
SRB_STATUS_REQUEST_SENSE_FAILED | Indica que se produjo un error en el comando request-sense. Esto solo se devuelve si el HBA realiza el sentido de la solicitud automática y el controlador de miniporte establece AutoRequestSense en TRUE en el PORT_CONFIGURATION_INFORMATION para este HBA. |
SRB_STATUS_NO_HBA | Indica que el HBA no responde. |
SRB_STATUS_DATA_OVERRUN | Indica que se ha producido un error de saturación de datos o de ejecución insuficiente. El controlador de minipuerto también debe actualizar el miembro DataTransferLength del SRB para indicar la cantidad de datos que se transfirieron realmente si se produce una ejecución inferior. |
SRB_STATUS_UNEXPECTED_BUS_FREE | Indica el destino desconectado inesperadamente. |
SRB_STATUS_PHASE_SEQUENCE_FAILURE | Indica que el HBA detectó un error de secuencia de fase no válido. |
SRB_STATUS_REQUEST_FLUSHED | Indica que se ha detenido la solicitud de estado. |
SRB_STATUS_BAD_FUNCTION | Indica que no se admite el código de la función SRB. |
SRB_STATUS_INVALID_PATH_ID | Indica que el pathId especificado en la SRB no existe. |
SRB_STATUS_INVALID_TARGET_ID | Indica que el valor targetID de la SRB no es válido. |
SRB_STATUS_INVALID_LUN | Indica que el valor de Lun en la SRB no es válido. |
SRB_STATUS_ERROR_RECOVERY | Indica que la solicitud se completó con un error en el estado del bus SCSI y que se recibió el mensaje SCSI INITIATE RECOVERY. |
SRB_STATUS_AUTOSENSE_VALID | Indica que la información devuelta en SenseInfoBuffer es válida. |
SRB_STATUS_QUEUE_FROZEN | Un controlador de minipuerto nunca debe establecer el miembro SrbStatus en este valor. El controlador de puerto de Windows puede establecer este valor para informar a un controlador de clase de almacenamiento de que se ha inmovilizado su cola de solicitudes para un periférico determinado. |
ScsiStatus
Devuelve el estado SCSI devuelto por el HBA o el dispositivo de destino. Si el estado no es SUCCESS, el controlador de minipuerto debe establecer el miembro SrbStatus en SRB_STATUS_ERROR.
PathId
Indica el puerto o bus SCSI de la solicitud. Este valor es de base cero.
TargetId
Indica el controlador de destino o el dispositivo del bus.
Lun
Indica el número de unidad lógica del dispositivo.
QueueTag
Contiene el valor de la etiqueta de cola asignado por el controlador de puerto específico del sistema operativo. Si este miembro se usa para la cola etiquetada, el HBA admite la puesta en cola interna de solicitudes a las LU y el controlador de miniporte establece TaggedQueueing en TRUE en el PORT_CONFIGURATION_INFORMATION para este HBA.
QueueAction
Indica el mensaje etiquetado-cola que se va a usar cuando se establece la marca SRB_FLAGS_QUEUE_ACTION_ENABLE. El valor puede ser uno de los siguientes: SRB_SIMPLE_TAG_REQUEST, SRB_HEAD_OF_QUEUE_TAG_REQUEST o SRB_ORDERED_QUEUE_TAG_REQUEST, según se define según la especificación SCSI.
CdbLength
Indica el tamaño en bytes del bloque de descriptor de comandos SCSI-2 o posterior.
SenseInfoBufferLength
Indica el tamaño en bytes del búfer de detección de solicitudes. Si se produce una ejecución inferior, el controlador de minipuerto debe actualizar este miembro al número de bytes transferidos realmente.
SrbFlags
Indica varios parámetros y opciones sobre la solicitud. SrbFlags es de solo lectura, excepto cuando se establece SRB_FLAGS_UNSPECIFIED_DIRECTION y se requieren controladores de miniporte de adaptadores DMA subordinados para actualizar SRB_FLAGS_DATA_IN o SRB_FLAGS_DATA_OUT. Este miembro puede tener uno o varios de los siguientes marcadores establecidos:
Marca | Significado |
---|---|
SRB_FLAGS_QUEUE_ACTION_ENABLE | Indica que se habilitarán las acciones de cola etiquetada. |
SRB_FLAGS_DISABLE_AUTOSENSE | Indica que no se debe devolver información de sentido de solicitud. |
SRB_FLAGS_DATA_IN | Indica que los datos se transferirán desde el dispositivo al sistema. |
SRB_FLAGS_DATA_OUT | Indica que los datos se transferirán del sistema al dispositivo. |
SRB_FLAGS_UNSPECIFIED_DIRECTION | Definido para la compatibilidad con versiones anteriores con las interfaces SCSI aspi/CAM, esta marca indica que la dirección de transferencia podría ser cualquiera de las anteriores porque se establecen las dos marcas anteriores. Si se establece esta marca, un controlador de minipuerto debe determinar la dirección de transferencia examinando la fase de datos del destino en el bus SCSI. Si su HBA es un dispositivo DMA subordinado, este controlador de minipuerto debe actualizar SRB_FLAGS_DATA_OUT o SRB_FLAGS_DATA_IN al valor correcto antes de llamar a ScsiPortIoMapTransfer. |
SRB_FLAGS_NO_DATA_TRANSFER | Indica ninguna transferencia de datos con esta solicitud. Si se establece, las marcas SRB_FLAGS_DATA_OUT, SRB_FLAGS_DATA_IN y SRB_FLAGS_UNSPECIFIED_DIRECTION están claras. |
SRB_FLAGS_DISABLE_SYNCH_TRANSFER | Indica el HBA, si es posible, que debe realizar E/S asincrónica para esta solicitud de transferencia. Si la E/S sincrónica se negoció anteriormente, el HBA debe renegociar la E/S asincrónica antes de realizar la transferencia. |
SRB_FLAGS_DISABLE_DISCONNECT | Indica que el HBA no debe permitir que el destino se desconecte del bus SCSI durante el procesamiento de esta solicitud. |
SRB_FLAGS_BYPASS_FROZEN_QUEUE | Es irrelevante para los controladores de minipuerto. |
SRB_FLAGS_NO_QUEUE_FREEZE | Es irrelevante para los controladores de minipuerto. |
SRB_FLAGS_IS_ACTIVE | Es irrelevante para los controladores de minipuerto. |
SRB_FLAGS_ALLOCATED_FROM_ZONE | Es irrelevante para los controladores de minipuerto y está obsoleto para los controladores de clase Windows actuales. En un controlador de clase heredado de Windows, esto indica si el SRB se asignó desde un búfer de zona. Si se establece esta marca, el controlador de clase debe llamar a ExInterlockedFreeToZone para liberar el SRB; de lo contrario, debe llamar a ExFreePool. Los controladores de clase nuevos deben usar listas de búsqueda en lugar de búferes de zona. |
SRB_FLAGS_SGLIST_FROM_POOL | Es irrelevante para los conductores de minipuerto. Para un controlador de clase de Windows, esto indica que se asignó memoria para una lista de dispersión y recopilación desde un grupo no paginado. Si se establece esta marca, el controlador de clase debe llamar a ExFreePool para liberar la memoria una vez completada la SRB. |
SRB_FLAGS_BYPASS_LOCKED_QUEUE | Es irrelevante para los conductores de minipuerto. En el controlador de puerto, esta marca indica que la solicitud debe procesarse si la cola de unidades lógicas está bloqueada. Un controlador de nivel superior debe establecer esta marca para enviar una solicitud de SRB_FUNCTION_UNLOCK_QUEUE. |
SRB_FLAGS_NO_KEEP_AWAKE | Es irrelevante para los conductores de minipuerto. Un controlador de clase de Windows usa esta marca para indicar al controlador de puerto que informe de inactividad en lugar de encender el dispositivo para controlar esta solicitud. |
SRB_FLAGS_FREE_SENSE_BUFFER | Indica que el puerto o el controlador de minipuerto ha asignado un búfer para los datos de detección. Esto informa al controlador de clase de que debe liberar el búfer de datos de detección después de extraer los datos. |
DataTransferLength
Indica el tamaño en bytes del búfer de datos. Si se produce una ejecución inferior, el controlador de minipuerto debe actualizar este miembro al número de bytes transferidos realmente.
TimeOutValue
Indica el intervalo en segundos que la solicitud puede ejecutarse antes de que el controlador de puerto específico del sistema operativo considere que agota el tiempo de espera. Los controladores de minipuerto no son necesarios para las solicitudes de tiempo porque el controlador de puerto ya lo hace.
DataBuffer
Apunta al búfer de datos. Los controladores de minipuerto no deben usar este valor como puntero de datos a menos que el controlador de miniporte establezca MapBuffers en TRUE en el PORT_CONFIGURATION_INFORMATION para el HBA. Sin embargo, en el caso de las solicitudes de SRB_FUNCTION_IO_CONTROL, los controladores de minipuerto pueden usar este valor como puntero de datos independientemente del valor de MapBuffers.
SenseInfoBuffer
Apunta al búfer de detección de solicitudes. No se requiere un controlador de minipuerto para proporcionar datos de detección de solicitudes después de una CONDICIÓN CHECK.
NextSrb
Indica el SCSI_REQUEST_BLOCK al que se aplica esta solicitud. Solo un pequeño subconjunto de solicitudes usan un segundo SRB, por ejemplo, SRB_FUNCTION_ABORT_COMMAND.
OriginalRequest
Apunta al IRP para esta solicitud. Este miembro es irrelevante para los controladores de miniport
SrbExtension
Apunta a la extensión Srb. Un controlador de minipuerto no debe usar este miembro si establece SrbExtensionSize en cero en el SCSI_HW_INITIALIZATION_DATA. El controlador de puerto específico del sistema operativo no inicializa la memoria en SrbExtension y el HBA puede acceder a los datos determinados por el controlador de miniporte directamente. La dirección física correspondiente se puede obtener llamando a ScsiPortGetPhysicalAddress con el puntero SrbExtension .
InternalStatus
Usado por el controlador de puerto SCSI, en lugar de SrbStatus, para notificar el estado de la solicitud completada siempre que la solicitud no se pueda entregar al controlador de miniport. En tales casos, SrbStatus se establece en SRB_STATUS_INTERNAL_ERROR. Este miembro se usa exclusivamente para la comunicación entre el puerto SCSI y el controlador de clase y no debe ser utilizado por los controladores de miniport.
QueueSortKey
Especifica el desplazamiento desde el inicio del medio o cero, dependiendo del tipo del dispositivo de destino.
LinkTimeoutValue
Valor de tiempo de espera de vínculo.
Reserved
Reservado.
Cdb[16]
Especifica el bloque de descriptor de comandos SCSI-2 o posterior que se enviará al dispositivo de destino.
Comentarios
Los controladores de filtro y clase de almacenamiento de Windows pueden enviar SRB con los siguientes valores de Function al controlador de puerto del sistema:
- SRB_FUNCTION_CLAIM_DEVICE para indicar que el controlador de clase admite un periférico identificado en el SRB por los miembros PathId, TargetId y Lun .
- SRB_ATTACH_DEVICE para indicar que un controlador de filtro, en capas por encima de un controlador de clase, quiere que las solicitudes de un periférico determinado se enruten primero al controlador de filtro.
- SRB_FUNCTION_RELEASE_DEVICE para indicar que un controlador de clase está liberando su notificación en un periférico determinado.
- SRB_FUNCTION_FLUSH_QUEUE solicitar la cancelación de las solicitudes actualmente en cola en el controlador de puerto a un periférico determinado.
- SRB_FUNCTION_RELEASE_QUEUE solicitar que el controlador de puerto libere una cola inmovilizada de solicitudes a un periférico determinado.
El SRB_FUNCTION_XXX anterior nunca se establece en srBs enviados a controladores de miniporte SCSI. SRB_FUNCTION_REMOVE_DEVICE se define para su uso en versiones futuras del sistema. También, nunca se establece en srBs enviados a controladores de miniport SCSI. SRB_FUNCTION_WMI_REQUEST solo es válido en SCSI_WMI_REQUEST_BLOCK. Una clase de almacenamiento o un controlador de filtro lo usa para enviar solicitudes WMI al controlador de puerto.
Requisitos
Requisito | Valor |
---|---|
Header | srb.h (incluya Srb.h, Minitape.h, Storport.h) |