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) |