Usando Avc.sys

Depois que o Windows carrega e inicializa Avc.sys, Avc.sys usa comandos padrão de unidade AV/C e subunidade para descobrir as subunidades ativas em todos os dispositivos AV/C conectados ao barramento IEEE 1394 (incluindo subunidades virtuais quando o computador é uma unidade AV/C virtual). Avc.sys gera IDs (identificadores de dispositivo) para todas as subunidades ativas. Em seguida, Avc.sys usa mecanismos de PnP (Plug and Play padrão) para carregar o driver de subunidade apropriado para cada subunidade. O driver de subunidade a ser carregado é selecionado com base no arquivo INF que instala o driver de subunidade e no identificador de dispositivo da subunidade, conforme gerado por Avc.sys e descrito em IDs de dispositivo AV/C. O identificador do dispositivo é gerado com base nas informações de unidade do dispositivo AV/C, em combinação com os campos SubunitType e SubunitID da subunidade . O driver que dá suporte a uma subunidade pode ser específico do fornecedor ou pode ser genérico para o tipo de subunidade. Por exemplo, o driver de subunidade para a maioria das filmadoras DV é o Msdv.sysfornecido pela Microsoft.

Os drivers de subunidade se comunicam com Avc.sys por meio do mecanismo padrão baseado em IRP empregado por todos os drivers com base na arquitetura do WDM. Um driver de subunidade se comunica com sua subunidade AV/C alocando e enviando IRPs para baixo na pilha de driver para o driver de protocolo AV/C ,Avc.sys. Para fazer solicitações de E/S, inclua o arquivo de cabeçalho Avc.h, que é fornecido com o WDK (Microsoft Windows Driver Kit).

Um driver de subunidade aloca e inicializa IRPs a serem processados pelo Avc.sys. Um driver de subunidade define o membro Parameters.DeviceIoControl.IoControlCode do IRP como o IOCTL que corresponde à operação AV/C desejada.

Avc.sys registra uma das duas interfaces de dispositivo, dependendo de qual pilha de driver de subunidade foi carregada para dar suporte (par ou virtual). Essas interfaces definem a funcionalidade que Avc.sys exporta para drivers de subunidade, outros drivers e aplicativos a serem usados. Avc.sys altera o estado da interface para habilitado ou desabilitado de acordo com o estado PnP do driver.

Avc.sys registrará uma nova instância de GUID_AVC_CLASS se ela tiver sido carregada para fornecer suporte para subunidades AV/C externas (a pilha de pares). Essa interface dá suporte apenas ao seguinte código IOCTL (controle de E/S):

IOCTL_AVC_CLASS, por sua vez, dá suporte a vários códigos de função. Os drivers filho de instâncias de Avc.sys para dar suporte a subunidades de pares têm a garantia de ter acesso a essa interface por meio de seu objeto de dispositivo pai.

A interface GUID_AVC_CLASS dá suporte a todos os códigos de função IOCTL_AVC_CLASS, embora alguns tenham limitações em seu uso, conforme descrito nas páginas de referência para cada função.

Avc.sys registra uma nova instância de GUID_VIRTUAL_AVC_CLASS, se tiver sido carregada, para fornecer suporte para subunidades AV/C virtuais (a pilha virtual). Essa interface dá suporte a quatro códigos IOCTL (controle de E/S):

A interface GUID_VIRTUAL_AVC_CLASS não dá suporte a todos os IOCTL_AVC_CLASS código de função. A página de referência para cada código de função individual especifica se há suporte para GUID_VIRTUAL_AVC_CLASS instâncias do Avc.sys.

IOCTL_AVC_CLASS IRPs só têm suporte no modo kernel (geralmente para comunicação de driver para driver) por meio de IRP_MJ_INTERNAL_DEVICE_CONTROL. Portanto, os aplicativos não podem acessar diretamente as funções fornecidas pelo código IOCTL IOCTL_AVC_CLASS.

Os últimos três códigos IOCTL têm suporte no modo kernel e no modo de usuário por meio de IRP_MJ_DEVICE_CONTROL. Isso significa que os aplicativos podem enviar essas IOCTLs diretamente para Avc.sys.

O código IOCTL IOCTL_AVC_CLASS sempre deve ser acompanhado por um IRB (bloco de solicitação de E/S), que descreve ainda mais a operação AV/C a ser executada. O cabeçalho IRB inclui um número de função, que determina a estrutura do restante do IRB. A estrutura e o tamanho do IRB variam de acordo com a função . Avc.sys usa dois IRBs personalizados:

A escolha de qual IRB um driver de subunidade deve usar depende da função desejada. Para obter mais informações sobre os códigos de função IOCTL_AVC_CLASS compatíveis com Avc.sys, consulte Códigos de função do driver de protocolo AV/C.

A função AV/C primária usada por drivers de subunidade é AVC_FUNCTION_COMMAND, que usa a estrutura AVC_COMMAND_IRB. AVC_FUNCTION_COMMAND envia solicitações AV/C e recebe as respostas AV/C correspondentes. Os detalhes para a criação de comandos AV/C são tratados por Avc.sys, mas o driver de subunidade deve fornecer o opcode AV/C e os operandos de cada comando.