структура HW_STREAM_REQUEST_BLOCK (strmini.h)

Драйвер класса stream использует структуру HW_STREAM_REQUEST_BLOCK для передачи информации в мини-диск и из нее с помощью предоставленных мини-накопителем обратных вызовов.

Синтаксис

typedef struct _HW_STREAM_REQUEST_BLOCK {
  ULONG                           SizeOfThisPacket;
  SRB_COMMAND                     Command;
  NTSTATUS                        Status;
  PHW_STREAM_OBJECT               StreamObject;
  PVOID                           HwDeviceExtension;
  PVOID                           SRBExtension;
  union {
    PKSSTREAM_HEADER                       DataBufferArray;
    PHW_STREAM_DESCRIPTOR                  StreamBuffer;
    KSSTATE                                StreamState;
    PSTREAM_TIME_REFERENCE                 TimeReference;
    PSTREAM_PROPERTY_DESCRIPTOR            PropertyInfo;
    PKSDATAFORMAT                          OpenFormat;
    struct _PORT_CONFIGURATION_INFORMATION *ConfigInfo;
    HANDLE                                 MasterClockHandle;
    DEVICE_POWER_STATE                     DeviceState;
    PSTREAM_DATA_INTERSECT_INFO            IntersectInfo;
    PVOID                                  MethodInfo;
    LONG                                   FilterTypeIndex;
    BOOLEAN                                Idle;
  } CommandData;
  _CommandData                    _CommandData;
  ULONG                           NumberOfBuffers;
  ULONG                           TimeoutCounter;
  ULONG                           TimeoutOriginal;
  struct _HW_STREAM_REQUEST_BLOCK *NextSRB;
  PIRP                            Irp;
  ULONG                           Flags;
  PVOID                           HwInstanceExtension;
  union {
    ULONG NumberOfBytesToTransfer;
    ULONG ActualBytesTransferred;
  };
  PKSSCATTER_GATHER               ScatterGatherBuffer;
  ULONG                           NumberOfPhysicalPages;
  ULONG                           NumberOfScatterGatherElements;
  ULONG                           Reserved[1];
} HW_STREAM_REQUEST_BLOCK, *PHW_STREAM_REQUEST_BLOCK;

Члены

SizeOfThisPacket

Задает размер этой структуры (в байтах).

Command

Указывает операцию, выполняемую обратным вызовом мини-накопителя. Драйвер класса передает коды команд SRB_XXX обратным вызовам мини-driver.

Status

Когда мини-хранилище завершает потоковый запрос, он заполняет этот элемент кодом состояния запроса. В документации описана соответствующая подпрограмма запросаStrMiniXxx для кодов состояния, которые, как ожидается, будут использоваться мини-устройствами.

StreamObject

Для потоковых запросов драйвер класса задает этот параметр, чтобы указать HW_STREAM_OBJECT структуру, указывающую поток, в котором драйвер класса выполняет запрос.

HwDeviceExtension

Указатель на расширение устройства мини-накопителя. Мини-диск может использовать этот буфер для записи личных сведений. Мини-диск устанавливает размер этого буфера в HW_INITIALIZATION_DATA структуре, которая передается при регистрации с помощью StreamClassRegisterMinidriver. Драйвер класса также передает указатели на этот буфер в члене HwDeviceExtensionHW_STREAM_OBJECT, HW_TIME_CONTEXT и PORT_CONFIGURATION_INFORMATION структурах, которые он передает в мини-диск.

SRBExtension

Указывает на неинициализированный буфер, выделенный драйвером класса для использования мини-накопителем при обработке этого блока запроса потока. Этот буфер освобождается после того, как мини-накопитель завершит обработку блока (дополнительные сведения см. в разделе StreamClassDeviceNotification или StreamClassStreamNotification ).

CommandData

CommandData — это объединение элементов, предоставляемое для данных, относящихся к командному коду.

CommandData.DataBufferArray

Указатель на массив KSSTREAM_HEADER структур. Количество записей в этом массиве указывается в поле NumberOfBuffers. Каждый KSSTREAM_HEADER описывает один блок данных.

Этот элемент используется, когда код команды SRB_READ_DATA или SRB_WRITE_DATA.

CommandData.StreamBuffer

Указывает на HW_STREAM_DESCRIPTOR структуру, заполняемую мини-накопителем, с описанием семантики потоковой передачи ядра, которая она поддерживает.

Мини-диск задает размер этого буфера в элементе StreamDescriptorSize своей PORT_CONFIGURATION_INFORMATION структуры.

Этот элемент используется, когда код команды SRB_GET_STREAM_INFO.

CommandData.StreamState

Состояние потока. Дополнительные сведения см. в разделе KSPROPERTY_CONNECTION_STATE .

Этот элемент используется, когда код команды SRB_GET_STREAM_STATE или SRB_SET_STREAM_STATE.

CommandData.TimeReference

Указатель на структуру STREAM_TIME_REFERENCE.

CommandData.PropertyInfo

Указывает на структуру STREAM_PROPERTY_DESCRIPTOR , указывающую параметры для операции получения или задания свойства.

Этот элемент используется, если код команды SRB_GET_DEVICE_PROPERTY, SRB_SET_DEVICE_PROPERTY, SRB_GET_STREAM_PROPERTY или SRB_SET_STREAM_PROPERTY.

CommandData.OpenFormat

Указатель на структуру KSDATAFORMAT , задающую формат.

Этот элемент используется, когда код команды SRB_OPEN_STREAM или SRB_PROPOSE_DATA_FORMAT.

CommandData.ConfigInfo

Указатель на структуру PORT_CONFIGURATION_INFORMATION , используемую для инициализации устройства

Этот элемент используется, когда код команды SRB_INITIALIZE_DEVICE.

CommandData.MasterClockHandle

Дескриптор объекта clock, который теперь служит в качестве master часов.

Этот элемент используется, когда код команды SRB_OPEN_MASTER_CLOCK или SRB_INDICATE_MASTER_CLOCK.

CommandData.DeviceState

Указывает новое состояние питания.

Этот член используется, когда код команды SRB_CHANGE_POWER_STATE.

CommandData.IntersectInfo

Указатель на структуру STREAM_DATA_INTERSECT_INFO , описывающую параметры этой операции.

Этот член используется, когда код команды SRB_GET_DATA_INTERSECTION.

CommandData.MethodInfo

Указатель на буфер, из который будут считываться или записываться данные метода.

CommandData.FilterTypeIndex

Индекс типа фильтра для SRB_OPEN_DEVICE_INSTANCE.

CommandData.Idle

Если открытых дескрипторов для устройства не остается, для этого элемента задано значение TRUE . Этот член имеет значение FALSE , если устройство больше не бездействует (был открыт дескриптор устройства).

Этот элемент используется, когда код команды SRB_NOTIFY_IDLE_STATE.

_CommandData

CommandData — это объединение элементов, предоставляемое для данных, относящихся к командному коду.

NumberOfBuffers

Если command является SRB_READ_DATA или SRB_WRITE_DATA, это указывает количество записей в массиве KSSTREAM_HEADER структур, который начинается с адреса, на который указывает CommandData.DataBufferArray. В противном случае этот параметр не используется.

TimeoutCounter

Количество секунд до истечения времени ожидания этого запроса. Драйвер класса уменьшает это значение один раз в секунду. Если драйвер класса уменьшает значение TimeoutCounter до нуля, прежде чем мини-драйвер завершит этот запрос, он вызовет подпрограмму StrMiniRequestTimeout для мини-накопителя . Если мини-диск устанавливает для этого параметра значение 0, время ожидания запроса не истекает.

TimeoutOriginal

Драйвер класса присваивает ей исходное значение TimeoutCounter при создании SRB.

NextSRB

Указывает на другой блок запроса потока. Мини-driver может использовать этот член для постановки в очередь блоков запросов потока.

Irp

Указатель на IRP для запроса. Большинству мини-драйверов не требуется использовать этот элемент.

Flags

Указывает тип запроса. Драйвер класса и мини-драйвер могут использовать этот член, чтобы определить, в какой обратный вызов драйвер класса передал этот блок запроса потока.

Значение Используемый обратный вызов
None StrMiniReceiveDevicePacket
SRB_HW_FLAGS_STREAM_REQUEST StrMiniReceiveStreamControlPacket
SRB_HW_FLAGS_DATA_TRANSFER StrMiniReceiveStreamDataPacket
SRB_HW_FLAGS_STREAM_REQUEST StrMiniReceiveStreamDataPacket

SRB_HW_FLAGS_STREAM_REQUEST бит устанавливается для запросов, зависящих от потока (которые передаются в подпрограммы пакета StrMiniReceiveStreamXxx). Бит SRB_HW_FLAGS_DATA_TRANSFER задается для запросов на передачу данных (которые передаются в мини-диск).

HwInstanceExtension

Указатель на расширение экземпляра мини-накопителя. Мини-накопитель может использовать этот буфер для записи личных сведений, глобальных в этот экземпляр мини-накопителя. Мини-диск устанавливает размер этого буфера в HW_INITIALIZATION_DATA структуре, которая передается при регистрации с помощью StreamClassRegisterMinidriver.

NumberOfBytesToTransfer

Количество передаваемых байтов для запроса SRB_READ_DATA или SRB_WRITE_DATA.

ActualBytesTransferred

Для контрольных запросов — количество фактически переданных байтов.

ScatterGatherBuffer

Указывает на массив KSSCATTER_GATHER структур в формате :

typedef struct {
    PHYSICAL_ADDRESS PhysicalAddress;
    ULONG Length;
} KSSCATTER_GATHER, *PKSSCATTER_GATHER;

Массив описывает список точечной и сборной, который может использоваться мини-накопителем для выполнения DMA. Память не требуется проверять, блокировать, сопоставлять или очищать. Драйвер класса stream выполняет эти действия для мини-драйвера.

NumberOfPhysicalPages

Задает размер массива, передаваемого в члене ScatterGatherBuffer .

NumberOfScatterGatherElements

Указывает количество физических элементов, на которые указывает ScatterGatherBuffer.

Reserved[1]

Поле Reserved[1] зарезервировано для использования системой. Не используйте.

Комментарии

Драйвер класса stream передает указатели на HW_STREAM_REQUEST_BLOCK структуры на подпрограммы StrMiniReceiveStreamDataPacket, StrMiniReceiveStreamControlPacket и StrMiniReceiveDevicePacket .

Мини-driver владеет этим блоком запросов потока до истечения времени ожидания запроса или завершения запроса. Мини-драйвер сообщает драйверу класса, что он выполнил запрос, вызывая StreamClassDeviceNotification(DeviceRequestComplete, pSrb-HwDeviceExtension>, pSRB) для запросов, относящихся к устройству, или вызывая StreamClassStreamNotification(StreamRequestComplete, pSrb-StreamObject>, pSrb) для запросов, зависящих от потока. (Мини-диск также может завершить запрос, вызвав StreamClassCompleteRequestAndMarkQueueReady(pSrb). Дополнительные сведения см. в этой процедуре.)

Если драйвер класса истечет время ожидания запроса, он вызовет подпрограмму StrMiniRequestTimeout мини-драйвера, которая отвечает за завершение обработки запроса. Если мини-driver помещает в очередь запрос для последующей обработки, он должен задать для элемента TimeoutCounter нулевое значение, что предотвратит превышение времени ожидания запроса драйвером класса. Когда мини-диск будет готов к возобновлению обработки запроса, он должен сбросить элемент TimeoutCounter на значение TimeoutOriginal.

Требования

Требование Значение
Заголовок strmini.h (включая Strmini.h)