structure SRBEX_DATA (srb.h)

La structure SRBEX_DATA est le format généralisé pour contenir des données SRB étendues.

Note Les modèles de pilote de port SCSI et de pilote miniport SCSI peuvent être modifiés ou indisponibles à l’avenir. Au lieu de cela, nous vous recommandons d’utiliser les modèles de pilote Storport et de pilote Miniport Storport .
 

Syntaxe

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

Membres

Type

Indicateur de type de données pour la structure de données SRB étendue. Les valeurs possibles pour Type sont l’une des suivantes.

Valeur Signification
SrbExDataTypeUnknown
Le type de données étendu SRB est inconnu.
SrbExDataTypeBidirectional
Les données étendues SRB sont mises en forme en tant que structure SRBEX_DATA_BIDIRECTIONAL .
SrbExDataTypeScsiCdb16
Les données étendues SRB sont mises en forme en tant que structure SRBEX_DATA_SCSI_CDB16 .
SrbExDataTypeScsiCdb32
Les données étendues SRB sont mises en forme en tant que structure SRBEX_DATA_SCSI_CDB32 .
SrbExDataTypeScsiCdbVar
Les données étendues SRB sont mises en forme en tant que structure SRBEX_DATA_SCSI_CDB_VAR .
SrbExDataTypeWmi
Les données étendues SRB sont mises en forme en tant que structure SRBEX_DATA_WMI .
SrbExDataTypePower
Les données étendues SRB sont mises en forme en tant que structure SRBEX_DATA_POWER .
SrbExDataTypePnp
Les données étendues SRB sont mises en forme en tant que structure SRBEX_DATA_PNP .
SrbExDataTypeIoInfo
Les données étendues SRB sont mises en forme en tant que structure SRBEX_DATA_IO_INFO .

Length

Longueur des données SRB, en octets, présentes dans le membre Données .

Data[ANYSIZE_ARRAY]

Contenu du bloc de données SRB étendu.

Remarques

Les données étendues SRB sont présentes lorsque le tableau SrbExDataOffset dans la structure STORAGE_REQUEST_BLOCK contient des emplacements de décalage valides. Un pilote de stockage fait initialement référence à un emplacement de décalage de mémoire contenu dans SrbExDataOffset en tant que structure SRBEX_DATA . Un pointeur vers le bloc de données est ensuite casté vers le type de structure approprié en fonction de la valeur du type de données dans le membre Type .

L’exemple de fragment de code suivant montre comment accéder aux données étendues pour la fonction 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;
}

Configuration requise

Condition requise Valeur
Client minimal pris en charge Disponible à partir de Windows 8.
En-tête srb.h (y compris Storport.h, Srb.h, Minitape.h)

Voir aussi

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