Partager via


structure SRBEX_DATA (storport.h)

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

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

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 sous forme de structure SRBEX_DATA_BIDIRECTIONAL.
SrbExDataTypeScsiCdb16
Les données étendues SRB sont mises en forme sous forme de structure SRBEX_DATA_SCSI_CDB16.
SrbExDataTypeScsiCdb32
Les données étendues SRB sont mises en forme sous forme de structure SRBEX_DATA_SCSI_CDB32.
SrbExDataTypeScsiCdbVar
Les données étendues SRB sont mises en forme sous forme de structure SRBEX_DATA_SCSI_CDB_VAR.
SrbExDataTypeWmi
Les données étendues SRB sont mises en forme sous forme de structure SRBEX_DATA_WMI.
SrbExDataTypePower
Les données étendues SRB sont mises en forme sous forme de structure SRBEX_DATA_POWER.
SrbExDataTypePnp
Les données étendues SRB sont mises en forme sous forme de structure SRBEX_DATA_PNP.
SrbExDataTypeIoInfo
Les données étendues SRB sont mises en forme sous forme de structure SRBEX_DATA_IO_INFO.

Length

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

Data[ANYSIZE_ARRAY]

Contenu étendu du bloc de données SRB.

Remarques

Les données étendues SRB sont présentes lorsque le tableau SrbExDataOffset dans la structure STORAGE_REQUEST_BLOCK contient des emplacements offset valides. Un pilote de stockage référence initialement 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 converti en type de structure approprié en fonction de la valeur du type de données dans le membre type de.

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

Exigences

Exigence Valeur
client minimum pris en charge Windows 8
d’en-tête storport.h (include 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