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)

Consulte también

ExFreePool

ExInterlockedFreeToZone

HW_INITIALIZATION_DATA (SCSI)

PORT_CONFIGURATION_INFORMATION (SCSI)

SCSI_WMI_REQUEST_BLOCK

SRB_IO_CONTROL

ScsiPortGetPhysicalAddress

ScsiPortGetSrb

ScsiPortIoMapTransfer

ScsiPortNotification