estructura HW_STREAM_REQUEST_BLOCK (strmini.h)

El controlador de clase de secuencia usa la estructura HW_STREAM_REQUEST_BLOCK para pasar información hacia y desde el minidriver, mediante devoluciones de llamada proporcionadas por minidriver.

Sintaxis

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;

Miembros

SizeOfThisPacket

Especifica el tamaño, en bytes, de esta estructura.

Command

Especifica la operación que va a realizar la devolución de llamada del minidriver. El controlador de clase pasa SRB_XXX códigos de comando a devoluciones de llamada de minidriver.

Status

Cuando el minidriver completa una solicitud de secuencia, rellena este miembro con el código de estado de la solicitud. Consulte la documentación de la rutina de solicitud StrMiniXxx adecuada para los minidrivers de códigos de estado que se espera que usen.

StreamObject

En el caso de las solicitudes orientadas a secuencias, el controlador de clase establece esto para que apunte a la estructura HW_STREAM_OBJECT que especifica la secuencia en la que el controlador de clase realiza una solicitud.

HwDeviceExtension

Puntero a la extensión del dispositivo del minidriver. El minidriver puede usar este búfer para registrar información privada. El minidriver establece el tamaño de este búfer en la estructura HW_INITIALIZATION_DATA que pasa cuando se registra a sí mismo a través de StreamClassRegisterMinidriver. El controlador de clase también pasa punteros a este búfer en el miembro HwDeviceExtension del HW_STREAM_OBJECT, HW_TIME_CONTEXT y PORT_CONFIGURATION_INFORMATION estructuras que pasa al minidriver.

SRBExtension

Apunta a un búfer sin inicializar que el controlador de clase asigna para que el minidriver lo use mientras procesa este bloque de solicitud de secuencia. Este búfer se desasigna una vez que el minidriver completa su control del bloque (consulte StreamClassDeviceNotification o StreamClassStreamNotification para obtener más información).

CommandData

CommandData es una unión de miembros proporcionados para datos específicos del código de comandos.

CommandData.DataBufferArray

Puntero a una matriz de estructuras de KSSTREAM_HEADER . El número de entradas de esta matriz se especifica en NumberOfBuffers. Cada KSSTREAM_HEADER describe un bloque de datos.

Este miembro se usa cuando el código de comando se SRB_READ_DATA o SRB_WRITE_DATA.

CommandData.StreamBuffer

Apunta a la estructura de HW_STREAM_DESCRIPTOR que el minidriver rellena con una descripción de la semántica de streaming del kernel que admite.

El minidriver especifica el tamaño de este búfer en el miembro StreamDescriptorSize de su estructura PORT_CONFIGURATION_INFORMATION .

Este miembro se usa cuando se SRB_GET_STREAM_INFO el código de comando.

CommandData.StreamState

Estado de la secuencia. Consulte KSPROPERTY_CONNECTION_STATE para obtener más información.

Este miembro se usa cuando el código de comando se SRB_GET_STREAM_STATE o SRB_SET_STREAM_STATE.

CommandData.TimeReference

Puntero a una estructura STREAM_TIME_REFERENCE.

CommandData.PropertyInfo

Apunta a la estructura STREAM_PROPERTY_DESCRIPTOR que especifica los parámetros de la operación get o set de la propiedad.

Este miembro se usa cuando el código de comando se SRB_GET_DEVICE_PROPERTY, SRB_SET_DEVICE_PROPERTY, SRB_GET_STREAM_PROPERTY o SRB_SET_STREAM_PROPERTY.

CommandData.OpenFormat

Puntero a la estructura KSDATAFORMAT que especifica el formato.

Este miembro se usa cuando el código de comando se SRB_OPEN_STREAM o SRB_PROPOSE_DATA_FORMAT.

CommandData.ConfigInfo

Puntero a la estructura PORT_CONFIGURATION_INFORMATION usada para inicializar el dispositivo

Este miembro se usa cuando se SRB_INITIALIZE_DEVICE el código de comando.

CommandData.MasterClockHandle

Identificador del objeto de reloj que ahora actúa como reloj maestro.

Este miembro se usa cuando el código de comando se SRB_OPEN_MASTER_CLOCK o SRB_INDICATE_MASTER_CLOCK.

CommandData.DeviceState

Especifica el nuevo estado de energía.

Este miembro se usa cuando se SRB_CHANGE_POWER_STATE el código de comando.

CommandData.IntersectInfo

Puntero a una estructura de STREAM_DATA_INTERSECT_INFO que describe los parámetros de esta operación.

Este miembro se usa cuando se SRB_GET_DATA_INTERSECTION el código de comando.

CommandData.MethodInfo

Puntero a un búfer en el que se leerán o escribirán los datos del método.

CommandData.FilterTypeIndex

Índice de tipo de filtro para SRB_OPEN_DEVICE_INSTANCE.

CommandData.Idle

Este miembro se establece en TRUE si no quedan identificadores abiertos en el dispositivo. Este miembro se establece en FALSE si el dispositivo ya no está inactivo (se ha abierto un identificador para el dispositivo).

Este miembro se usa cuando se SRB_NOTIFY_IDLE_STATE el código de comando.

_CommandData

CommandData es una unión de miembros proporcionados para datos específicos del código de comandos.

NumberOfBuffers

Si Command es SRB_READ_DATA o SRB_WRITE_DATA, especifica el número de entradas de la matriz de estructuras de KSSTREAM_HEADER que comienza en la dirección a la que apunta CommandData.DataBufferArray. De lo contrario, este parámetro no se usa.

TimeoutCounter

Número de segundos antes de que se agote el tiempo de espera de esta solicitud. El controlador de clase disminuye esta operación una vez por segundo. Si el controlador de clase disminuye TimeoutCounter a cero antes de que el minidriver complete esta solicitud, llamará a la rutina StrMiniRequestTimeout del minidriver. Si el minidriver establece este valor en cero, la solicitud no agota el tiempo de espera.

TimeoutOriginal

El controlador de clase lo establece en el valor original de TimeoutCounter tras la creación de la SRB.

NextSRB

Apunta a otro bloque de solicitud de secuencia. El minidriver puede usar este miembro para poner en cola bloques de solicitud de flujo.

Irp

Puntero al IRP para la solicitud. La mayoría de los minidrivers no necesitan usar este miembro.

Flags

Especifica el tipo de solicitud. El controlador de clase y el minidriver pueden usar este miembro para determinar a qué devolución de llamada pasó este bloque de solicitud de secuencia.

Valor Devolución de llamada usada
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 bit se establece para las solicitudes específicas de la secuencia (que se pasan a las rutinas StrMiniReceiveStreamXxxPacket del minidriver). El bit de SRB_HW_FLAGS_DATA_TRANSFER se establece para las solicitudes de transferencia de datos (que se pasan al minidriver).

HwInstanceExtension

Puntero a la extensión de instancia del minidriver. El minidriver puede usar este búfer para registrar información privada global en esta instancia del minidriver. El minidriver establece el tamaño de este búfer en la estructura HW_INITIALIZATION_DATA que pasa cuando se registra a sí mismo a través de StreamClassRegisterMinidriver.

NumberOfBytesToTransfer

Para una solicitud de SRB_READ_DATA o SRB_WRITE_DATA, el número de bytes que se van a transferir.

ActualBytesTransferred

Para las solicitudes de control, el número de bytes transferidos realmente.

ScatterGatherBuffer

Apunta a una matriz de estructuras de KSSCATTER_GATHER, con el formato :

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

La matriz describe una lista de dispersión y recopilación que el minidriver puede usar para realizar DMA. No es necesario sondear, bloquear, asignar ni vaciar la memoria. El controlador de la clase de flujo realiza estas operaciones para el minidriver.

NumberOfPhysicalPages

Especifica el tamaño de la matriz pasada en el miembro ScatterGatherBuffer .

NumberOfScatterGatherElements

Especifica el número de elementos físicos a los que apunta ScatterGatherBuffer.

Reserved[1]

El campo Reserved[1] está reservado para el uso del sistema. No debe usarse.

Comentarios

El controlador de clase de secuencia pasa punteros a HW_STREAM_REQUEST_BLOCK estructuras a las rutinas StrMiniReceiveStreamDataPacket, StrMiniReceiveStreamControlPacket y StrMiniReceiveDevicePacket .

El minidriver posee este bloque de solicitud de secuencia hasta que la solicitud agota el tiempo de espera o completa la solicitud. El minidriver indica al controlador de clase que ha completado la solicitud llamando a StreamClassDeviceNotification(DeviceRequestComplete, pSrb-HwDeviceExtension>, pSRB) para solicitudes específicas del dispositivo o llamando a StreamClassStreamNotification(StreamRequestComplete, pSrb-StreamObject>, pSrb) para solicitudes específicas de la secuencia. (El minidriver también puede completar una solicitud llamando a StreamClassCompleteRequestAndMarkQueueReady(pSrb). Vea esa rutina para obtener más información).

Si el controlador de clase agota el tiempo de espera de la solicitud, llamará a la rutina StrMiniRequestTimeout del minidriver, que tiene la responsabilidad de terminar el procesamiento de la solicitud. Si el minidriver pone en cola una solicitud para su procesamiento posterior, debe establecer el miembro TimeoutCounter en cero, lo que impedirá que el controlador de clase agote el tiempo de espera de la solicitud. Una vez que el minidriver está listo para reanudar el procesamiento de la solicitud, debe restablecer el miembro TimeoutCounter al valor de TimeoutOriginal.

Requisitos

Requisito Valor
Header strmini.h (include Strmini.h)