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


структура SRBEX_DATA (storport.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[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
Верхняя часть storport.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