AVC_FUNCTION_COMMAND
AVC_FUNCTION_COMMAND函数代码用于发送 AV/C 请求,并将响应作为一个操作接收。
I/O 状态块
如果成功,AV/C 协议驱动程序会将 Irp-IoStatus.Status> 设置为STATUS_SUCCESS。
可能的其他返回值包括:
返回值 | 说明 |
---|---|
STATUS_TIMEOUT | 发出了请求,但在所有超时和重试处理完成之前未收到任何响应。 如果上一个请求仍在处理中,目标设备将忽略请求。 某些 AV/C 设备不符合要求,并且拒绝在 100 毫秒的超时时间内做出响应,即使在连续几次尝试之后也是如此。 AVC_COMMAND_IRB结构允许分别 (100 毫秒和 9) 调整默认 Timeout 和 Retries 成员,但这些默认设置已足以满足所有已知实现。 |
STATUS_PENDING | 已发出请求,并收到临时响应。 完成例程负责处理最终响应并释放 IRP 和 IRB 资源。 |
STATUS_REQUEST_ABORTED | 提交 AV/C 请求时,当 IRP 完成状态STATUS_REQUEST_ABORTED时立即中止。 |
地位_* | 任何其他返回代码指示发生了超出 AV/C 协议范围的错误或警告。 |
注释
此函数使用 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 与子单元驱动程序关联的子单元地址。 重写的原因包括:子单元驱动程序表示单个实例中的多个子单元;必须发送单元命令;或加载驱动程序,因为 avc.sys 无法确定子单元类型或 ID。 如果设置了此设置, SubunitAddr 成员必须指向包含所需子单元地址的非分页内存。
如果调用方将请求直接提交到avc.sysFDO,则必须将其设置为一个 (以及) 提供的相应 SubunitAddr。
注意
如果未在请求时设置此标志,则根据成功请求的响应设置此标志,并且 SubunitAddr 成员指向子单元的实际地址。 请勿尝试更改内容或释放内存:它是父驱动程序的设备扩展的一部分。 当然,这可以重新设置为零,并清除 SubunitAddr 指针,以便为不同的子单元重用结构。
AlternateOpcodesFlag 如果此请求的命令类型和操作码导致具有不同操作码的响应,则将此设置为 1。 如果不这样做,则仅接受具有匹配操作码的响应。 如果设置此项, AlternateOpcodes 成员必须指向包含备用操作码列表的非分页内存。
TimeoutFlag
如果默认超时不适用于子单位,则将此设置为 1。 如果已设置,则 Timeout 成员必须设置为所需的超时 (,以 100-ns 单位) 。
RetryFlag
如果默认重试计数不适用于子单位,则将此设置为 1。 如果已设置,则必须将 重试 成员设置为所需的重试计数。
CommandType 根据请求,此成员必须设置为 AvcCommandType 枚举中的枚举器之一。 这是必需参数。
ResponseCode 响应时,此成员设置为 AvcResponseCode 枚举中的值。
SubunitAddr
将此设置为包含根据 1394 贸易协会 AV/C 数字接口命令集通用规范修订版 3.0 第 5.3.3 节编码的所需子单元地址的非分页内存的地址。 不需要长度,因为子单元地址编码暗示了这一点。 如果 SubunitAddrFlag 为零,则忽略此参数。
AlternateOpcodes 将此设置为包含所需备用操作码列表的非分页内存的地址。 操作码列表的第一个字节是后跟的操作码计数 (等效于) 的字节数。 包含备用操作码列表的内存的总长度为 AlternateOpcodes[0]+1。 如果 AlternateOpcodesFlag 为零,则忽略此参数。
超时
将此设置为所需的超时值(以 100-ns 单位为单位)。 例如,默认超时值为: Timeout.QuadPart = 1000000 (100ms,以 100ns 为单位) 。 如果 TimeoutFlag 为零,则忽略此参数。
重试 将此值设置为 avc.sys在每次 超时后在没有响应的情况下尝试重试请求的所需次数。 请注意,重试计数为零意味着请求尝试一次。 尝试在不获取响应的情况下处理命令所用的总时间由以下公式计算:
超时 * (重试+ 1)
如果 RetryFlag 为零,则忽略此参数。
操作码 将此设置为适合子单元类型) 的所需 AV/C 操作码 (。 这是必需参数。 在响应时,如果设置了 AlternateOpcodesFlag ,并且使用了其中一个备用操作码来匹配响应,则此值设置为该备用操作码。
OperandLength
将此设置为用于在操作数成员中存储操作数 的 字节数。 这是必需参数。 响应时,此参数设置为响应所使用的操作数列表中的字节数。
操作数
将此设置为适合子单元类型和操作码的操作数列表。 这是必需参数。 响应时,此参数包含响应的操作数列表。
NodeAddress 保留。 这必须为零。
代系
保留。 这必须为零。
avc.sys 的虚拟实例不支持AVC_FUNCTION_COMMAND函数代码。 如果调用方希望控制外部设备,则该设备的非虚拟实例可以通过专用机制或通过AVC_FUNCTION_FIND_PEER_DO的某种组合找到, AVC_FUNCTION_PEER_DO_LIST 和 AVC_FUNCTION_GET_SUBUNIT_INFO IOCTL_AVC_CLASS I/O 控制代码的函数代码。
此结构定义 AV/C 命令请求的常见组件。 它保存请求的操作码和操作数,并在完成) 后 (响应的操作码和操作数。 操作数列表的大小固定在给定一个字节子单元地址的最大允许操作数数上。 如果以任何方式扩展了子单元地址,则会相应地减少允许的最大操作数字节数。
此结构的建议用法是先将结构归零, (在填充参数之前使用 RtlZeroMemory) 。
必须在 IRQL = PASSIVE_LEVEL 调用。