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_OBJECT、HW_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_PROPERTY、SRB_SET_DEVICE_PROPERTY、SRB_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] フィールドはシステム用に予約されています。 使用しないでください。
備考
ストリーム クラス ドライバーは、ミニドライバーの StrMiniReceiveStreamDataPacket、StrMiniReceiveStreamControlPacket、および 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 を含む) |