Compartir a través de


estructura SRBEX_DATA (storport.h)

La estructura SRBEX_DATA es el formato generalizado para contener datos SRB extendidos.

Nota Los modelos de controlador de puerto SCSI y controlador de miniport SCSI pueden modificarse o no estar disponibles en el futuro. En su lugar, se recomienda usar el del controlador storport de y modelos de controlador de storport.
 

Sintaxis

typedef struct _SRBEX_DATA {
  SRBEXDATATYPE Type;
  ULONG         Length;
  UCHAR         Data[ANYSIZE_ARRAY];
} SRBEX_DATA, *PSRBEX_DATA;

Miembros

Type

Indicador de tipo de datos para la estructura de datos SRB extendida. Los valores posibles para Type son uno de los siguientes.

Valor Significado
SrbExDataTypeUnknown
El tipo de datos extendido de SRB es desconocido.
SrbExDataTypeBidirectional
Los datos extendidos de SRB tienen el formato de estructura SRBEX_DATA_BIDIRECTIONAL.
SrbExDataTypeScsiCdb16
Los datos extendidos de SRB tienen el formato de estructura SRBEX_DATA_SCSI_CDB16.
SrbExDataTypeScsiCdb32
Los datos extendidos de SRB tienen el formato de estructura SRBEX_DATA_SCSI_CDB32.
SrbExDataTypeScsiCdbVar
Los datos extendidos de SRB tienen el formato de estructura SRBEX_DATA_SCSI_CDB_VAR.
SrbExDataTypeWmi
Los datos extendidos de SRB tienen el formato de estructura SRBEX_DATA_WMI.
SrbExDataTypePower
Los datos extendidos de SRB tienen el formato de estructura SRBEX_DATA_POWER.
SrbExDataTypePnp
Los datos extendidos de SRB tienen el formato de estructura SRBEX_DATA_PNP.
SrbExDataTypeIoInfo
Los datos extendidos de SRB tienen el formato de estructura SRBEX_DATA_IO_INFO.

Length

Longitud de los datos SRB, en bytes, presentes en el miembro de Datos.

Data[ANYSIZE_ARRAY]

Contenido extendido del bloque de datos SRB.

Observaciones

Los datos extendidos de SRB están presentes cuando la matriz SrbExDataOffset en la estructura de STORAGE_REQUEST_BLOCK contiene ubicaciones de desplazamiento válidas. Un controlador de almacenamiento inicialmente hace referencia a una ubicación de desplazamiento de memoria contenida en SrbExDataOffset como una estructura de SRBEX_DATA. A continuación, se convierte un puntero al bloque de datos en el tipo de estructura adecuado en función del valor de tipo de datos del miembro type de.

En el fragmento de código de ejemplo siguiente se muestra cómo acceder a los datos extendidos de una función SRB de SRB_FUNCTION_PNP.

BOOLEAN CheckIo( _In_ PSCSI_REQUEST_BLOCK Srb)
{
    BOOLEAN result = TRUE;
    ULONG function;
    PSTORAGE_REQUEST_BLOCK SrbEx = (PSTORAGE_REQUEST_BLOCK)Srb;
    PSRBEX_DATA SrbExData = NULL;

    function = (SrbEx->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK) ? SrbEx->SrbFunction : Srb->Function;

    switch (function)
    {
        case SRB_FUNCTION_PNP:
        {
            STOR_PNP_ACTION PnpAction;
            BOOLEAN ForAdapter;

            if (SrbEx->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
            {
                PSRBEX_DATA_PNP SrbExDataPnp = NULL;

                SrbExData = (PSRBEX_DATA) ((PUCHAR)SrbEx + SrbEx->SrbExDataOffset[0]);
                if (SrbExData->Type == SrbExDataTypePnp)
                {
                    SrbExDataPnp = (PSRBEX_DATA_PNP) SrbExData;
                    ForAdapter = (SrbExDataPnp->SrbPnPFlags == SRB_PNP_FLAGS_ADAPTER_REQUEST);
                    PnpAction = SrbExDataPnp->PnPAction;
                }
                else
                {
                    ForAdapter = FALSE;
                    result = FALSE;
                }
            }
            else
            {
                PSCSI_PNP_REQUEST_BLOCK PnpSrb = (PSCSI_PNP_REQUEST_BLOCK)Srb;

                ForAdapter = (PnpSrb->SrbPnPFlags == SRB_PNP_FLAGS_ADAPTER_REQUEST);
                PnpAction = PnpSrb->PnPAction;
           }

           if (ForAdapter)
           {
               switch (PnpAction)
               {
                   case StorRemoveDevice:
                       //
                       // ...
                       //
                       Srb->SrbStatus = SRB_STATUS_SUCCESS;
                       break;

                   default:
                       Srb->SrbStatus = SRB_STATUS_INVALID_REQUEST;
                       result = FALSE;
                       break:
            }
        }

        default:
            break; 
    }

    return result;
}

Requisitos

Requisito Valor
cliente mínimo admitido Windows 8
encabezado de storport.h (incluya Storport.h, Srb.h, Minitape.h)

Consulte también

SRBEX_DATA_BIDIRECTIONAL

SRBEX_DATA_IO_INFO

SRBEX_DATA_PNP

SRBEX_DATA_POWER

SRBEX_DATA_SCSI_CDB16

SRBEX_DATA_SCSI_CDB32

SRBEX_DATA_SCSI_CDB_VAR

SRBEX_DATA_WMI