次の方法で共有


AVC_FUNCTION_GET_REQUEST

AVC_FUNCTION_GET_REQUEST関数コードは、AV/C ユニット要求とサブユニット要求を受信するために登録するために使用されます。

I/O ステータス ブロック

この関数は、常に Irp->IoStatus.Status をSTATUS_PENDINGに設定します。

Comments

この関数では、次に示すように AVC_COMMAND_IRB 構造体を使用します。

typedef struct _AVC_COMMAND_IRB {
  AVC_IRB  Common;
  UCHAR  SubunitAddrFlag : 1;
  UCHAR  AlternateOpcodesFlag : 1;
  UCHAR  TimeoutFlag : 1;
  UCHAR  RetryFlag : 1;
  union {
    UCHAR  CommandType;
    UCHAR  ResponseCode;
  };
  PUCHAR  SubunitAddr;
  PUCHAR  AlternateOpcodes;
  LARGE_INTEGER  Timeout;
  UCHAR  Retries;
  UCHAR  Opcode;
  ULONG  OperandLength;
  UCHAR  Operands[MAX_AVC_OPERAND_BYTES];
  NODE_ADDRESS  NodeAddress;
  ULONG  Generation;
} AVC_COMMAND_IRB, *PAVC_COMMAND_IRB;

要件

ヘッダー:avc.h で宣言されています。 avc.h を含めます。

AVC_COMMAND_IRB 入力

通常
このメンバーの Function サブメンバーは、AVC_FUNCTION列挙体から AVC_FUNCTION_GET_REQUEST に設定する必要があります。

SubunitAddrFlag
ユニット コマンドを受信するために登録する場合にのみ使用されます。 これを 1 に設定し、 SubunitAddr パラメーターにユニット アドレスを指定します。 サブユニット要求の場合、完了時にこれは 1 に設定され、 SubunitAddr パラメーターは、この仮想サブユニット インスタンスのサブユニット アドレスを含むメモリを指します。 呼び出し元は、この非ページ メモリにアクセスできますが、解放を試みてはいけません。

AlternateOpcodesFlag
ユニット コマンドを受信するために登録する場合にのみ使用されます。 これを 1 に設定し、呼び出し元がサポートするオペコードの一覧を AlternateOpcodes パラメーターに指定します。

TimeoutFlag
無視されます。

RetryFlag
無視されます。

CommandType
入力では無視されます。 出力時に、 CommandType メンバーは AvcCommandType 列挙の値のいずれかに設定されます。

ResponseCode
要求の場合は無視されます。

SubunitAddr
ユニット コマンドを受信するために登録する場合にのみ使用されます。 これを、1394 Trade Association AV/C Digital Interface Command Set General Specification, Rev 3.0 (0xff) のセクション 5.3.3 に従ってエンコードされたユニット アドレスを含む非ページ メモリのアドレスに設定します。 サブユニット要求の場合、完了すると、この仮想サブユニット インスタンスのサブユニット アドレスを含むメモリが指されることに注意してください。 呼び出し元は、この非ページ メモリにアクセスできますが、解放を試みてはいけません。

AlternateOpcodes
ユニット コマンドを受信するために登録する場合にのみ使用されます。 呼び出し元がサポートするユニット オペコードの一覧を含む非ページ メモリのアドレスに設定します。 オペコード リストの最初のバイトは、後に続くオペコードの数 (バイト数に相当) です。 代替オペコード リストを含むメモリの合計長は AlternateOpcodes[0]+1 です。

タイムアウト
無視されます。

再試行
無視されます。

オペコード
インポート時には無視されます。 出力時には、AV/C ユニットオペコードが含まれます。 これは、 AlternateOpcodes で指定されたオペコードの 1 つです。

OperandLength
インポート時には無視されます。 出力時に、これは要求で使用されるオペランド リスト内のバイト数に設定されます。

オペランド
インポート時には無視されます。 出力時に、このパラメーターには要求のオペランド リストが含まれます。

NodeAddress
インポート時には無視されます。 出力時に、これは要求のソースのノード アドレスに設定されます。 このパラメーターは、応答を送信するときに使用されます (詳細については、「 AVC_FUNCTION_SEND_RESPONSE」を参照してください)。

世代
インポート時には無視されます。 出力時には、ノード・アドレスが有効と見なされたときの強制生成カウントに設定されます。 このパラメーターは、応答を送信するときに使用されます (詳細については、「 AVC_FUNCTION_SEND_RESPONSE」を参照してください)。

GUID_AVC_CLASS デバイス インターフェイスのコンテキストでは、 AVC_FUNCTION_GET_REQUEST 関数コードを使用して、AV/C ユニット要求のみを受信するように登録します (サブユニット要求ではありません)。 この関数は一般に、ピア デバイス機能 (つまり、非仮想スタックからのターゲット デバイスからのユニット要求を処理する) をサポートするために、上位フィルター ドライバー ( avc.sys FDO) によって使用されます。 サブユニット ドライバーがユニット要求を処理するために登録することを妨げるものは何もありませんが、同じユニットオペコードをサポートするために登録するサブユニット ドライバー インスタンスは、状態情報を共有するために相互に協力する必要があります。 Avc.sys では、同じユニット オペコードに対する複数の登録は直接サポートされません。

この関数は、AVC_COMMAND_IRB構造体を使用します。 この構造体は、AV/C コマンド要求の共通コンポーネントを定義します。 有効な入力パラメーターは SubunitAddrFlagAlternateOpcodesFlagAlternateOpcodesSubunitAddr のみです。これらはすべて必須です。 AlternateOpcodes は、 呼び出し元がサポートするユニットオペコードのリストを含むバッファーを指す必要があります。 SubunitAddr は、ユニット アドレス (0xff) を含むバッファーを指す必要があります。

avc.sys の仮想インスタンス (つまり、GUID_VIRTUAL_AVC_CLASS デバイス インターフェイスを登録するインスタンス) の場合、AVC_FUNCTION_GET_REQUESTを使用して AV/C ユニットとサブユニットの要求を受け取ります。 上部フィルター ドライバー (仮想 avc.sys FDO) は通常、ユニット要求を処理するために登録しますが、サブユニット ドライバーは特定の種類のサブユニットの要求を処理するために登録します。 サブユニット ドライバーがユニット要求を処理するために登録することを妨げるものは何もありませんが、同じユニットオペコードをサポートするために登録するサブユニット ドライバー インスタンスは、状態情報を共有するために相互に協力する必要があります。 Avc.sys では、同じユニット オペコードに対する複数の登録は直接サポートされません。

サブユニットドライバーは、サブユニット固有の要求を受信するように登録するときに入力パラメーターを設定しません。

この関数は常にSTATUS_PENDINGを返すので、完了ルーチンで処理を実行する必要があります。 完了すると、AVC_COMMAND_IRB構造体は要求のオペコードとオペランドを保持します。 AV/C プロトコルでは、応答を 100 ミリ秒以内に送信する必要があります。 これは、 AVC_FUNCTION_SEND_RESPONSE 関数を使用して完了ルーチンから実行できます。

最初の応答で (AvcResponseType 列挙からの) AVC_RESPONSE_INTERIM 応答コードを使用する場合は、フォローアップ処理が必要です。 AVC_FUNCTION_GET_REQUEST の元の関数の完了によって取得された NodeAddressGeneration のメンバーは、後続の応答で使用する必要があります。 いずれの場合も、次のユニット要求を受信できるように、最初の AVC_FUNCTION_SEND_RESPONSE 完了ルーチンから戻る前に、次の AVC_FUNCTION_GET_REQUEST 関数を送信する必要があります。

この構造体の推奨される用途は、パラメーターを入力する前に、最初に構造体を 0 にする ( RtlZeroMemory を使用する) 方法です。

この関数コードは、IRQL <= DISPATCH_LEVEL で呼び出される場合があります。

関連項目

AVC_FUNCTION_SEND_RESPONSE

AvcResponseCode

AVC_FUNCTION

RtlZeroMemory