Condividi tramite


struttura SRBEX_DATA (srb.h)

La struttura SRBEX_DATA è il formato generalizzato per contenere dati SRB estesi.

Nota I modelli di driver porta SCSI e miniport SCSI potrebbero essere modificati o non disponibili in futuro. È invece consigliabile usare driver Storport e modelli di driver miniport Storport.
 

Sintassi

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

Membri

Type

Indicatore del tipo di dati per la struttura dei dati SRB estesa. I valori possibili per Type sono uno dei seguenti.

Valore Significato
SrbExDataTypeUnknown
Il tipo di dati esteso SRB è sconosciuto.
SrbExDataTypeBidirectional
I dati estesi di SRB vengono formattati come struttura SRBEX_DATA_BIDIRECTIONAL.
SrbExDataTypeScsiCdb16
I dati estesi di SRB vengono formattati come struttura SRBEX_DATA_SCSI_CDB16.
SrbExDataTypeScsiCdb32
I dati estesi di SRB vengono formattati come struttura SRBEX_DATA_SCSI_CDB32.
SrbExDataTypeScsiCdbVar
I dati estesi di SRB vengono formattati come struttura SRBEX_DATA_SCSI_CDB_VAR.
SrbExDataTypeWmi
I dati estesi di SRB vengono formattati come struttura SRBEX_DATA_WMI.
SrbExDataTypePower
I dati estesi di SRB vengono formattati come struttura SRBEX_DATA_POWER.
SrbExDataTypePnp
I dati estesi di SRB vengono formattati come struttura SRBEX_DATA_PNP.
SrbExDataTypeIoInfo
I dati estesi di SRB vengono formattati come struttura SRBEX_DATA_IO_INFO.

Length

Lunghezza dei dati SRB, in byte, presenti nel membro dati.

Data[ANYSIZE_ARRAY]

Contenuto del blocco di dati SRB esteso.

Osservazioni

I dati estesi di SRB sono presenti quando la matrice di SrbExDataOffset nella struttura STORAGE_REQUEST_BLOCK contiene posizioni di offset valide. Un driver di archiviazione fa inizialmente riferimento a una posizione di offset di memoria contenuta in SrbExDataOffset come struttura SRBEX_DATA. Viene quindi eseguito il cast di un puntatore al blocco di dati al tipo di struttura appropriato in base al valore del tipo di dati nel membro tipo.

Il frammento di codice di esempio seguente illustra come accedere ai dati estesi per la funzione SRB di 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;
}

Fabbisogno

Requisito Valore
client minimo supportato Disponibile a partire da Windows 8.
intestazione srb.h (include Storport.h, Srb.h, Minitape.h)

Vedere anche

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