AVC_FUNCTION_GET_REQUEST

AVC_FUNCTION_GET_REQUEST函数代码用于注册以接收 AV/C 单元和子单元请求。

I/O 状态块

此函数始终将 Irp-IoStatus.Status> 设置为 STATUS_PENDING。

注释

此函数使用 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 贸易协会 AV/C 数字接口命令集通用规范修订版 3.0 (0xff) 第 5.3.3 节编码的单元地址的非分页内存的地址。 请注意,对于子单元请求,在完成时,会指向包含此虚拟子单元实例的子单元地址的内存。 调用方可以访问此非分页内存,但不得尝试释放它。

AlternateOpcodes
仅在注册以接收单元命令时使用。 将其设置为包含调用方支持的单元操作码列表的非分页内存的地址。 操作码列表的第一个字节是后跟的操作码计数 (等效于) 的字节数。 包含备用操作码列表的内存的总长度为 AlternateOpcodes[0]+1。

超时
已忽略。

重试
已忽略。

操作码
输入时忽略。 在输出中,它包含 AV/C 单元操作码。 这是通过 AlternateOpcodes 指定的操作码之一

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 函数,以便可以接收下一个单元请求。

此结构的建议用法是先将结构归零, (在填充参数之前使用 RtlZeroMemory) 。

可以在 IRQL <= DISPATCH_LEVEL 调用此函数代码。

另请参阅

AVC_FUNCTION_SEND_RESPONSE

AvcResponseCode

AVC_FUNCTION

RtlZeroMemory