HW_STREAM_REQUEST_BLOCK-Struktur (strmini.h)

Der Streamklassentreiber verwendet die HW_STREAM_REQUEST_BLOCK-Struktur , um Informationen an und vom Minidriver zu übergeben, wobei die von Minidriver bereitgestellten 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 Streamanforderung abschließt, füllt er diesen Member mit dem status Code der Anforderung aus. In der Dokumentation finden Sie die entsprechende StrMiniXxx-Anforderungsroutine für die status Codes, von denen erwartet wird, dass Minidriver verwendet werden.

StreamObject

Bei streamorientierten Anforderungen legt der Klassentreiber dies so fest, dass er auf die HW_STREAM_OBJECT-Struktur verweist, die den Stream angibt, für den der Klassentreiber eine Anforderung sendet.

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 übergibt, wenn er sich über StreamClassRegisterMinidriver registriert. Der Klassentreiber übergibt auch Zeiger an diesen Puffer im HwDeviceExtension-Member des HW_STREAM_OBJECT, HW_TIME_CONTEXT und PORT_CONFIGURATION_INFORMATION Strukturen, die er an den Minidriver übergibt.

SRBExtension

Zeigt auf einen nicht initialisierten Puffer, den der Klassentreiber für den Minidriver zuweist, der während der Verarbeitung dieses Streamanforderungsblocks verwendet werden soll. Dieser Puffer wird zugeordnet, sobald der Minidriver die Verarbeitung des Blocks abgeschlossen hat (ausführliche Informationen finden Sie unter StreamClassDeviceNotification oder StreamClassStreamNotification ).

CommandData

CommandData ist eine Union von Elementen, 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

Zeigt auf die HW_STREAM_DESCRIPTOR Struktur, die der Minidriver mit einer Beschreibung der vom Minidriver unterstützten Kernelstreamingsemantik ausfüllt.

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

Dieses Element wird verwendet, wenn der Befehlscode SRB_GET_STREAM_INFO wird.

CommandData.StreamState

Der Streamstatus. 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

Zeigt auf die STREAM_PROPERTY_DESCRIPTOR-Struktur , die die Parameter für den Vorgang zum Abrufen oder Festlegen der Eigenschaft 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 wird.

CommandData.MasterClockHandle

Handle für das Uhrobjekt, das jetzt als master Uhr dient.

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

CommandData.DeviceState

Gibt den neuen Energiestatus an.

Dieses Element wird verwendet, wenn der Befehlscode SRB_CHANGE_POWER_STATE wird.

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 wird.

CommandData.MethodInfo

Zeiger auf einen Puffer, aus dem die Methodendaten gelesen oder geschrieben werden.

CommandData.FilterTypeIndex

Filtertypindex für SRB_OPEN_DEVICE_INSTANCE.

CommandData.Idle

Dieser Member wird auf TRUE festgelegt, wenn keine geöffneten Handles für das Gerät verbleiben. Dieser Member ist auf FALSE festgelegt, wenn sich das Gerät nicht mehr im Leerlauf befindet (ein Handle für das Gerät wurde geöffnet).

Dieses Element wird verwendet, wenn der Befehlscode SRB_NOTIFY_IDLE_STATE wird.

_CommandData

CommandData ist eine Union von Elementen, die für befehlscodespezifische Daten bereitgestellt werden.

NumberOfBuffers

Wenn Command entweder SRB_READ_DATA oder SRB_WRITE_DATA ist, gibt dies die Anzahl der Einträge im Array der KSSTREAM_HEADER Strukturen an, die an der Adresse beginnt, auf die von CommandData.DataBufferArray verwiesen wird. Andernfalls wird dieser Parameter nicht verwendet.

TimeoutCounter

Die Anzahl der Sekunden, bis diese Anforderung ein Zeitüberschreitungsintervall hat. Der Klassentreiber dekrementiert 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 diesen Wert auf 0 festlegt, tritt für die Anforderung kein Timeout auf.

TimeoutOriginal

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

NextSRB

Zeigt auf einen anderen Streamanforderungsblock. Der Minidriver kann diesen Member verwenden, um Streamanforderungsblöcke in die Warteschlange zu stellen.

Irp

Zeiger auf den IRP für die Anforderung. Die meisten Minidriver müssen diesen Member nicht verwenden.

Flags

Gibt den Typ der Anforderung an. Der Klassentreiber und der Minitreiber können dieses Element verwenden, um zu bestimmen, an welchen Rückruf der Klassentreiber diesen Streamanforderungsblock übergeben hat.

Wert Verwendeter Rückruf
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 für streamspezifische Anforderungen festgelegt ist (die an die StrMiniReceiveStreamXxx-Paketroutinen des Minidrivers übergeben werden). Das SRB_HW_FLAGS_DATA_TRANSFER Bits wird für Datenübertragungsanforderungen festgelegt (die an den Minidriver übergeben werden).

HwInstanceExtension

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

NumberOfBytesToTransfer

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

ActualBytesTransferred

Bei Steuerungsanforderungen die Anzahl der tatsächlich übertragenen Bytes.

ScatterGatherBuffer

Zeigt auf ein Array von KSSCATTER_GATHER Strukturen der Form:

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

Das Array beschreibt eine Punkt-/Sammlungsliste, die vom Minidriver zum Ausführen von DMA verwendet werden kann. Der Arbeitsspeicher muss nicht überprüft, 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 ScatterGatherBuffer-Element übergeben wird.

NumberOfScatterGatherElements

Gibt die Anzahl der physischen Elemente an, auf die von ScatterGatherBuffer verwiesen wird.

Reserved[1]

Das Feld Reserviert[1] ist für die Systemverwendung reserviert. Nicht verwenden.

Hinweise

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

Der Minidriver besitzt diesen Streamanforderungsblock, bis die Anforderung ein Timeout aufweist oder die Anforderung abgeschlossen wird. Der Minidriver signalisiert dem Klassentreiber, dass er die Anforderung abgeschlossen hat, indem er StreamClassDeviceNotification(DeviceRequestComplete, pSrb-HwDeviceExtension>, pSRB) für gerätespezifische Anforderungen aufruft oder StreamClassStreamNotification(StreamRequestComplete, pSrb-StreamObject>, pSrb) für streamspezifische Anforderungen aufruft. (Der Minidriver kann auch eine Anforderung ausführen, indem er StreamClassCompleteRequestAndMarkQueueReady(pSrb) aufruft. Weitere Informationen finden Sie in dieser Routine.)

Wenn der Klassentreiber ein Timeout der Anforderung aufweist, ruft er die StrMiniRequestTimeout-Routine des Minidrivers auf, die für das Beenden der Verarbeitung der Anforderung verantwortlich ist. Wenn der Minitreiber eine Anforderung für die spätere Verarbeitung in die Warteschlange stellt, sollte er den TimeoutCounter-Member auf 0 festlegen, was verhindert, dass der Klassentreiber die Anforderung zeitlich ausrichtet. Sobald der Minidriver bereit ist, die Verarbeitung der Anforderung fortzusetzen, sollte er das TimeoutCounter-Element auf den Wert von TimeoutOriginal zurücksetzen.

Anforderungen

Anforderung Wert
Header strmini.h (include Strmini.h)