AVC_FUNCTION_GET_REQUEST

O código de função AVC_FUNCTION_GET_REQUEST é usado para registrar para receber solicitações de unidade AV/C e subunidade.

Bloco de Status de E/S

Essa função sempre define Irp-IoStatus.Status> como STATUS_PENDING.

Comentários

Essa função usa a estrutura AVC_COMMAND_IRB conforme mostrado abaixo.

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;

Requisitos

Cabeçalhos: Declarado em avc.h. Inclua avc.h.

Entrada AVC_COMMAND_IRB

Comum
O submembro função desse membro deve ser definido como AVC_FUNCTION_GET_REQUEST da enumeração AVC_FUNCTION.

SubunitAddrFlag
Usado somente ao se registrar para receber comandos de unidade. Defina isso como 1 e forneça um Endereço de Unidade no parâmetro SubunitAddr . Observe que, para solicitações de subunidade, ao concluir, isso é definido como 1 e o parâmetro SubunitAddr aponta para a memória que contém o endereço de subunidade dessa instância de subunidade virtual. O chamador pode acessar essa memória nãopagada, mas não deve tentar liberá-la.

AlternateOpcodesFlag
Usado somente ao se registrar para receber comandos de unidade. Defina isso como 1 e forneça uma lista de opcodes compatíveis com o chamador no parâmetro AlternateOpcodes .

TimeoutFlag
Ignorado.

RetryFlag
Ignorado.

CommandType
Ignorado na entrada. Na saída, o membro CommandType é definido como um dos valores da enumeração AvcCommandType .

ResponseCode
Ignorado para solicitações.

SubunitAddr
Usado somente ao se registrar para receber comandos de unidade. Defina isso como o endereço da memória nãopagada que contém o Endereço de Unidade codificado de acordo com a Seção 5.3.3 da Especificação Geral do Conjunto de Comandos de Interface Digital AV/C da Associação Comercial 1394, Rev 3.0 (0xff). Observe que, para solicitações de subunidade, ao concluir, isso aponta para a memória que contém o endereço de subunidade dessa instância de subunidade virtual. O chamador pode acessar essa memória nãopagada, mas não deve tentar liberá-la.

AlternateOpcodes
Usado somente ao se registrar para receber comandos de unidade. Defina isso como o endereço de memória nãopagada que contém a lista de opcodes de unidade com suporte pelo chamador. O primeiro byte da lista opcode é a contagem de opcodes a seguir (equivalente ao número de bytes). O comprimento total da memória que contém a lista de opcodes alternativos é AlternateOpcodes[0]+1.

Tempo Limite
Ignorado.

Novas tentativas
Ignorado.

Opcode
Ignorado na entrada. Na saída, isso contém um opcode de unidade AV/C. Esse é um dos opcodes especificados por meio de AlternateOpcodes.

OperandLength
Ignorado na entrada. Na saída, isso é definido como o número de bytes na lista de operandos usada pela solicitação.

Operandos
Ignorado na entrada. Na saída, esse parâmetro contém a lista de operandos da solicitação.

NodeAddress
Ignorado na entrada. Na saída, isso é definido como o endereço do nó da origem da solicitação. Esse parâmetro é usado ao enviar a resposta (para obter mais informações, consulte AVC_FUNCTION_SEND_RESPONSE).

Generation
Ignorado na entrada. Na saída, isso é definido como a contagem de geração em vigor quando o endereço do nó foi considerado válido. Esse parâmetro é usado ao enviar a resposta (para obter mais informações, consulte AVC_FUNCTION_SEND_RESPONSE).

No contexto da interface do dispositivo GUID_AVC_CLASS, o código da função AVC_FUNCTION_GET_REQUEST é usado para registrar-se apenas para receber solicitações de unidade AV/C (não solicitações de subunidade). Essa função geralmente é usada por um driver de filtro superior (do avc.sys FDO) para dar suporte à funcionalidade de dispositivo par (ou seja, para lidar com solicitações de unidade do dispositivo de destino da pilha não virtual). Embora nada impeça que os drivers de subunidade se registrem para lidar com solicitações de unidade, as instâncias de driver de subunidade que se registram para dar suporte aos mesmos opcodes de unidade devem cooperar entre si para compartilhar informações de estado. Avc.sys não dá suporte diretamente a vários registros para os mesmos opcodes de unidade.

Essa função usa a estrutura AVC_COMMAND_IRB. Essa estrutura define os componentes comuns de uma solicitação de comando AV/C. Os únicos parâmetros de entrada válidos são SubunitAddrFlag, AlternateOpcodesFlag, AlternateOpcodes e SubunitAddr e todos são necessários. AlternateOpcodes deve apontar para um buffer que contenha a lista de opcodes de unidade com suporte pelo chamador. SubunitAddr deve apontar para um buffer que contém um endereço de unidade (0xff).

No caso de instâncias virtuais de avc.sys (ou seja, instâncias que registram a interface do dispositivo GUID_VIRTUAL_AVC_CLASS) AVC_FUNCTION_GET_REQUEST é usado para registrar para receber solicitações de unidade AV/C e subunidade. Drivers de filtro superior (do FDO deavc.sys virtual) geralmente se registram para lidar com solicitações de unidade, enquanto os drivers de subunidade se registram para lidar com solicitações de seu tipo específico de subunidade. Embora nada impeça que os drivers de subunidade se registrem para lidar com solicitações de unidade, as instâncias de driver de subunidade que se registram para dar suporte aos mesmos opcodes de unidade devem cooperar entre si para compartilhar informações de estado. Avc.sys não dá suporte diretamente a vários registros para os mesmos opcodes de unidade.

Os drivers de subunidade não definem parâmetros de entrada ao se registrar para receber solicitações específicas de subunidade.

Essa função sempre retorna STATUS_PENDING, portanto, qualquer processamento deve ser realizado em uma rotina de conclusão. Após a conclusão, a estrutura AVC_COMMAND_IRB contém o opcode e os operandos de uma solicitação. O protocolo AV/C exige que uma resposta seja enviada dentro de 100 ms. Isso pode ser feito a partir da rotina de conclusão usando a função AVC_FUNCTION_SEND_RESPONSE .

Se a primeira resposta usar o código de resposta AVC_RESPONSE_INTERIM (da enumeração AvcResponseType ), o processamento de acompanhamento será esperado. Os membros NodeAddress e Generation , obtidos pela conclusão da função original AVC_FUNCTION_GET_REQUEST , devem ser usados em respostas subsequentes. De qualquer forma, a próxima função AVC_FUNCTION_GET_REQUEST deve ser enviada antes de retornar da rotina inicial de conclusão AVC_FUNCTION_SEND_RESPONSE , para que a próxima solicitação de unidade possa ser recebida.

O uso recomendado dessa estrutura é primeiro zero da estrutura (use RtlZeroMemory) antes de preencher os parâmetros.

Esse código de função pode ser chamado em IRQL <= DISPATCH_LEVEL.

Confira também

AVC_FUNCTION_SEND_RESPONSE

AvcResponseCode

AVC_FUNCTION

RtlZeroMemory