SCSI_REQUEST_BLOCK estructura (srb.h)
La SCSI_REQUEST_BLOCK estructura está asociada a una función SRB.
Nota
Los modelos de controlador de puerto SCSI y de miniportador SCSI pueden modificarse o no estar disponibles en el futuro. En su lugar, se recomienda usar los modelos de controlador storport y de miniport de Storport .
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:
| Value | 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 SCSIMESS_ABORT mensaje para cancelar la solicitud a la que apunta el miembro NextSrb . Si se trata de una solicitud tagged-queue, se SCSIMESS_ABORT_WITH_TAG en su lugar un mensaje de error. Si se ha completado la solicitud indicada, esta solicitud debe completarse con normalidad. 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 miniports. Solo los controladores de minipuertos storport usan esta SRB. La controladora de destino SCSI debe restablecerse mediante el SCSIMESS_BUS_DEVICE_RESET mensaje. 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) | Si es posible, se debe restablecer la unidad lógica. El controlador de miniportador HBA debe completar las solicitudes activas de la unidad lógica. Solo los miembros Function, PathId, TargetId y Lun de SRB son válidos. Storport admite este tipo de restablecimiento, pero el puerto SCSI no. |
| SRB_FUNCTION_RESET_BUS (0x12) | El bus SCSI debe restablecerse mediante el SCSIMESS_BUS_DEVICE_RESET mensaje. Un controlador de minipuerto recibe esta solicitud solo si una solicitud determinada ha pasado el tiempo de espera y una solicitud posterior para anular la solicitud de tiempo de espera también ha tiempo de espera. Solo los miembros SRB Function y PathId son válidos. |
| SRB_FUNCTION_TERMINATE_IO (0x14) | Se SCSIMESS_TERMINATE_IO_PROCESS mensaje para cancelar la solicitud a la que apunta el miembro NextSrb . Si la solicitud indicada ya se ha completado, esta solicitud debe completarse con normalidad. Solo los miembros SRB Function, PathId, TargetId, Lun y NextSrb son válidos. |
| SRB_FUNCTION_RELEASE_RECOVERY (0x11) | Se SCSIMESS_RELEASE_RECOVERY mensaje de error 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 dirigido. El miembro DataBuffer de SRB 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 tipo de controlador de minipuerto puede recibir varias de estas notificaciones antes de que toda la actividad del sistema se detenga realmente. 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. El búfer de datos de SRB apunta a un SRB_IO_CONTROL encabezado 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 miniporta 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 minipuerto debe ejecutar la solicitud y notificar al controlador de puerto específico del sistema operativo cuando se haya completado la SRB, mediante el mecanismo normal de llamadas a ScsiPortNotification con RequestComplete y NextRequest. |
| SRB_FUNCTION_LOCK_QUEUE (0x18) | Contiene las solicitudes que el controlador de puerto pone en cola 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 SRB_FLAGS_BYPASS_LOCKED_QUEUE datos. Los controladores de miniportador 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ó previamente con SRB_FUNCTION_LOCK_QUEUE. Las 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 miniportador 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ó previamente con SRB_FUNCTION_LOCK_QUEUE. Las 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 miniportador 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 minipuerto storport que se usa para controlar el disco que contiene los datos de volcado de memoria. La solicitud recopila la información necesaria del controlador de minipuerto para admitir el volcado de memoria y la hibernación. Consulte la estructura MINIPORT_DUMP_POINTERS datos. 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) | Una solicitud con esta función se envía a un controlador de miniportador 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 notificar al controlador específico del sistema operativo que la solicitud se ha completado mediante una llamada a ScsiPortNotification con RequestComplete. El valor de este miembro puede ser uno de los siguientes:
| Value | 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 miniporta establece este estado en NextSrb para una solicitud SRB_FUNCTION_ABORT_COMMAND correcta. |
| SRB_STATUS_ABORT_FAILED | Indica un error al intentar anular la solicitud. Devuelve este estado para una 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 minipuerto 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 dada. |
| SRB_STATUS_NO_DEVICE | Indica que el dispositivo no respondió. |
| SRB_STATUS_TIMEOUT | Indica que se ha producido un tiempo de espera de la solicitud. |
| SRB_STATUS_SELECTION_TIMEOUT | Indica que se ha pasado el tiempo de espera de la selección del dispositivo SCSI. |
| SRB_STATUS_COMMAND_TIMEOUT | Indica que el destino no ha completado 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 tales 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 ejecutaba esta solicitud. |
| SRB_STATUS_PARITY_ERROR | Indica que se produjo un error de paridad en el bus SCSI y que se produjo un error de reintento. |
| SRB_STATUS_REQUEST_SENSE_FAILED | Indica el error del comando request-sense. Esto solo se devuelve si el HBA realiza el sentido de solicitud automática y el controlador de minipuerto 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 o ejecución por debajo de los datos. El controlador de minipuerto también debe actualizar el miembro DataTransferLength de SRB para indicar cuántos datos se transfirieron realmente si se produce una subejecución. |
| SRB_STATUS_UNEXPECTED_BUS_FREE | Indica que el destino se desconectó inesperadamente. |
| SRB_STATUS_PHASE_SEQUENCE_FAILURE | Indica que el HBA detectó un error de secuencia de fase no ilegal. |
| SRB_STATUS_REQUEST_FLUSHED | Indica que se detuvo 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 valor de PathId especificado en el SRB no existe. |
| SRB_STATUS_INVALID_TARGET_ID | Indica que el valor targetID del SRB no es válido. |
| SRB_STATUS_INVALID_LUN | Indica que el valor lun del 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 Windows puerto de almacenamiento puede establecer este valor para informar a un controlador de clase de almacenamiento de que su cola de solicitudes para un periférico determinado se ha inmovilizado. |
ScsiStatus
Devuelve el estado SCSI devuelto por el HBA o el dispositivo de destino. Si el estado no es CORRECTO, 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 o dispositivo de destino en el bus.
Lun
Indica el número de unidad lógica del dispositivo.
QueueTag
Contiene el valor de etiqueta de cola asignado por el controlador de puerto específico del sistema operativo. Si este miembro se usa para la puesta en cola etiquetada, el HBA admite la puesta en cola interna de solicitudes a LAS y el controlador de miniporte establece TaggedQueueing en TRUE en el PORT_CONFIGURATION_INFORMATION para este HBA.
QueueAction
Indica el mensaje tagged-queueing que se va a usar cuando se SRB_FLAGS_QUEUE_ACTION_ENABLE marca. El valor puede ser uno de los siguientes: SRB_SIMPLE_TAG_REQUEST, SRB_HEAD_OF_QUEUE_TAG_REQUEST o SRB_ORDERED_QUEUE_TAG_REQUEST, tal como se define según la especificación SCSI.
CdbLength
Indica el tamaño en bytes del bloque descriptor de comandos SCSI-2 o posterior.
SenseInfoBufferLength
Indica el tamaño en bytes del búfer de sentido de solicitud. 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 una o varias de las marcas siguientes establecidas:
| Marca | Significado |
|---|---|
| SRB_FLAGS_QUEUE_ACTION_ENABLE | Indica que las acciones tagged-queue se van a habilitar. |
| 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 | Definida por compatibilidad con versiones anteriores con las interfaces SCSI de ASPI/CAM, esta marca indica que la dirección de transferencia podría ser cualquiera de las anteriores porque se han establecido 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 para el destino en el bus SCSI. Si su HBA es un dispositivo DMA subordinado, este tipo de 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 que no hay 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 que, si es posible, el HBA 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 miniport. |
| SRB_FLAGS_NO_QUEUE_FREEZE | Es irrelevante para los controladores de miniport. |
| SRB_FLAGS_IS_ACTIVE | Es irrelevante para los controladores de miniport. |
| SRB_FLAGS_ALLOCATED_FROM_ZONE | Es irrelevante para los controladores de miniport y está obsoleto para los controladores de Windows actuales. Para un Windows de clase heredada, 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 nuevos controladores de clase deben usar listas de aspecto en lugar de búferes de zona. |
| SRB_FLAGS_SGLIST_FROM_POOL | Es irrelevante para los controladores de minipuertos. Para un controlador Windows clase, esto indica que la memoria de una lista de dispersión y recopilación se asignó desde un grupo sin página. 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 controladores de minipuertos. Para el controlador de puerto, esta marca indica que se debe procesar la solicitud si la cola de unidad lógica está bloqueada. Un controlador de nivel superior debe establecer esta marca para enviar una SRB_FUNCTION_UNLOCK_QUEUE solicitud. |
| SRB_FLAGS_NO_KEEP_AWAKE | Es irrelevante para los controladores de minipuertos. Un Windows de clase utiliza esta marca para indicar al controlador de puerto que informe inactivo en lugar de encender el dispositivo para controlar esta solicitud. |
| SRB_FLAGS_FREE_SENSE_BUFFER | Indica que el puerto o el controlador de minipuertos han asignado un búfer para los datos de sentido. Esto informa al controlador de clase de que debe liberar el búfer de datos sense 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 se ha producido un tiempo de espera. No es necesario que los controladores de miniporte a la hora de las solicitudes porque el controlador de puerto ya lo hace.
DataBuffer
Apunta al búfer de datos. Los controladores de miniporta 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. En el caso de SRB_FUNCTION_IO_CONTROL, sin embargo, los controladores de miniporte pueden usar este valor como puntero de datos independientemente del valor de MapBuffers.
SenseInfoBuffer
Apunta al búfer de sentido de solicitud. No es necesario un controlador de miniportador para proporcionar datos de sentido de solicitud después de una condición CHECK.
NextSrb
Indica la SCSI_REQUEST_BLOCK a la que se aplica esta solicitud. Solo un pequeño subconjunto de solicitudes usa un segundo SRB, por ejemplo, SRB_FUNCTION_ABORT_COMMAND.
OriginalRequest
Apunta al IRP de 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 directamente a los datos determinados por el controlador de miniporte. La dirección física correspondiente se puede obtener llamando a ScsiPortGetPhysicalAddress con el puntero SrbExtension .
InternalStatus
Lo usa 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 miniportador. 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 usarse por los controladores de miniport.
QueueSortKey
Especifica el desplazamiento desde el inicio del medio o cero, según el tipo del dispositivo de destino.
LinkTimeoutValue
Valor de tiempo de espera del vínculo.
Reserved
Reservado.
Cdb
Especifica el bloque descriptor de comandos SCSI-2 o posterior que se va a enviar al dispositivo de destino.
Observaciones
Windows los controladores de filtro y clase de almacenamiento pueden enviar SRB con los siguientes valores de función 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, por encima de un controlador de clase, desea que las solicitudes de un periférico determinado se enrute 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.
Las SRB_FUNCTION_ XXX anteriores nunca se establecen en srbs enviados a controladores de miniportador 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 minipuertos SCSI. SRB_FUNCTION_WMI_REQUEST solo es válido en SCSI_WMI_REQUEST_BLOCK. Un controlador de filtro o clase de almacenamiento lo usa para enviar solicitudes WMI al controlador de puerto.
Requisitos
| Encabezado | srb.h (incluir Srb.h, Minitape.h, Storport.h) |
Consulte también
Comentarios
Enviar y ver comentarios de