Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Структура SRBEX_DATA — это обобщенный формат для хранения расширенных данных SRB.
Синтаксис
typedef struct _SRBEX_DATA {
SRBEXDATATYPE Type;
ULONG Length;
UCHAR Data[ANYSIZE_ARRAY];
} SRBEX_DATA, *PSRBEX_DATA;
Члены
Type
Индикатор типа данных для расширенной структуры данных SRB. Возможные значения для типа являются одним из следующих значений.
| Ценность | Значение |
|---|---|
|
Расширенный тип данных SRB неизвестен. |
|
Расширенные данные SRB форматируются как структура SRBEX_DATA_BIDIRECTIONAL. |
|
Расширенные данные SRB форматируются как структура SRBEX_DATA_SCSI_CDB16. |
|
Расширенные данные SRB форматируются как структура SRBEX_DATA_SCSI_CDB32. |
|
Расширенные данные SRB форматируются как структура SRBEX_DATA_SCSI_CDB_VAR. |
|
Расширенные данные SRB форматируются как структура SRBEX_DATA_WMI. |
|
Расширенные данные SRB форматируются как структура SRBEX_DATA_POWER. |
|
Расширенные данные SRB форматируются как структура SRBEX_DATA_PNP. |
|
Расширенные данные SRB форматируются как структура SRBEX_DATA_IO_INFO. |
Length
Длина данных SRB в байтах, присутствующих в элементе Data.
Data[ANYSIZE_ARRAY]
Расширенное содержимое блока данных SRB.
Замечания
Расширенные данные SRB присутствуют, когда массив SrbExDataOffset в структуреSTORAGE_REQUEST_BLOCK содержит допустимые расположения смещения. Драйвер хранилища изначально ссылается на расположение смещения памяти, содержащееся в SrbExDataOffset в виде структуры SRBEX_DATA. Затем указатель на блок данных приводится к соответствующему типу структуры на основе значения типа данных в элементе типа.
В следующем примере фрагмента кода показано, как получить доступ к расширенным данным для функции 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 (include Storport.h, Srb.h, Minitape.h) |