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

ExFreePool

ExInterlockedFreeToZone

HW_INITIALIZATION_DATA (SCSI)

PORT_CONFIGURATION_INFORMATION (SCSI)

SCSI_WMI_REQUEST_BLOCK

SRB_IO_CONTROL

ScsiPortGetPhysicalAddress

ScsiPortGetSrb

ScsiPortIoMapTransfer

ScsiPortNotification