次の方法で共有


HW_STREAM_REQUEST_BLOCK構造体 (strmini.h)

ストリーム クラス ドライバーは、ミニドライバーから提供されたコールバックを使用して、HW_STREAM_REQUEST_BLOCK 構造体を使用してミニドライバーとの間で情報を渡します。

構文

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;

メンバーズ

SizeOfThisPacket

この構造体のサイズをバイト単位で指定します。

Command

ミニドライバーのコールバックによって実行される操作を指定します。 クラス ドライバーは、ミニドライバー コールバックSRB_XXXコマンド コードを渡します。

Status

ミニドライバーは、ストリーム要求を完了すると、このメンバーに要求の状態コードを入力します。 StrMini XxxRequest ルーチンでミニドライバーが使用する必要がある状態コードの適切なについては、ドキュメントを参照してください。

StreamObject

ストリーム指向の要求の場合、クラス ドライバーは、クラス ドライバーが要求を行っているストリームを指定する HW_STREAM_OBJECT 構造体を指すこれを設定します。

HwDeviceExtension

ミニドライバーのデバイス拡張機能へのポインター。 ミニドライバーは、このバッファーを使用して個人情報を記録できます。 ミニドライバーは、StreamClassRegisterMinidriver を介して自身を登録するときに渡す HW_INITIALIZATION_DATA 構造体で、このバッファーのサイズ設定します。 クラス ドライバーは、ミニドライバーに渡す HW_STREAM_OBJECTHW_TIME_CONTEXT、および PORT_CONFIGURATION_INFORMATION 構造体の HwDeviceExtension メンバー内のこのバッファーへのポインターも渡します。

SRBExtension

このストリーム要求ブロックの処理中に、クラス ドライバーがミニドライバーに割り当てる初期化されていないバッファーを指します。 ミニドライバーがブロックの処理を完了すると、このバッファーの割り当てが解除されます (詳細については、StreamClassDeviceNotification または streamClassStreamNotification を参照してください)。

CommandData

CommandData は、コマンド コード固有のデータに対して提供されるメンバーの和集合です。

CommandData.DataBufferArray

KSSTREAM_HEADER 構造体の配列へのポインター。 この配列内のエントリの数は、NumberOfBuffersで指定されます。 各KSSTREAM_HEADERでは、1 つのデータ ブロックについて説明します。

このメンバーは、コマンド コードが SRB_READ_DATA または SRB_WRITE_DATAされるときに使用されます。

CommandData.StreamBuffer

ミニドライバーがサポートするカーネル ストリーミング セマンティクスの説明が入力される HW_STREAM_DESCRIPTOR 構造を指します。

ミニドライバーは、PORT_CONFIGURATION_INFORMATION 構造体のメンバー StreamDescriptorSize 内のこのバッファーのサイズを指定します。

このメンバーは、コマンド コードが SRB_GET_STREAM_INFOされるときに使用されます。

CommandData.StreamState

ストリームの状態。 詳細については、KSPROPERTY_CONNECTION_STATE を参照してください。

このメンバーは、コマンド コードが SRB_GET_STREAM_STATE または SRB_SET_STREAM_STATEされるときに使用されます。

CommandData.TimeReference

STREAM_TIME_REFERENCE構造体へのポインター。

CommandData.PropertyInfo

プロパティの取得または設定操作のパラメーターを指定する STREAM_PROPERTY_DESCRIPTOR 構造体を指します。

このメンバーは、コマンド コードが SRB_GET_DEVICE_PROPERTYSRB_SET_DEVICE_PROPERTYSRB_GET_STREAM_PROPERTY、または SRB_SET_STREAM_PROPERTYされるときに使用されます。

CommandData.OpenFormat

形式を指定する KSDATAFORMAT 構造体へのポインター。

このメンバーは、コマンド コードが SRB_OPEN_STREAM または SRB_PROPOSE_DATA_FORMATされるときに使用されます。

CommandData.ConfigInfo

デバイスの初期化に使用する PORT_CONFIGURATION_INFORMATION 構造体へのポインター

このメンバーは、コマンド コードが SRB_INITIALIZE_DEVICEされるときに使用されます。

CommandData.MasterClockHandle

マスター クロックとして機能するクロック オブジェクトのハンドル。

このメンバーは、コマンド コードが SRB_OPEN_MASTER_CLOCK または SRB_INDICATE_MASTER_CLOCKされるときに使用されます。

CommandData.DeviceState

新しい電源状態を指定します。

このメンバーは、コマンド コードが SRB_CHANGE_POWER_STATEされるときに使用されます。

CommandData.IntersectInfo

この操作のパラメーターを記述する STREAM_DATA_INTERSECT_INFO 構造体へのポインター。

このメンバーは、コマンド コードが SRB_GET_DATA_INTERSECTIONされるときに使用されます。

CommandData.MethodInfo

メソッド データの読み取りまたは書き込みの対象となるバッファーへのポインター。

CommandData.FilterTypeIndex

SRB_OPEN_DEVICE_INSTANCEのフィルターの種類のインデックス。

CommandData.Idle

デバイスへの開いているハンドルが残っていない場合、このメンバーは TRUE に設定されます。 このメンバーは、デバイスがアイドル状態でなくなった場合 (デバイスのハンドルが開かれている) 場合は、FALSE に設定されます。

このメンバーは、コマンド コードが SRB_NOTIFY_IDLE_STATEされるときに使用されます。

_CommandData

CommandData は、コマンド コード固有のデータに対して提供されるメンバーの和集合です。

NumberOfBuffers

Command が SRB_READ_DATA または SRB_WRITE_DATAの場合は、CommandData.DataBufferArray が指すアドレスから始まる KSSTREAM_HEADER 構造体の配列内のエントリ数を指定します。 それ以外の場合、このパラメーターは使用されません。

TimeoutCounter

この要求がタイムアウトするまでの秒数。クラス ドライバーは、これを 1 秒に 1 回デクリメントします。 ミニドライバーがこの要求を完了する前に、クラス ドライバーが TimeoutCounter を 0 にデクリメントすると、ミニドライバーの StrMiniRequestTimeout ルーチンが呼び出されます。 ミニドライバーがこれを 0 に設定した場合、要求はタイムアウトしません。

TimeoutOriginal

クラス ドライバーは、これを SRB の作成時に TimeoutCounter の元の値に設定します。

NextSRB

別のストリーム要求ブロックを指します。 ミニドライバーは、このメンバーを使用してストリーム要求ブロックをキューに格納できます。

Irp

要求の IRP へのポインター。 ほとんどのミニドライバーは、このメンバーを使用する必要はありません。

Flags

要求の種類を指定します。 クラス ドライバーとミニドライバーは、このメンバーを使用して、クラス ドライバーがこのストリーム要求ブロックを渡したコールバックを決定できます。

価値 使用されるコールバック
何一つ StrMiniReceiveDevicePacket
SRB_HW_FLAGS_STREAM_REQUEST StrMiniReceiveStreamControlPacket
SRB_HW_FLAGS_DATA_TRANSFER StrMiniReceiveStreamDataPacket
SRB_HW_FLAGS_STREAM_REQUEST StrMiniReceiveStreamDataPacket

SRB_HW_FLAGS_STREAM_REQUEST ビットは、ストリーム固有の要求に対して設定されます (ミニドライバーの StrMiniReceiveStreamXxxパケット ルーチンに渡されます)。 SRB_HW_FLAGS_DATA_TRANSFER ビットは、データ転送要求 (ミニドライバーに渡されます) に設定されます。

HwInstanceExtension

ミニドライバーのインスタンス拡張機能へのポインター。 ミニドライバーは、このバッファーを使用して、ミニドライバーのこのインスタンスに対してグローバルな個人情報を記録できます。 ミニドライバーは、StreamClassRegisterMinidriver を介して自身を登録するときに渡す HW_INITIALIZATION_DATA 構造体で、このバッファーのサイズ設定します。

NumberOfBytesToTransfer

SRB_READ_DATAまたはSRB_WRITE_DATA要求の場合、転送するバイト数。

ActualBytesTransferred

制御要求の場合、実際に転送されたバイト数。

ScatterGatherBuffer

次の形式のKSSCATTER_GATHER構造体の配列を指します。

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

配列は、DMA を実行するためにミニドライバーが使用できる散布図/収集リストを記述します。 メモリをプローブ、ロック、マップ、またはフラッシュする必要はありません。 ストリーム クラス ドライバーは、ミニドライバーに対してこれらを実行します。

NumberOfPhysicalPages

ScatterGatherBuffer メンバーで渡される配列のサイズを指定します。

NumberOfScatterGatherElements

ScatterGatherBuffer によって指物理要素の数を指定します。

Reserved[1]

Reserved[1] フィールドはシステム用に予約されています。 使用しないでください。

備考

ストリーム クラス ドライバーは、ミニドライバーの StrMiniReceiveStreamDataPacketStrMiniReceiveStreamControlPacket、および StrMiniReceiveDevicePacket ルーチン HW_STREAM_REQUEST_BLOCK構造体へのポインターを渡します。

ミニドライバーは、要求がタイムアウトするか、要求が完了するまで、このストリーム要求ブロックを所有します。 ミニ ドライバーは、StreamClassDeviceNotification(DeviceRequestComplete、 デバイス固有の要求の場合は pSrb->HwDeviceExtension、pSRB)、ストリーム固有の要求の 場合は StreamClassStreamNotification(StreamRequestComplete、pSrb->StreamObject、pSrb) を呼び出します。 (ミニドライバーは、StreamClassCompleteRequestAndMarkQueueReady (pSrb)呼び出すことによって要求を完了することもできます。 詳細については、そのルーチンを参照してください)。)

クラス ドライバーは、要求をタイムアウトすると、ミニドライバーの StrMiniRequestTimeout ルーチンを呼び出します。このルーチンは、要求の処理を終了する必要があります。 ミニドライバーは、後で処理するために要求をキューに入れる場合は、TimeoutCounter メンバーを 0 に設定する必要があります。これにより、クラス ドライバーが要求をタイムアウトできなくなります。 ミニドライバーは、要求の処理を再開する準備ができたら、TimeoutCounter メンバー TimeoutOriginalの値にリセットする必要があります。

必要条件

要件 価値
ヘッダー strmini.h (Strmini.h を含む)