Compartir a través de


estructura de 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 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 _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 de Type son uno de los siguientes.

Valor Significado
SrbExDataTypeUnknown
El tipo de datos extendido 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 de SRB, en bytes, presentes en el miembro Data .

Data[ANYSIZE_ARRAY]

Contenido extendido del bloque de datos SRB.

Comentarios

Los datos extendidos de SRB están presentes cuando la matriz SrbExDataOffset de la estructura STORAGE_REQUEST_BLOCK contiene ubicaciones de desplazamiento válidas. Un controlador de almacenamiento hace referencia inicialmente 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 según el valor del tipo de datos en el miembro Type .

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 Value
Cliente mínimo compatible Windows 8
Encabezado 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