HW_STREAM_REQUEST_BLOCK Struktur (strmini.h)

Der Streamklassentreiber verwendet die HW_STREAM_REQUEST_BLOCK Struktur, um Informationen an und von dem Minidriver zu übergeben, wobei minidriver bereitgestellte Rückrufe verwendet werden.

Syntax

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;

Member

SizeOfThisPacket

Gibt die Größe dieser Struktur in Bytes an.

Command

Gibt den Vorgang an, der vom Rückruf des Minidrivers ausgeführt werden soll. Der Klassentreiber übergibt SRB_XXX Befehlscodes an Minidriver-Rückrufe.

Status

Wenn der Minidriver eine Datenstromanforderung abgeschlossen hat, füllt er dieses Element mit dem Statuscode der Anforderung aus. Lesen Sie die Dokumentation für die entsprechende StrMiniXxxRequest-Routine für die Statuscodes minidriver werden voraussichtlich verwendet.

StreamObject

Für streamorientierte Anforderungen legt der Klassentreiber diesen Wert auf die HW_STREAM_OBJECT Struktur fest, die den Datenstrom angibt, für den der Klassentreiber eine Anforderung angibt.

HwDeviceExtension

Zeiger auf die Geräteerweiterung des Minidrivers. Der Minidriver kann diesen Puffer verwenden, um private Informationen aufzuzeichnen. Der Minidriver legt die Größe dieses Puffers in der HW_INITIALIZATION_DATA Struktur fest, die er über StreamClassRegisterMinidriver übergibt. Der Klassentreiber übergibt auch Zeiger an diesen Puffer im HwDeviceExtension-Member des HW_STREAM_OBJECT, HW_TIME_CONTEXT und PORT_CONFIGURATION_INFORMATION Strukturen, die an den Minidriver übergeben werden.

SRBExtension

Verweist auf einen nicht initialisierten Puffer, den der Klassentreiber für den Minidriver zuweist, der beim Verarbeiten dieses Datenstromanforderungsblocks verwendet werden soll. Dieser Puffer wird behandelt, sobald der Minidriver die Behandlung des Blocks abgeschlossen hat (details finden Sie unter StreamClassDeviceNotification oder StreamClassStreamNotification ).

CommandData

CommandData ist eine Vereinigung von Mitgliedern, die für befehlscodespezifische Daten bereitgestellt werden.

CommandData.DataBufferArray

Zeiger auf ein Array von KSSTREAM_HEADER Strukturen. Die Anzahl der Einträge in diesem Array wird in NumberOfBuffers angegeben. Jede KSSTREAM_HEADER beschreibt einen Datenblock.

Dieses Element wird verwendet, wenn der Befehlscode SRB_READ_DATA oder SRB_WRITE_DATA ist.

CommandData.StreamBuffer

Verweist auf die HW_STREAM_DESCRIPTOR Struktur, in der der Minidriver eine Beschreibung der von ihr unterstützten Kernelstreamingsemantik einfüllt.

Der Minidriver gibt die Größe dieses Puffers im StreamDescriptorSize-Element seiner PORT_CONFIGURATION_INFORMATION Struktur an.

Dieses Element wird verwendet, wenn der Befehlscode SRB_GET_STREAM_INFO ist.

CommandData.StreamState

Der Datenstromstatus. Weitere Informationen finden Sie unter KSPROPERTY_CONNECTION_STATE .

Dieses Element wird verwendet, wenn der Befehlscode SRB_GET_STREAM_STATE oder SRB_SET_STREAM_STATE ist.

CommandData.TimeReference

Ein Zeiger auf eine STREAM_TIME_REFERENCE Struktur.

CommandData.PropertyInfo

Verweist auf die STREAM_PROPERTY_DESCRIPTOR Struktur, die die Parameter für den Eigenschafts-Get- oder Set-Vorgang angibt.

Dieses Element wird verwendet, wenn der Befehlscode SRB_GET_DEVICE_PROPERTY, SRB_SET_DEVICE_PROPERTY, SRB_GET_STREAM_PROPERTY oder SRB_SET_STREAM_PROPERTY ist.

CommandData.OpenFormat

Zeiger auf die KSDATAFORMAT-Struktur , die das Format angibt.

Dieses Element wird verwendet, wenn der Befehlscode SRB_OPEN_STREAM oder SRB_PROPOSE_DATA_FORMAT ist.

CommandData.ConfigInfo

Zeiger auf die PORT_CONFIGURATION_INFORMATION Struktur, die zum Initialisieren des Geräts verwendet wird

Dieses Element wird verwendet, wenn der Befehlscode SRB_INITIALIZE_DEVICE ist.

CommandData.MasterClockHandle

Handle für das Uhrobjekt, das jetzt als Masteruhr dient.

Dieses Element wird verwendet, wenn der Befehlscode SRB_OPEN_MASTER_CLOCK oder SRB_INDICATE_MASTER_CLOCK ist.

CommandData.DeviceState

Gibt den neuen Power-Zustand an.

Dieses Element wird verwendet, wenn der Befehlscode SRB_CHANGE_POWER_STATE ist.

CommandData.IntersectInfo

Zeiger auf eine STREAM_DATA_INTERSECT_INFO Struktur, die die Parameter dieses Vorgangs beschreibt.

Dieses Element wird verwendet, wenn der Befehlscode SRB_GET_DATA_INTERSECTION ist.

CommandData.MethodInfo

Zeiger auf einen Puffer, in den die Methodendaten gelesen oder geschrieben werden.

CommandData.FilterTypeIndex

Filtertypindex für SRB_OPEN_DEVICE_INSTANCE.

CommandData.Idle

Dieses Element ist auf TRUE festgelegt, wenn keine geöffneten Ziehpunkte für das Gerät verbleiben. Dieses Element ist auf FALSE festgelegt, wenn das Gerät nicht mehr leer ist (ein Handle für das Gerät wurde geöffnet).

Dieses Element wird verwendet, wenn der Befehlscode SRB_NOTIFY_IDLE_STATE ist.

_CommandData

CommandData ist eine Vereinigung von Mitgliedern, die für befehlscodespezifische Daten bereitgestellt werden.

NumberOfBuffers

Wenn Befehl entweder SRB_READ_DATA oder SRB_WRITE_DATA ist, gibt dies die Anzahl der Einträge im Array KSSTREAM_HEADER Strukturen an, die an der Adresse beginnen, die von CommandData.DataBufferArray verweist. Andernfalls ist dieser Parameter nicht verwendet.

TimeoutCounter

Die Anzahl von Sekunden, bevor diese Anforderung zeitüberschreitungen. Der Klassentreiber erhöht dies einmal pro Sekunde. Wenn der Klassentreiber TimeoutCounter auf null erhöht, bevor der Minidriver diese Anforderung abgeschlossen hat, ruft er die StrMiniRequestTimeout-Routine des Minidrivers auf. Wenn der Minidriver dies auf Null festlegt, wird die Anforderung nicht timeout.

TimeoutOriginal

Der Klassentreiber legt dies auf den ursprünglichen Wert von TimeoutCounter bei der Erstellung des SRB fest.

NextSRB

Verweist auf einen anderen Datenstromanforderungsblock. Der Minidriver kann dieses Mitglied verwenden, um Datenstromanforderungsblöcke in die Warteschlange zu stellen.

Irp

Zeiger auf das IRP für die Anforderung. Die meisten Minidriver müssen dieses Mitglied nicht verwenden.

Flags

Gibt den Anforderungstyp an. Der Klassentreiber und der Minidriver können dieses Mitglied verwenden, um zu bestimmen, an welchen Rückruf der Klassentreiber diesen Streamanforderungsblock übergeben hat.

Wert Rückruf verwendet
Keine 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 wird für streamspezifische Anforderungen festgelegt (die an die StrMiniReceiveStreamXxxPacket Routinen des Minidrivers übergeben werden). Das SRB_HW_FLAGS_DATA_TRANSFER Bit wird für Datenübertragungsanforderungen festgelegt (die an den Minidriver übergeben werden).

HwInstanceExtension

Zeiger auf die Instanzerweiterung des Minidrivers. Der Minidriver kann diesen Puffer verwenden, um private Informationen global für diese Instanz des Minidrivers aufzuzeichnen. Der Minidriver legt die Größe dieses Puffers in der HW_INITIALIZATION_DATA Struktur fest, die er über StreamClassRegisterMinidriver übergibt.

NumberOfBytesToTransfer

Bei einer SRB_READ_DATA- oder SRB_WRITE_DATA-Anforderung wird die Anzahl der zu übertragenden Bytes übertragen.

ActualBytesTransferred

Bei Steuerelementanforderungen wird die Anzahl der bytes tatsächlich übertragen.

ScatterGatherBuffer

Verweist auf ein Array von KSSCATTER_GATHER Strukturen des Formulars:

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

Das Array beschreibt eine Punkt-/Sammelliste, die vom Minidriver zum Ausführen von DMA verwendet werden kann. Der Speicher muss nicht abgetastet, gesperrt, zugeordnet oder geleert werden. Der Streamklassentreiber führt diese für den Minidriver aus.

NumberOfPhysicalPages

Gibt die Größe des Arrays an, das im PunktGatherBuffer-Element übergeben wird.

NumberOfScatterGatherElements

Gibt die Anzahl der physischen Elemente an, die von ScatterGatherBuffer darauf verwiesen werden.

Reserved[1]

Das Feld "Reserviert[1]" ist für die Systemverwendung reserviert. Darf nicht verwendet werden.

Bemerkungen

Der Streamklassentreiber übergibt Zeiger an HW_STREAM_REQUEST_BLOCK Strukturen an die StrMiniReceiveStreamDataPacket-Routinen des Minidrivers, StrMiniReceiveStreamControlPacket und StrMiniReceiveDevicePacket-Routinen .

Der Minidriver besitzt diesen Datenstromanforderungsblock, bis die Anforderung ausgecheckt ist oder die Anforderung abgeschlossen wird. Der Minidriver signalisiert den Klassentreiber, den er durch Aufrufen von StreamClassDeviceNotification(DeviceRequestComplete, pSrb-HwDeviceExtension>, pSRB) für gerätespezifische Anforderungen oder aufrufen von StreamClassStreamNotification(StreamRequestComplete, pSrb-StreamObject>, pSrb) für streamspezifische Anforderungen. (Der Minidriver kann auch eine Anforderung ausführen, indem StreamClassCompleteRequestAndMarkQueueReady(pSrb) aufgerufen wird. Weitere Informationen finden Sie in dieser Routine.)

Wenn der Klassentreiber die Anforderung ausläuft, ruft er die StrMiniRequestTimeout-Routine des Minidrivers auf, die die Verarbeitung der Anforderung beendet. Wenn der Minidriver eine Anforderung für die spätere Verarbeitung in die Warteschlange stellt, sollte das TimeoutCounter-Mitglied auf Null festgelegt werden, wodurch verhindert wird, dass der Klassentreiber die Anforderung ausdauert. Sobald der Minidriver bereit ist, die Verarbeitung der Anforderung fortzusetzen, sollte es das TimeoutCounter-Element auf den Wert von TimeoutOriginal zurücksetzen.

Anforderungen

   
Header strmini.h (include Strmini.h)