Compartir a través de


AVC_FUNCTION_GET_REQUEST

El código de función AVC_FUNCTION_GET_REQUEST se usa para registrarse para recibir solicitudes de unidad AV/C y subunit.

Bloque de estado de entrada/salida

Esta función siempre establece Irp-IoStatus.Status> en STATUS_PENDING.

Comentarios

Esta función usa la estructura AVC_COMMAND_IRB, como se muestra a continuación.

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

Encabezados: Declarado en avc.h. Incluya avc.h.

entrada de AVC_COMMAND_IRB

Común
El submembrado Function de este miembro debe establecerse en AVC_FUNCTION_GET_REQUEST de la enumeración AVC_FUNCTION.

SubunitAddrFlag
Se usa solo al registrarse para recibir comandos de unidad. Establézcalo en 1 y proporcione una dirección de unidad en el parámetro SubunitAddr . Tenga en cuenta que, para las solicitudes de subunit, al finalizar, se establece en 1 y el parámetro SubunitAddr apunta a la memoria que contiene la dirección de subbúnit para esta instancia de subunidad virtual. El autor de la llamada puede tener acceso a esta memoria no paginada, pero no debe intentar liberarla.

AlternateOpcodesFlag
Se usa solo al registrarse para recibir comandos de unidad. Establézcalo en 1 y proporcione una lista de códigos de operación admitidos por el autor de la llamada en el parámetro AlternateOpcodes .

TimeoutFlag
ignorado.

RetryFlag
ignorado.

CommandType
Se omite en la entrada. En la salida, el miembro CommandType se establece en uno de los valores de la enumeración AvcCommandType .

ResponseCode
Se omite para las solicitudes.

SubunitAddr
Se usa solo al registrarse para recibir comandos de unidad. Establézcalo en la dirección de la memoria no paginada que contiene la dirección unitaria codificada según la sección 5.3.3 de la especificación general del conjunto de comandos de la asociación comercial AV/C digital interface av/C, Rev 3.0 (0xff). Tenga en cuenta que, en el caso de las solicitudes de subunit, al finalizar, se apunta a la memoria que contiene la dirección de la subunidad de esta instancia de subbúnit virtual. El autor de la llamada puede tener acceso a esta memoria no paginada, pero no debe intentar liberarla.

AlternateOpcodes
Se usa solo al registrarse para recibir comandos de unidad. Establézcalo en la dirección de memoria no paginada que contiene la lista de códigos de operación de unidad admitidos por el autor de la llamada. El primer byte de la lista de códigos de operación es el recuento de códigos de operación que se van a seguir (equivalente al número de bytes). La longitud total de la memoria que contiene la lista de códigos de operación alternativo es AlternateOpcodes[0]+1.

Tiempo de espera
ignorado.

Reintentos
ignorado.

Código de operación
Se omite en la entrada. En la salida, contiene un código de operación de unidad av/C. Se trata de uno de los códigos de operación especificados mediante AlternateOpcodes.

OperandoLength
Se omite en la entrada. En la salida, se establece en el número de bytes de la lista de operandos que usa la solicitud.

Operandos
Se omite en la entrada. En la salida, este parámetro contiene la lista de operandos de la solicitud.

NodeAddress
Se omite en la entrada. En la salida, se establece en la dirección del nodo del origen de la solicitud. Este parámetro se usa al enviar la respuesta (para obtener más información, vea AVC_FUNCTION_SEND_RESPONSE).

Generación
Se omite en la entrada. En la salida, se establece en el recuento de generación en vigor cuando la dirección del nodo se considera válida. Este parámetro se usa al enviar la respuesta (para obtener más información, vea AVC_FUNCTION_SEND_RESPONSE).

En el contexto de la interfaz de dispositivo de GUID_AVC_CLASS, el código de función AVC_FUNCTION_GET_REQUEST se usa para registrarse para recibir solo solicitudes de unidad de AV/C (no solicitudes de subunidad). Por lo general, esta función la usa un controlador de filtro superior (del avc.sys FDO) para admitir la funcionalidad del dispositivo del mismo nivel (es decir, para controlar las solicitudes de unidad del dispositivo de destino desde la pila no virtual). Aunque nada impide que los controladores de subunidad se registren para controlar las solicitudes de unidad, las instancias de controlador de subunidad que se registren para admitir los mismos códigos de operación de unidad deben cooperar entre sí para compartir información de estado. Avc.sys no admite directamente varios registros para los mismos códigos de operación de unidad.

Esta función usa la estructura AVC_COMMAND_IRB. Esta estructura define los componentes comunes de una solicitud de comando de AV/C. Los únicos parámetros de entrada válidos son SubunitAddrFlag, AlternateOpcodesFlag, AlternateOpcodes y SubunitAddr, y todos son necesarios. AlternateOpcodes debe apuntar a un búfer que contenga la lista de códigos de operación de unidad admitidos por el autor de la llamada. SubunitAddr debe apuntar a un búfer que contenga una dirección de unidad (0xff).

En el caso de instancias virtuales de avc.sys (es decir, instancias que registran la interfaz de dispositivo GUID_VIRTUAL_AVC_CLASS) AVC_FUNCTION_GET_REQUEST se usa para registrarse para recibir solicitudes de unidad AV/C y subunit. Normalmente, los controladores de filtro superior (del avc.sys FDO virtual) se registran para controlar las solicitudes de unidad, mientras que los controladores de subbús se registran para controlar las solicitudes de su tipo concreto de subunidad. Aunque nada impide que los controladores de subunidad se registren para controlar las solicitudes de unidad, las instancias de controlador de subunidad que se registren para admitir los mismos códigos de operación de unidad deben cooperar entre sí para compartir información de estado. Avc.sys no admite directamente varios registros para los mismos códigos de operación de unidad.

Los controladores de subunit no establecen ningún parámetro de entrada al registrarse para recibir solicitudes específicas de la subbúnit.

Esta función siempre devuelve STATUS_PENDING, por lo que cualquier procesamiento debe realizarse en una rutina de finalización. Al finalizar, la estructura AVC_COMMAND_IRB contiene el código de operación y los operandos de una solicitud. El protocolo AV/C requiere que se envíe una respuesta en 100 ms. Esto se puede hacer a partir de la rutina de finalización mediante la función AVC_FUNCTION_SEND_RESPONSE .

Si la primera respuesta usa el código de respuesta AVC_RESPONSE_INTERIM (de la enumeración AvcResponseType ), se espera el procesamiento de seguimiento. Los miembros NodeAddress y Generation , obtenidos mediante la finalización de la AVC_FUNCTION_GET_REQUEST función original, deben usarse en respuestas posteriores. En cualquier caso, se debe enviar la siguiente función de AVC_FUNCTION_GET_REQUEST antes de volver de la rutina de finalización de AVC_FUNCTION_SEND_RESPONSE inicial, de modo que se pueda recibir la siguiente solicitud de unidad.

El uso recomendado de esta estructura es primero cero la estructura (use RtlZeroMemory) antes de rellenar los parámetros.

Se puede llamar a este código de función en IRQL <= DISPATCH_LEVEL.

Consulte también

AVC_FUNCTION_SEND_RESPONSE

AvcResponseCode

AVC_FUNCTION

RtlZeroMemory