Поделиться через


структура SRBEX_DATA (srb.h)

Структура SRBEX_DATA является обобщенным форматом для хранения расширенных данных SRB.

Примечание Модели драйверов портов SCSI и драйверов мини-портов SCSI могут быть изменены или недоступны в будущем. Вместо этого рекомендуется использовать модели драйверов Storport и драйверов для мини-портов Storport .
 

Синтаксис

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

Члены

Type

Индикатор типа данных для расширенной структуры данных SRB. Возможные значения type являются одним из следующих.

Значение Значение
SrbExDataTypeUnknown
Расширенный тип данных SRB неизвестен.
SrbExDataTypeBidirectional
Расширенные данные SRB форматируются как структура SRBEX_DATA_BIDIRECTIONAL .
SrbExDataTypeScsiCdb16
Расширенные данные SRB форматируются как структура SRBEX_DATA_SCSI_CDB16 .
SrbExDataTypeScsiCdb32
Расширенные данные SRB форматируются как структура SRBEX_DATA_SCSI_CDB32 .
SrbExDataTypeScsiCdbVar
Расширенные данные SRB форматируются как структура SRBEX_DATA_SCSI_CDB_VAR .
SrbExDataTypeWmi
Расширенные данные SRB форматируются как структура SRBEX_DATA_WMI .
SrbExDataTypePower
Расширенные данные SRB форматируются как структура SRBEX_DATA_POWER .
SrbExDataTypePnp
Расширенные данные SRB форматируются как структура SRBEX_DATA_PNP .
SrbExDataTypeIoInfo
Расширенные данные SRB форматируются как структура SRBEX_DATA_IO_INFO .

Length

Длина данных SRB в байтах, присутствующих в элементе Data .

Data[ANYSIZE_ARRAY]

Содержимое расширенного блока данных SRB.

Комментарии

Расширенные данные SRB присутствуют, когда массив SrbExDataOffset в структуре STORAGE_REQUEST_BLOCK содержит допустимые расположения смещения. Драйвер хранилища изначально ссылается на расположение смещения памяти, содержащееся в SrbExDataOffset , в качестве структуры SRBEX_DATA . Затем указатель на блок данных приводится к соответствующему типу структуры на основе значения типа данных в элементе Type .

В следующем примере фрагмента кода показано, как получить доступ к расширенным данным для функции SRB 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;
}

Требования

Требование Значение
Минимальная версия клиента Доступно начиная с Windows 8.
Верхняя часть srb.h (включая Storport.h, Srb.h, Minitape.h)

См. также раздел

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