AVC_FUNCTION_COMMAND
AVC_FUNCTION_COMMAND関数コードは、AV/C 要求を送信し、1 つの操作として応答を受信するために使用されます。
I/O ステータス ブロック
成功した場合、AV/C プロトコル ドライバーは Irp->IoStatus.Status をSTATUS_SUCCESSに設定します。
その他の戻り値は次のとおりです
戻り値 | 説明 |
---|---|
STATUS_TIMEOUT | 要求は行われましたが、すべてのタイムアウトと再試行処理が完了する前に応答は受信されませんでした。 前の要求がまだ処理されている場合、ターゲット デバイスは要求を無視します。 一部の AV/C デバイスは非準拠であり、複数回試行した後でも、100 ミリ秒のタイムアウト内での応答を拒否します。 AVC_COMMAND_IRB構造体では、既定の Timeout メンバーと Retries メンバー (それぞれ 100ms と 9) を調整できますが、これらの既定の設定は既知のすべての実装で十分です。 |
STATUS_PENDING | 要求が行われ、中間応答が受信されました。 最終的な応答を処理し、IRP と IRB リソースを解放するのは完了ルーチンの役割です。 |
STATUS_REQUEST_ABORTED | AV/C 要求を送信するときは、IRP の完了状態がSTATUS_REQUEST_ABORTEDされたときにすぐに中止します。 |
状態_* | その他のリターン コードは、AV/C プロトコルの範囲外のエラーまたは警告が発生したことを示します。 |
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_COMMAND に設定する必要があります。
SubunitAddrFlag
これを 1 に設定すると、 サブ ユニット ドライバーavc.sys関連付けるサブユニット アドレスがオーバーライドされます。 オーバーライドする理由は次のとおりです。サブユニット ドライバーは、1 つのインスタンス内の複数のサブユニットを表します。ユニット コマンドを送信する必要があります。または、avc.sysがサブユニット の 種類または ID を特定できなかったため、ドライバーが読み込まれました。 これが設定されている場合、 SubunitAddr メンバーは、目的のサブユニット アドレスを含む非ページ メモリを指す必要があります。
呼び出し元がavc.sysFDO に直接要求を送信する場合は、これを 1 つ (および指定された適切な SubunitAddr) に設定する必要があります。
Note
要求時、成功した要求からの応答でこのフラグが設定されていない場合、このフラグが設定され、 SubunitAddr メンバーはサブユニットの実際のアドレスを指します。 コンテンツの変更や、メモリの解放をしないでください。これは、親ドライバーのデバイス拡張機能の一部です。 これはもちろん、0 に戻り、 SubunitAddr ポインターをクリアして、別のサブユニットの構造体を再利用できます。
AlternateOpcodesFlag この要求のコマンドの種類とオペコードが別のオペコードで応答される場合は、これを 1 に設定します。 これを使用しない場合、一致するオペコードを持つ応答のみが受け入れられます。 これが設定されている場合、 AlternateOpcodes メンバーは、代替オペコードのリストを含む非ページ メモリへのポインターを指定する必要があります。
TimeoutFlag
既定のタイムアウトがサブユニットに適していない場合は、これを 1 に設定します。 この値を設定する場合は、 Timeout メンバーを目的のタイムアウト (100 ns 単位) に設定する必要があります。
RetryFlag
既定の再試行回数がサブユニットに適していない場合は、これを 1 に設定します。 この値を設定する場合は、 Retrys メンバーを目的の再試行回数に設定する必要があります。
Commandtype 要求時に、このメンバーを AvcCommandType 列挙体の列挙子のいずれかに設定する必要があります。 これは必須パラメーターです。
ResponseCode 応答では、このメンバーは AvcResponseCode 列挙の値に設定されます。
SubunitAddr
これを、1394 Trade Association AV/C Digital Interface Command Set General Specification, Rev 3.0 のセクション 5.3.3 に従ってエンコードされた目的のサブユニット アドレスを含む非ページ メモリのアドレスに設定します。 サブユニット アドレスエンコードがこれを意味するため、長さは必要ありません。 SubunitAddrFlag が 0 の場合、このパラメーターは無視されます。
AlternateOpcodes これを、目的の代替オペコード リストを含む非ページ メモリのアドレスに設定します。 オペコード リストの最初のバイトは、後に続くオペコードの数 (バイト数に相当) です。 代替オペコード リストを含むメモリの合計長は AlternateOpcodes[0]+1 です。 AlternateOpcodesFlag が 0 の場合、このパラメーターは無視されます。
タイムアウト
これを 100 ns 単位で目的のタイムアウトに設定します。 たとえば、既定のタイムアウト値は Timeout.QuadPart = 1000000 (100ns 単位で 100 ミリ秒) です。 TimeoutFlag が 0 の場合、このパラメーターは無視されます。
再試行 これを、応答なしでタイムアウトするたびに要求 avc.sys 再試行する必要がある回数に設定します。 再試行回数が 0 の場合は、要求が 1 回試行されることを意味します。 応答を取得せずにコマンドの処理に費やした合計時間は、次の式で計算されます。
タイムアウト * (再試行回数 + 1)
RetryFlag が 0 の場合、このパラメーターは無視されます。
オペコード これを目的の AV/C オペコードに設定します (サブユニットの種類に適しています)。 これは必須パラメーターです。 応答時に AlternateOpcodesFlag が設定され、代替オペコードの 1 つが応答と一致するために使用された場合、これはその代替オペコードに設定されます。
OperandLength
オペランド メンバーに オペランドを格納するために使用するバイト数に設定します。 これは必須パラメーターです。 応答時に、このパラメーターは応答で使用されるオペランド リスト内のバイト数に設定されます。
オペランド
これを、サブユニット型とオペコードに適したオペランド リストに設定します。 これは必須パラメーターです。 応答時に、このパラメーターには応答のオペランド リストが含まれます。
NodeAddress 予約済み。 これは 0 である必要があります。
世代
予約済み。 これは 0 である必要があります。
AVC_FUNCTION_COMMAND 関数コードは、avc.sysの仮想インスタンスではサポートされていません。 呼び出し元が外部デバイスを制御する場合、そのデバイスの非仮想インスタンスは、プライベート メカニズムを使用するか、IOCTL_AVC_CLASS I/O 制御コードのAVC_FUNCTION_FIND_PEER_DO、 AVC_FUNCTION_PEER_DO_LIST 、 AVC_FUNCTION_GET_SUBUNIT_INFO 関数コードの組み合わせを使用して配置できます。
この構造体は、AV/C コマンド要求の共通コンポーネントを定義します。 要求のオペコードとオペランド、および応答のオペコードとオペランド (完了時) を保持します。 オペランド リストのサイズは、1 バイトのサブユニット アドレスを指定したオペランドの最大許容数で固定されます。 サブユニット・アドレスが何らかの方法で拡張される場合は、それに応じてオペランド・バイトの最大許容数が減ります。
この構造体の推奨される用途は、パラメーターを入力する前に、最初に構造体を 0 にする ( RtlZeroMemory を使用する) 方法です。
これは IRQL = PASSIVE_LEVELで呼び出す必要があります。