Partager via


AVC_FUNCTION_GET_REQUEST

Le code de la fonction AVC_FUNCTION_GET_REQUEST est utilisé pour s’inscrire afin de recevoir des demandes d’unités et de sous-unités AV/C.

Bloc d’état E/S

Cette fonction définit toujours Irp-IoStatus.Status> sur STATUS_PENDING.

Commentaires

Cette fonction utilise la structure AVC_COMMAND_IRB comme indiqué ci-dessous.

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;

Spécifications

En-têtes: Déclaré dans avc.h. Incluez avc.h.

entrée AVC_COMMAND_IRB

Commun
Le sous-membre Function de ce membre doit être défini sur AVC_FUNCTION_GET_REQUEST à partir de l’énumération AVC_FUNCTION.

Sous-unitéAddrFlag
Utilisé uniquement lors de l’inscription pour recevoir des commandes d’unité. Définissez cette valeur sur 1 et fournissez une adresse d’unité dans le paramètre SubunitAddr . Notez que pour les demandes de sous-unités, une fois terminée, cette valeur est définie sur 1, et que le paramètre SubunitAddr pointe vers la mémoire contenant l’adresse de sous-unité pour cette sous-unité virtuelle instance. L’appelant peut accéder à cette mémoire non pagée, mais ne doit pas tenter de la libérer.

AlternateOpcodesFlag
Utilisé uniquement lors de l’inscription pour recevoir des commandes d’unité. Définissez cette valeur sur 1 et fournissez une liste d’opcodes pris en charge par l’appelant dans le paramètre AlternateOpcodes .

TimeoutFlag
Ignoré.

RetryFlag
Ignoré.

CommandType
Ignoré dans l’entrée. Lors de la sortie, le membre CommandType est défini sur l’une des valeurs de l’énumération AvcCommandType .

ResponseCode
Ignoré pour les demandes.

Sous-unitéAddr
Utilisé uniquement lors de l’inscription pour recevoir des commandes d’unité. Définissez cette valeur sur l’adresse de la mémoire non paginé contenant l’adresse d’unité encodée conformément à la section 5.3.3 de la spécification générale de l’ensemble de commandes d’interface numérique AV/C av/C de l’association commerciale 1394, Rev 3.0 (0xff). Notez que pour les demandes de sous-unité, une fois terminée, cela pointe vers la mémoire contenant l’adresse de sous-unité pour cette sous-unité virtuelle instance. L’appelant peut accéder à cette mémoire non pagée, mais ne doit pas tenter de la libérer.

AlternateOpcodes
Utilisé uniquement lors de l’inscription pour recevoir des commandes d’unité. Définissez cette valeur sur l’adresse de la mémoire non paginé contenant la liste des opcodes d’unités pris en charge par l’appelant. Le premier octet de la liste d’opcodes correspond au nombre d’opcodes à suivre (équivalent au nombre d’octets). La longueur totale de la mémoire contenant la liste d’opcodes alternatifs est AlternateOpcodes[0]+1.

Délai d'expiration
Ignoré.

Nouvelle tentatives
Ignoré.

Opcode
Ignoré lors de la saisie. En sortie, il contient un opcode d’unité AV/C. Il s’agit de l’un des opcodes spécifiés via AlternateOpcodes.

OperandLength
Ignoré lors de la saisie. Sur la sortie, cette valeur est définie sur le nombre d’octets dans la liste d’opérandes utilisée par la requête.

Opérandes
Ignoré lors de la saisie. Dans la sortie, ce paramètre contient la liste des opérandes de la requête.

NodeAddress
Ignoré lors de la saisie. Sur la sortie, cette valeur est définie sur l’adresse de nœud de la source de la requête. Ce paramètre est utilisé lors de l’envoi de la réponse (pour plus d’informations, voir AVC_FUNCTION_SEND_RESPONSE).

Generation
Ignoré lors de la saisie. Sur la sortie, ce paramètre est défini sur le nombre de génération en vigueur lorsque l’adresse de nœud a été considérée comme valide. Ce paramètre est utilisé lors de l’envoi de la réponse (pour plus d’informations, voir AVC_FUNCTION_SEND_RESPONSE).

Dans le contexte de l’interface d’appareil GUID_AVC_CLASS, le code de fonction AVC_FUNCTION_GET_REQUEST est utilisé pour s’inscrire pour recevoir uniquement des demandes d’unité AV/C (pas des demandes de sous-unités). Cette fonction est généralement utilisée par un pilote de filtre supérieur (du avc.sys FDO) pour prendre en charge les fonctionnalités d’appareil homologue (autrement dit, pour gérer les demandes d’unité de l’appareil cible à partir de la pile non virtuelle). Bien que rien n’empêche les pilotes de sous-unités de s’inscrire pour gérer les demandes d’unité, les instances de pilotes de sous-unité qui s’inscrivent pour prendre en charge les mêmes opcodes d’unité doivent coopérer entre elles pour partager des informations d’état. Avc.sys ne prend pas directement en charge plusieurs inscriptions pour les mêmes opcodes unitaires.

Cette fonction utilise la structure AVC_COMMAND_IRB. Cette structure définit les composants communs d’une demande de commande AV/C. Les seuls paramètres d’entrée valides sont SubunitAddrFlag, AlternateOpcodesFlag, AlternateOpcodes et SubunitAddr, et tous sont obligatoires. Les alternateOpcodes doivent pointer vers une mémoire tampon contenant la liste des opcodes d’unités pris en charge par l’appelant. La sous-unitéAddr doit pointer vers une mémoire tampon contenant une adresse d’unité (0xff).

Dans le cas d’instances virtuelles de avc.sys (c’est-à-dire des instances qui inscrivent l’interface d’appareil GUID_VIRTUAL_AVC_CLASS), AVC_FUNCTION_GET_REQUEST est utilisé pour s’inscrire pour recevoir des demandes d’unités et de sous-unités AV/C. Les pilotes de filtre supérieur (du avc.sys FDO virtuel) s’inscrivent généralement pour gérer les demandes d’unité, tandis que les pilotes de sous-unités s’inscrivent pour gérer les demandes pour leur type particulier de sous-unité. Bien que rien n’empêche les pilotes de sous-unités de s’inscrire pour gérer les demandes d’unité, les instances de pilotes de sous-unité qui s’inscrivent pour prendre en charge les mêmes opcodes d’unité doivent coopérer entre elles pour partager des informations d’état. Avc.sys ne prend pas directement en charge plusieurs inscriptions pour les mêmes opcodes unitaires.

Les pilotes de sous-unité ne définissent aucun paramètre d’entrée lors de l’inscription pour recevoir des demandes spécifiques à une sous-unité.

Cette fonction retourne toujours STATUS_PENDING, de sorte que tout traitement doit être effectué dans une routine d’achèvement. À l’achèvement, la structure AVC_COMMAND_IRB contient l’opcode et les opérandes d’une requête. Le protocole AV/C nécessite qu’une réponse soit envoyée dans un délai de 100 ms. Cette opération peut être effectuée à partir de la routine d’achèvement à l’aide de la fonction AVC_FUNCTION_SEND_RESPONSE .

Si la première réponse utilise le code de réponse AVC_RESPONSE_INTERIM (à partir de l’énumération AvcResponseType ), le traitement du suivi est attendu. Les membres NodeAddress et Generation , obtenus par l’achèvement de la fonction d’origine AVC_FUNCTION_GET_REQUEST , doivent être utilisés dans les réponses suivantes. Dans tous les cas, la fonction AVC_FUNCTION_GET_REQUEST suivante doit être envoyée avant de retourner à partir de la routine d’achèvement AVC_FUNCTION_SEND_RESPONSE initiale, afin que la demande d’unité suivante puisse être reçue.

L’utilisation recommandée de cette structure est de commencer par zéro la structure (utilisez RtlZeroMemory) avant de remplir les paramètres.

Ce code de fonction peut être appelé dans IRQL <= DISPATCH_LEVEL.

Voir aussi

AVC_FUNCTION_SEND_RESPONSE

AvcResponseCode

AVC_FUNCTION

RtlZeroMemory