Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Der Streamklassentreiber verwendet die HW_STREAM_REQUEST_BLOCK Struktur zum Übergeben von Informationen an und vom Minidriver mithilfe von minidriver bereitgestellten Rückrufen.
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;
Angehörige
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 es dieses Element mit dem Statuscode der Anforderung aus. In der Dokumentation finden Sie die entsprechenden StrMiniXxxRequest Routine für die Statuscodes, die Minidriver verwenden sollen.
StreamObject
Für datenstromorientierte Anforderungen legt der Klassentreiber dies so fest, dass er auf die HW_STREAM_OBJECT Struktur verweist, 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 übergibt, wenn er sich über StreamClassRegisterMinidriverregistriert. Der Klassentreiber übergibt auch Zeiger an diesen Puffer im HwDeviceExtension Member des HW_STREAM_OBJECT, HW_TIME_CONTEXTund 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 Streamanforderungsblocks verwendet werden soll. Dieser Puffer wird abgeglichen, sobald der Minidriver seine Behandlung des Blocks abgeschlossen hat (details hierzu finden Sie unter StreamClassDeviceNotification oder StreamClassStreamNotification).
CommandData
CommandData- ist eine Vereinigung von Mitgliedern, die für befehlscodespezifische Daten bereitgestellt werden.
CommandData.DataBufferArray
Zeigen Sie auf ein Array von KSSTREAM_HEADER Strukturen. Die Anzahl der Einträge in diesem Array wird in NumberOfBuffersangegeben. Jede KSSTREAM_HEADER beschreibt einen Datenblock.
Dieses Element wird verwendet, wenn der Befehlscode SRB_READ_DATA oder SRB_WRITE_DATAist.
CommandData.StreamBuffer
Verweist auf die HW_STREAM_DESCRIPTOR Struktur, die der Minidriver mit einer Beschreibung der von ihr 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_INFOwird.
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_STATEist.
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 Abrufen- oder Festlegenvorgang der Eigenschaft angibt.
Dieses Element wird verwendet, wenn der Befehlscode SRB_GET_DEVICE_PROPERTY, SRB_SET_DEVICE_PROPERTY, SRB_GET_STREAM_PROPERTYoder SRB_SET_STREAM_PROPERTYist.
CommandData.OpenFormat
Zeigen Sie auf die KSDATAFORMAT- Struktur, die das Format angibt.
Dieses Element wird verwendet, wenn der Befehlscode SRB_OPEN_STREAM oder SRB_PROPOSE_DATA_FORMATist.
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_DEVICEwird.
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_CLOCKist.
CommandData.DeviceState
Gibt den neuen Energiezustand an.
Dieses Element wird verwendet, wenn der Befehlscode SRB_CHANGE_POWER_STATEwird.
CommandData.IntersectInfo
Zeigen Sie auf eine STREAM_DATA_INTERSECT_INFO Struktur, die die Parameter dieses Vorgangs beschreibt.
Dieses Element wird verwendet, wenn der Befehlscode SRB_GET_DATA_INTERSECTIONwird.
CommandData.MethodInfo
Zeigen Sie auf einen Puffer, aus dem die Methodendaten gelesen oder in diesen 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 im Leerlauf ist (ein Handle für das Gerät wurde geöffnet).
Dieses Element wird verwendet, wenn der Befehlscode SRB_NOTIFY_IDLE_STATEwird.
_CommandData
CommandData- ist eine Vereinigung von Mitgliedern, die für befehlscodespezifische Daten bereitgestellt werden.
NumberOfBuffers
Wenn Command entweder SRB_READ_DATA oder SRB_WRITE_DATAist, gibt dies die Anzahl der Einträge im Array KSSTREAM_HEADER Strukturen an, die mit der Adresse beginnen, auf die CommandData.DataBufferArrayverweist. Andernfalls wird dieser Parameter nicht verwendet.
TimeoutCounter
Die Anzahl der Sekunden, bevor diese Anforderung zu einem Zeitüberschreitungsout wird. Der Klassentreiber erhöht dies einmal pro Sekunde. Wenn der Klassentreiber TimeoutCounter auf Null, bevor der Minidriver diese Anforderung abgeschlossen hat, ruft er die StrMiniRequestTimeout Routine des Minidrivers auf. Wenn der Minidriver dies auf Null festlegt, wird für die Anforderung kein Timeout ausgeführt.
TimeoutOriginal
Der Klassentreiber legt dies auf den ursprünglichen Wert von TimeoutCounter beim Erstellen 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 diesen Member verwenden, um zu bestimmen, an welchen Rückruf der Klassentreiber diesen Streamanforderungsblock übergeben hat.
| Wert | Verwendeter Rückruf |
|---|---|
| Nichts | 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 ist für streamspezifische Anforderungen festgelegt (die an die StrMiniReceiveStreamXxxPacket Routinen des Minidrivers übergeben werden). Das SRB_HW_FLAGS_DATA_TRANSFER Bit ist 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 übergibt, wenn er sich über StreamClassRegisterMinidriverregistriert.
NumberOfBytesToTransfer
Bei einer SRB_READ_DATA oder SRB_WRITE_DATA Anforderung wird die Anzahl der zu übertragenden Bytes verwendet.
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-/Gather-Liste, die vom Minidriver zum Ausführen von DMA verwendet werden kann. Der Speicher 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 Member übergeben wird.
NumberOfScatterGatherElements
Gibt die Anzahl der physikalischen Elemente an, auf die ScatterGatherBufferverweist.
Reserved[1]
Das Feld "Reserviert[1]" ist für die Systemverwendung reserviert. Nicht verwenden.
Bemerkungen
Der Streamklassentreiber übergibt Zeiger an HW_STREAM_REQUEST_BLOCK Strukturen an die StrMiniReceiveStreamDataPacket, StrMiniReceiveStreamControlPacketund StrMiniReceiveDevicePacket Routinen.
Der Minidriver besitzt diesen Datenstromanforderungsblock, bis das Anforderungs-Zeitüberschreitungs- oder Abschluss der Anforderung erfolgt. Der Minidriver signalisiert dem Klassentreiber, dass er die Anforderung durch Aufrufen von StreamClassDeviceNotification(DeviceRequestComplete, pSrb->HwDeviceExtension, pSRB) für gerätespezifische Anforderungen oder aufrufen StreamClassStreamNotification(StreamRequestComplete, pSrb->StreamObject, pSrb) für streamspezifische Anforderungen. (Der Minidriver kann auch eine Anforderung abschließen, indem StreamClassCompleteRequestAndMarkQueueReady(pSrb) aufgerufen wird. Weitere Informationen finden Sie in dieser Routine.)
Wenn der Klassentreiber die Anforderung austiment, ruft er den StrMiniRequestTimeout Routine des Minidrivers auf, der die Verarbeitung der Anforderung beendet. Wenn der Minidriver eine Anforderung für die spätere Verarbeitung in die Warteschlange stellt, sollte der TimeoutCounter- Member auf Null festgelegt werden, wodurch verhindert wird, dass der Klassentreiber die Anforderung abläuft. Sobald der Minidriver bereit ist, die Verarbeitung der Anforderung fortzusetzen, sollte der TimeoutCounter- Member auf den Wert von TimeoutOriginal-zurückgesetzt werden.
Anforderungen
| Anforderung | Wert |
|---|---|
| Header- | strmini.h (einschließlich Strmini.h) |